我正试图在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)设置为全1(这将禁用所有域的权限检查):
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启用后,我立即得到预取中止,调试器无法访问任何内存。有人能看到我缺了什么吗?
转换表必须在16k边界上对齐。尝试0x14000或0x18000。