2017-02-25 37 views
1

我正在寫一個裝載在0xC0000000(3GByte)虛擬地址的較高一半的32位內核,並且我使用multiboot_info結構來獲取物理內存映射。當我使用#1時,我得到的第一個mmap_addr是0x9000,但我無法使用gdb檢查地址。通過點擊和跟蹤,我寫了#2,它完美的作品。我可否知道我所做的是正確的?它究竟如何正確?謝謝。更高一半的x86內核Grub內存映射

#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)); 
} 

回答

0

回答我的問題:

我現在感覺傻傻的回答很簡單,我意識到我的錯誤。當我將內核移動到更高的一半時,我製作了兩個頁表。其一,該身份映射第一個4MB和映射第一個4MB(物理)到3GB(虛擬)的映射。但是在映射完成之後,我將第一個4MB映射爲未映射,從而導致訪問Grub內存映射的問題。