我正在尝试为80386处理器制作一个小内核,主要用于学习目的,并希望获得可用RAM的完整内存映射。
我已经读过,在GRUB的帮助下,直接查询BIOS是可能的,也是更好的。
有谁能告诉我该怎么做?
特别是,为了在实模式下使用bios功能,我们使用bios中断并在某些寄存器中获得所需的值,当我们想要使用GRUB提供的函数时,实际的等效方式是什么?
答案 0 :(得分:2)
这是我在内核中使用的过程(注意这是32位)。在我的bootstrap程序集文件中,我告诉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文件中定义。正如Andrew Medico在评论中发表的那样,here是开始使用此链接的绝佳链接。