这是我在内核中使用的进程(请注意,这是 32 位的)。在我的引导程序集文件中,我告诉 GRUB 为我提供内存映射:
.set MEMINFO, 1 << 1 # Get memory map from GRUB
Run Code Online (Sandbox Code Playgroud)
然后,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);
}
}
Run Code Online (Sandbox Code Playgroud)
其中multiboot_info_t和multiboot_memory_map_t的定义如 Gnu multiboot.h 文件中所示。正如 Andrew Medico 在评论中发布的那样,这里有一个很好的入门链接。
| 归档时间: |
|
| 查看次数: |
383 次 |
| 最近记录: |