2017-02-25 2 views
1

Ich schreibe einen höheren 32-Bit-Kernel geladen bei 0xC0000000 (3GByte) virtuellen Adresse und ich benutze Multiboot_info-Struktur, um die physische Speicherabbild zu erhalten. Wenn ich # 1 verwende, ist die erste mmap_addr, die ich bekomme, 0x9000, aber ich bin nicht in der Lage, die Adresse mit gdb zu untersuchen. Durch Hit und Trail schrieb ich # 2 und es funktioniert perfekt. Darf ich wissen, ob das, was ich getan habe, richtig war? Und wie genau ist es richtig? Vielen Dank.Grub Speicherabbild in höherer Hälfte x86 Kernel

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

Antwort

0

meine eigene Frage zu beantworten:

ich dumm fühle mich jetzt für die Antwort ist ziemlich einfach und ich meinen Fehler erkennen. Als ich meinen Kernel auf die höhere Hälfte verschoben habe, habe ich zwei Seitentabellen erstellt. Eine, diese Identität bildet die ersten 4 MB ab und eine, die die ersten 4 MB (physikalisch) auf 3 GB (virtuell) abbildet. Aber nachdem das Mapping fertig ist, mappe ich die ersten 4MB und verursache damit ein Problem beim Zugriff auf die Grub Memory Map.