C-高级x86内核中的grub内存图



我正在编写一个较高的32位内核,该内核位于0xc0000000(3gbyte)虚拟地址,我正在使用Multiboot_info struct来获取物理内存映射。当我使用#1时,我得到的第一个MMAP_ADDR是0x9000,但我无法使用GDB检查地址。通过命中和踪迹,我写了#2,它运行得很好。我可以知道我所做的是否正确吗?这是如何正确的?谢谢。

#1
void get_mbmmap(void){
    memory_map_t* mmap = (memory_map_t*)(mbinfo_addr -> mmap_addr);
    while((uint32_t)mmap < mbinfo_addr->mmap_addr + mbinfo_addr->mmap_length)
        mmap = (memory_map_t*)((uint32_t)mmap + mmap->size + sizeof(mmap->size));}
#2
void get_mbmmap(void){
    memory_map_t* mmap = (memory_map_t*)(mbinfo_addr -> mmap_addr + 0xC0000000);
    while((uint32_t)mmap < mbinfo_addr->mmap_addr + 0xC0000000 + mbinfo_addr->mmap_length)
        mmap = (memory_map_t*)((uint32_t)mmap + mmap->size + sizeof(mmap->size));
}

回答我自己的问题:

我现在感到很愚蠢,因为答案很简单,我意识到自己的错误。当我将内核移至更高的半部分时,我制作了两页表。一个,该身份映射了第一个4MB,一个将第一个4MB(物理)映射到3GB(虚拟)。但是,在映射完成后,我将未映射第一个4MB,从而在访问grub内存映射时创建了一个问题。

相关内容

  • 没有找到相关文章

最新更新