如何使用GRUB查询BIOS?

5
我正在尝试制作一个针对80386处理器的小内核,主要是为了学习目的,并希望获得可用RAM的完整内存映射。
我已经阅读过,使用GRUB的帮助比直接查询BIOS可能更好地实现这一点。
有人能告诉我该如何做吗?
特别是,在实模式下使用BIOS功能时,我们使用BIOS中断并在某些寄存器中获取所需的值,那么当我们想要使用GRUB提供的函数时,实际上等效的方法是什么?

2
请参阅 http://wiki.osdev.org/Detecting_Memory_%28x86%29#Memory_Map_Via_GRUB 和 http://www.gnu.org/software/grub/manual/multiboot/multiboot.html,这些页面与 x86 内存检测和 GRUB 多引导协议有关。 - nobody
1个回答

2

以下是我在我的内核中使用的过程(请注意,这是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_tmultiboot_memory_map_t 的定义与 Gnu multiboot.h 文件中的相同。正如 Andrew Medico 在评论中提到的那样,这里 是一个很好的入门链接。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接