Я пытаюсь сделать небольшое ядро для процессора 80386 в основном для целей обучения и хочу получить полную карту памяти доступной оперативной памяти.
Я читал, что это возможно и лучше сделать с помощью GRUB, чем напрямую запрашивать BIOS.
Кто-нибудь может сказать мне, как мне это сделать?
В частности, для использования функциональности bios в реальном режиме мы используем прерывания bios и получаем желаемые значения в некоторых регистрах, каков фактический эквивалентный способ, когда мы хотим использовать функции, предоставляемые GRUB?
Вот процесс, который я использую в своем ядре (обратите внимание, что это 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. Как Эндрю Медико написал в комментариях, Вот это отличная ссылка для начала работы с этим.