簡體   English   中英

Grub內存映射在更高的一半x86內核中

[英]Grub memory map in higher half x86 kernel

我正在寫一個在0xC0000000(3GByte)虛擬地址加載的高半部分32位內核,我使用multiboot_info結構來獲取物理內存映射。 當我使用#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內存映射時出現問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM