我正试图在手臂上启用MMU -A9(在QEMU中)。我所有的代码和数据都在内存的第一个MB中,所以我相信一个L1“节”条目就足以建立一个覆盖我所需要的所有内存的标识映射。下面是我要走的步骤:
在address 0x16000上创建一个带有0x00000c02值的0x00000c02条目( 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启用后,我立即得到一个预取中止,调试器无法访问任何内存。有人能看到我错过了什么吗?
发布于 2014-04-28 21:53:44
翻译表必须在16k的边界上对齐。试试0x14000或0x18000。
https://stackoverflow.com/questions/23328471
复制相似问题