Карта памяти Grub в ядре старшей половины x86

Я пишу 32-битное ядро ​​​​старшей половины, загруженное по виртуальному адресу 0xC0000000 (3GByte), и я использую структуру 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));
}

person rithvikp    schedule 25.02.2017    source источник


Ответы (1)


Отвечая на мой собственный вопрос:

Теперь я чувствую себя глупо, потому что ответ довольно прост, и я понял свою ошибку. Когда я перемещал свое ядро ​​​​в более высокую половину, я сделал две таблицы страниц. Один, этот идентификатор сопоставляет первые 4 МБ, а другой сопоставляет первые 4 МБ (физические) с 3 ГБ (виртуальными). Но после того, как сопоставление выполнено, я отключаю первые 4 МБ и, таким образом, создаю проблему с доступом к карте памяти Grub.

person rithvikp    schedule 17.04.2017