0 参考资料
ARM Cortex-A(armV7)编程手册V4.0.pdf
1 Cortex-A7:使能/失能内存管理单元(MMU)
1.1 使能MMU
在使能MMU前务必完成页表的配置,否则使能MMU可能会发生错误的虚拟地址到物理地址的转换操作,造成不可预料的错误。以下代码用于使能MMU:
MRC p15, 0, R1, c1, C0, 0 ;Read control register 读系统控制寄存器(SCTLR)
ORR R1, #0x1 ;Set M bit 将Mbit置1
MCR p15, 0,R1,C1, C0,0 ;Write control register and enable MMU 将R1值写入系统控制寄存器(SCTLR)以使能MMU
读、写系统控制寄存器(SCTLR)的示例如下:
系统控制寄存器(SCTLR)描述如下:
1.2 失能MMU
以下代码用于失能MMU:
MRC p15, 0, R1, c1, C0, 0 ;Read control register 读系统控制寄存器(SCTLR)
AND R1, #0xfffffffe ;Set M bit 将Mbit置0
MCR p15, 0,R1,C1, C0,0 ;Write control register and enable MMU 将R1值写入系统控制寄存器(SCTLR)以失能MMU
读、写系统控制寄存器(SCTLR)的示例如下:
系统控制寄存器(SCTLR)描述如下:
1.3 使能/失能MMU的注意事项
(1)在使能MMU之前一定要将页表创建好。
(2)如果虚拟地址和物理地址不是简单的直接映射关系(物理地址等于虚拟地址,PA=VA),在使能/失能MMU时,虚拟地址和物理地址对应关系会发生改变,这时一定要清除Cache中的当前地址变换条目。
(3)如果使能/失能MMU代码的物理地址和虚拟地址不是直接映射关系,在使能/失能MMU时需要进行特殊处理,会造成很大的麻烦。因此建议将使能/失能MMU的代码虚拟地址和物理地址设置一致。
(4)Cortex-A7失能MMU之后物理地址=虚拟地址。
(5)Cortex-A7在失能MMU情况下无论是否使能Cache,内存Cache和Write Buffer都将被禁用。