我正在尝试在ARM Cortex-A9(在QEMU中)上启用MMU。我所有的代码和数据都在内存的第一个MB内,因此我认为单个L1“节”条目应足以设置一个覆盖我所需的所有内存的身份映射。这是我要执行的步骤:
在0x16000
具有值的地址处创建一个L1条目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)设置为全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。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句