Я пишу свой эмулятор linux risc v на ржавчине.
Я натыкаюсь на инициализацию mmu.
OpenSBI работает нормально, печатает информацию и передает управление ядру linux. Но эмулятор падает, когда пытается прочитать следующую инструкцию после настройки satp ffffffe00000008c в arch/riscv/kernel/head.S:119. (Передача между SATP_MODE_BARE и SATP_MODE_SV39)
Схема памяти эмулятора:
0x80000000 (2M) - opensbi image
0x80200000 (64M) - linux image
0x100000000 (1k) - device tree binary
Early_pg_dir:
Root page: 0000000000080a04
MMU Mappings:
Virtual Physical
0000000040000000 -> 0000000082200000 (2M) // probably dtb
ffffffe000000000 -> 0000000080200000 (2M)
ffffffe000200000 -> 0000000080400000 (2M)
ffffffe000400000 -> 0000000080600000 (2M)
ffffffe000600000 -> 0000000080800000 (2M)
ffffffe000800000 -> 0000000080a00000 (2M)
ffffffe000a00000 -> 0000000080c00000 (2M)
ffffffe000c00000 -> 0000000080e00000 (2M)
ffffffe000e00000 -> 0000000081000000 (2M)
батут_pg_dir:
Root page: 00000000000810be
MMU Mappings:
Virtual Physical
ffffffe000000000 -> 0000000080200000 (2M)
Я попытался отладить эту проблему с помощью пошагового выполнения в gdb с помощью qemu, но он также дает сбой и сгорает при изменении режима адреса. Если я правильно понимаю: система не может переключить режим адресации без сопоставления идентификаторов или специального обработчика ошибок страниц.
Итак, trampoline_pg_dir должен отображать идентификаторы?