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

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

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

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

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

5

Решение

Вот процесс, который я использую в своем ядре (обратите внимание, что это 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 определены как в файле Gnu multiboot.h. Как Эндрю Медико написал в комментариях, Вот это отличная ссылка для начала работы с этим.

2

Другие решения