1
Lowlevel-Coding / Re: Initialisieren der Bitmap will nicht
« am: 10. February 2010, 23:32 »
Oh danke, wieder was gelernt, der Tag war also nicht umsonst
23. November 2024, 12:58
Diese Sektion erlaubt es dir alle Beiträge dieses Mitglieds zu sehen. Beachte, dass du nur solche Beiträge sehen kannst, zu denen du auch Zugriffsrechte hast.
/* Scheint wohl nichts frei zu sein... */
return NULL;
also heißt das, dass er keinen freien Speicher gefunden hat, wenn ein NULL-Zeiger zurückgegeben wird (oder bedeutet NULL auch die Adresse 0x00?).
.section multiboot
#define MB_MAGIC 0x1badb002
#define MB_FLAGS 0x0
#define MB_CHECKSUM -(MB_MAGIC + MB_FLAGS)
// Der Multiboot-Header
.align 4
.int MB_MAGIC
.int MB_FLAGS
.int MB_CHECKSUM
.section .text
// Init ist eine Funktion aus init.c
.extern init
// _start muss global sein, damit der Linker es findet und als Einsprungspunkt
// benutzen kann (alle Labels, die nicht global sind, sind nur in dieser Datei
// sichtbar)
.global _start
_start:
// Stack initialisieren
mov $kernel_stack, %esp
// C-Code aufrufen und Multiboot-Infostruktur als Parameter uebergeben
push %ebx
call init
// Falls wir jemals aus init zurueckkommen sollten, gehen wir in eine
// Endlosschleife
jmp .
// 8 kB Stack fuer den Kernel. Das Label steht hinter dem freien Speicher,
// weil der Stack nach unten waechst
.section .bss
.space 8192
kernel_stack:
Warum konvertierst du denn...Wie gesagt es ist der original Quelltext aus dem Tutorial
kprintf("%d %d",(unsigned) mmap, (unsigned) mmap_end);
geschrieben.void pmm_init(struct multiboot_info* mb_info)
{
struct multiboot_mmap* mmap = mb_info->mbs_mmap_addr;
struct multiboot_mmap* mmap_end = (void*)
((uintptr_t) mb_info->mbs_mmap_addr + mb_info->mbs_mmap_length);
/* Per Default ist erst einmal alles reserviert */
memset(bitmap, 0, sizeof(bitmap));
/*
* Nur, was die BIOS-Memory-Map als frei bezeichnet, wird wieder als frei
* markiert
*/
while (mmap < mmap_end) {
if (mmap->type == 1) {
/* Der Speicherbereich ist frei, entsprechend markieren */
uintptr_t addr = mmap->base;
uintptr_t end_addr = addr + mmap->length;
while (addr < end_addr) {
pmm_free((void*) addr);
addr += 0x1000;
}
}
mmap++;
}
/* Den Kernel wieder als belegt kennzeichnen */
uintptr_t addr = (uintptr_t) &kernel_start;
while (addr < (uintptr_t) &kernel_end) {
pmm_mark_used((void*) addr);
addr += 0x1000;
}
}