我正在尝试在 ARM Cortex-A9(在 QEMU 中)上启用 MMU。我所有的代码和数据都在内存的第一个 MB 内,所以我相信一个 L1“部分”条目应该足以建立一个覆盖我需要的所有内存的身份映射。这是我要执行的步骤:
在地址处创建一个0x16000
具有值0x00000c02
的 L1 条目(L1 条目格式的文档在ARM 体系结构参考手册B3.5 部分中 - 仅作为 PDF 提供,因此我无法直接链接)。L1 表中的所有其他条目都归零。
将 TTRB0 设置为0x16000
(我已检查 TTBCR.N 为 0):
ldr r0, =masterTranslationTable
mcr p15, 0, r0, c2, c0, 0
禁用 I 和 D 缓存,使 TLB 无效,将域访问控制寄存器 (DACR) 设置为全一(禁用所有域的权限检查):
MRC p15, 0, r1, c1, c0, 0
BIC r1, r1, #(0x1 << 12) @ Disable Instruction cache
BIC r1, r1, #(0x1 << 2) @ Disable Data cache
MCR p15, 0, r1, c1, c0, 0
mcr p15, 0, r1, c8, c7, 0 @ Invalidate TLB
mov r0, #0xffffffff
mcr p15, 0, r0, c3, c0, 0 @ Set DACR to all "manager" - no permissions checking
启用 MMU:
mrc p15, 0, r0, c1, c0, 0
orr r0, r0, #1
mcr p15, 0, r0, c1, c0, 0
但是在启用 MMU 后,我立即得到预取中止,并且调试器无法访问任何内存。谁能看到我错过了什么?