Memory 是否启用ARMv7 VMSA内存管理单元?

Memory 是否启用ARMv7 VMSA内存管理单元?,memory,arm,armv7,mmu,Memory,Arm,Armv7,Mmu,因此,基本上,我想在ARMv7内核上启用内存管理单元。实际的程序非常简单。我只需要将转换表的地址加载到TTBR0中,并使用控制寄存器启用MMU /* enable mmu */ mcr p15, 0, r0, c2, c0, 0 mrc p15, 0, r12, c1, c0, 0 orr r12, r12, #0x1 mcr p15, 0, r12, c1, c0, 0 现在,一旦启用MMU,问题就会出现,因为在ARMv7上(与其他版本的ARM体系结构不同),CPU立即开始从虚拟地址获取数据

因此,基本上,我想在ARMv7内核上启用内存管理单元。实际的程序非常简单。我只需要将转换表的地址加载到
TTBR0
中,并使用控制寄存器启用MMU

/* enable mmu */
mcr p15, 0, r0, c2, c0, 0
mrc p15, 0, r12, c1, c0, 0
orr r12, r12, #0x1
mcr p15, 0, r12, c1, c0, 0
现在,一旦启用MMU,问题就会出现,因为在ARMv7上(与其他版本的ARM体系结构不同),CPU立即开始从虚拟地址获取数据。因此,如果引导加载程序在
0x10000000
处运行,然后启用MMU,除非它首先输入标识映射,否则在
0x10000004
处的下一次提取将导致预取中止。现在,我知道,在初始启用MMU期间,可以使用身份映射来实现这一点。但是,切换转换表(将新值加载到
TTBR0
中)时也会出现同样的问题

因此,本质上,我正在寻找一种或多或少简单的方法,将新值加载到
TTBR0
(或只是打开MMU),然后,立即跳转到新地址,该地址将在新映射中有效。这在早期的体系结构上是可能的,因为启用MMU或更改状态的指令后面至少有4条指令是从旧地址获取的。理想情况下,我希望能够做到这一点,而不依赖于令人难以置信的丑陋的黑客攻击,即每次切换页表或打开MMU时都必须创建身份映射


为了澄清我在谈论旧体系结构时的意思,这里有一个指向ARM信息中心页面的链接,解释如何在ARM720T上打开MMU:

简单的回答是,没有办法完全按照您在ARMv7-a中的要求来做。 ARM720T的例子是一个极端特定于微体系结构的黑客攻击,永远无法保证在不同处理器之间可移植

对于ARMv7-A,没有不使用标识映射来打开/关闭MMU的可移植方法,但对于更新转换表: 您可以做的(在ARM720T中不可用)是使用TTBR1/TTBR0的组合来保存描述符。TTBCR中的N字段配置覆盖TTBR1表的TTBR0表的大小。这样,只要您的TTB切换代码位于通过不同于您正在更新的TTBR描述的区域,就不会有映射冲突


另一种选择是重写TTBR0描述的转换表,而不是切换。

我不知道为什么您会将标识映射描述为一种难看的黑客行为,它是启用MMU的体系结构指定的方法,非常容易实现。@VariableLengthCoder嗯,最初启用MMU并没有那么糟糕。但是在地图之间切换很烦人,因为它需要在每个地图中都有相同VA的页面。