【问题标题】:How to query BIOS using GRUB?如何使用 GRUB 查询 BIOS?
【发布时间】:2014-12-28 00:09:15
【问题描述】:

我正在尝试为 80386 处理器制作一个小内核,主要用于学习目的,并希望获得可用 RAM 的完整内存映射。

我已经读到,在 GRUB 的帮助下这样做是可能的,而且比直接查询 BIOS 更好。

谁能告诉我该怎么做?

特别是,为了在实模式下使用 bios 功能,我们使用 bios 中断并在某些寄存器中获取所需的值,当我们想要使用 GRUB 提供的功能时,实际等效的方式是什么?

【问题讨论】:

标签: c++ c kernel bios grub


【解决方案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 在 Gnu multiboot.h 文件中定义。正如 Andrew Medico 在 cmets 中发布的那样,here 是一个很好的开始使用此链接的链接。

【讨论】:

    猜你喜欢
    • 2015-08-25
    • 2016-10-20
    • 2011-04-22
    • 2015-05-13
    • 2013-12-31
    • 2011-09-09
    • 2020-11-04
    • 1970-01-01
    • 2011-09-26
    相关资源
    最近更新 更多