2014-10-31 12 views
5

Próbuję zrobić małe jądro dla procesora 80386 głównie do celów edukacyjnych i chcę uzyskać pełną mapę pamięci dostępnej pamięci RAM.Jak zapytać o BIOS za pomocą GRUB?

Czytałem, że jest to możliwe i lepsze dzięki GRUBowi, niż bezpośrednie wysyłanie zapytań do BIOS-u.

Czy ktoś może mi powiedzieć, jak to zrobić?

Szczególnie w przypadku korzystania z funkcji biosu w trybie rzeczywistym używamy przerwań biosu i uzyskujemy pożądane wartości w niektórych rejestrach, jaki jest faktyczny równoważny sposób, gdy chcemy korzystać z funkcji dostarczanych przez GRUB?

+2

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

Odpowiedz

2

Oto proces, którego używam w moim jądrze (pamiętaj, że jest to 32-bitowy). W moim bootstrap pliku zespołu, mówię GRUB dostarczyć mi z mapą pamięci:

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

Następnie GRUB ładuje adres informacyjnym multiboot struktury w ebx dla Ciebie (struktura ta zawiera adres mapy pamięci) . Następnie wywołuję kod C, aby obsłużyć faktyczną iterację i przetwarzanie mapy pamięci. I zrobić coś takiego iteracyjne nad mapą:

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

gdzie multiboot_info_t i multiboot_memory_map_t są zdefiniowane jak w multiboot.h pliku GNU. Jak napisał Andrew Medico w komentarzach, here to świetny link do rozpoczęcia pracy z tym.

Powiązane problemy