2014-10-31 13 views
5

Ich versuche, einen kleinen Kernel für 80386 Prozessor hauptsächlich für Lernzwecke zu machen und möchte die volle Speicherbelegung des verfügbaren RAM zu bekommen.Wie Abfrage BIOS mit GRUB?

Ich habe gelesen, dass es möglich und besser ist, dies mit Hilfe von GRUB zu tun, als direkt das BIOS abzufragen.

Kann mir jemand sagen, wie mache ich das?

Speziell für die Verwendung der BIOS-Funktionalität im Real-Modus verwenden wir Bios-Interrupts und erhalten die gewünschten Werte in einigen Registern, was ist der tatsächliche äquivalente Weg, wenn wir GRUB-Funktionen verwenden wollen?

+2

Siehe http://wiki.osdev.org/Detecting_Memory_%28x86%29#Memory_Map_Via_GRUB und http://www.gnu.org/software/grub/manual/multiboot/multiboot.html –

Antwort

2

Hier ist der Prozess, den ich in meinem Kernel verwende (beachten Sie, dass dies 32bit ist). In meiner Bootstrap-Assembly-Datei, sage ich GRäBT mich mit einer Speicherkarte zur Verfügung zu stellen:

.set MEMINFO, 1 << 1     # Get memory map from GRUB 

Dann GRäBT die Adresse der Multi-Boot-Infostruktur in ebx für Dich lädt (diese Struktur enthält die Adresse der Speicherkarte) . Dann rufe ich C-Code auf, um die tatsächliche Iteration und Verarbeitung der Speicherzuordnung zu behandeln. Ich mache so etwas wie dies über die Karte iterieren:

/* Macro to get next entry in memory map */ 

#define MMAP_NEXT(m) \ 
      (multiboot_memory_map_t*)((uint32_t)m + m->size + sizeof(uint32_t)) 

void read_mmap(multiboot_info_t* mbt){ 

    multiboot_memory_map_t* mmap = (multiboot_memory_map_t*) mbt->mmap_addr; 


    /* Iterate over memory map */ 

    while((uint32_t)mmap < mbt->mmap_addr + mbt->mmap_length) { 

     // process the current memory map entry 

     mmap = MMAP_NEXT(mmap); 
    } 
} 

wo multiboot_info_t und multiboot_memory_map_t wie in dem Gnu multiboot.h-Datei definiert werden. Wie Andrew Medico in den Kommentaren gepostet hat, ist here ein großartiger Link, um damit anzufangen.

Verwandte Themen