1

我正在尝试在 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 后,我立即得到预取中止,并且调试器无法访问任何内存。谁能看到我错过了什么?

4

1 回答 1

2

转换表必须在 16k 边界上对齐。尝试 0x14000 或 0x18000。

于 2014-04-28T21:53:44.067 回答