Как запросить BIOS с помощью GRUB?

Я пытаюсь сделать небольшое ядро ​​​​для процессора 80386 в основном для целей обучения и хочу получить полную карту памяти доступной оперативной памяти.

Я читал, что это возможно и лучше сделать с помощью GRUB, чем напрямую запрашивать BIOS.

Кто-нибудь может сказать мне, как мне это сделать?

В частности, для использования функций BIOS в реальном режиме мы используем прерывания BIOS и получаем желаемые значения в некоторых регистрах. Каков реальный эквивалентный способ, когда мы хотим использовать функции, предоставляемые GRUB?


person Pratik Singhal    schedule 31.10.2014    source источник
comment
См. wiki.osdev.org/Detecting_Memory_%28x86%29#Memory_Map_Via_GRUB и < a href="http://www.gnu.org/software/grub/manual/multiboot/multiboot.html" rel="nofollow noreferrer">gnu.org/software/grub/manual/multiboot/multiboot.html   -  person nobody    schedule 31.10.2014


Ответы (1)


Вот процесс, который я использую в своем ядре (обратите внимание, что он 32-битный). В моем файле сборки начальной загрузки я говорю GRUB предоставить мне карту памяти:

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

Затем GRUB загружает адрес мультизагрузочной информационной структуры в ebx для вас (эта структура содержит адрес карты памяти). Затем я вызываю код C, чтобы выполнить фактическую итерацию и обработку карты памяти. Я делаю что-то вроде этого, чтобы перебирать карту:

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

где multiboot_info_t и multiboot_memory_map_t определены как в файле multiboot.h Gnu. Как написал Эндрю Медико в комментариях, вот отличная ссылка для начала работы с это.

person Joel    schedule 31.10.2014