2014-10-31 29 views
5

Sto cercando di creare un kernel piccolo per il processore 80386 principalmente per scopi didattici e desidero ottenere la mappa di memoria completa della RAM disponibile.Come interrogare il BIOS usando GRUB?

Ho letto che è possibile e meglio farlo con l'aiuto di GRUB che interrogando direttamente il BIOS.

Qualcuno può dirmi come lo faccio?

In particolare, per utilizzare la funzionalità del bios in modalità reale, utilizziamo gli interrupt di bios e otteniamo i valori desiderati in alcuni registri, qual è l'effettivo modo equivalente quando vogliamo utilizzare le funzioni fornite da GRUB?

+2

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

risposta

2

Ecco il processo che utilizzo nel mio kernel (notare che questo è a 32 bit). Nel mio file di assiemi bootstrap, dico GRUB di fornire me con una mappa di memoria:

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

Poi, GRUB carica l'indirizzo della struttura informazioni multiboot in ebx per voi (questa struttura contiene l'indirizzo della mappa di memoria) . Quindi chiamo in codice C per gestire l'iterazione e l'elaborazione effettive della mappa della memoria. Faccio qualcosa di simile per scorrere sopra la mappa:

/* 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); 
    } 
} 

dove multiboot_info_t e multiboot_memory_map_t sono definiti come nel file multiboot.h Gnu. Come ha scritto Andrew Medico nei commenti, here è un ottimo link per iniziare con questo.