2017-02-25 3 views
1

J'écris un noyau 32 bits plus haut chargé à l'adresse virtuelle 0xC0000000 (3GByte) et j'utilise la structure multiboot_info pour obtenir la mappe mémoire physique. Lorsque j'utilise # 1, le premier mmap_addr que j'obtiens est 0x9000 mais je ne suis pas capable d'examiner l'adresse en utilisant gdb. Par hit et trail, j'ai écrit # 2 et ça marche parfaitement. Puis-je savoir si ce que j'ai fait était correct? Et comment est-ce exact? Je vous remercie.Carte de mémoire Grub dans le noyau x86 supérieur

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

Répondre

0

répondre à ma propre question:

Je me sens stupide maintenant la réponse est assez simple et j'ai réalisé mon erreur. Quand je passais mon noyau à la moitié supérieure, j'ai fait deux tables de pages. Un, cette identité mappe le premier 4 Mo et un qui mappe le premier 4 Mo (physique) à 3 Go (virtuel). Mais une fois le mappage effectué, je désimagine les 4 premiers Mo et crée ainsi un problème d'accès à la carte mémoire Grub.