Инициализация MMU в Linux

Я пишу свой эмулятор 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 должен отображать идентификаторы?


person jdr    schedule 13.03.2021    source источник


Ответы (1)


u/stepinfusion на Reddit

Если мы читаем одну и ту же версию head.S, мне кажется, что инструкция в ...008c — это head.S:97, когда satp изменяется впервые. head.S:119 — инструкция ret в ...00ac.

Я не очень хорошо знаю этот код, но похоже, что он должен прерываться в head.S:97, а stvec указывает на виртуальный адрес следующей инструкции. Это интересный способ переключиться с работы в физическом пространстве на виртуальное пространство без сопоставления идентификаторов.

person jdr    schedule 15.03.2021