我想知道,为什么我们总是要禁用位于协处理器寄存器cp15 c3中的域访问控制寄存器中的所有域。这通常是在启动代码中使用MCR指令通过如下方式完成的。
MVN r1, #0
MCR p15, 0, r1, c3, c0, 0
为什么我们要将所有零加载到c3中以禁用所有域?
您当然不必在域访问控制寄存器中禁用域。实际上,这甚至是不可能的,因为如果启用了MMU,域访问总是被检查的。通过将值加载到DACR,您真正要做的是设置域的访问权限。您发布链接的页面准确描述了DACS中位的含义。一般情况下:
- 00-根本无法访问
- 01-根据TLB条目中的值检查访问权限
- 11-始终允许访问
这意味着将0xFFFFFFFF写入DACR将关闭内存保护。这正是您发布的代码所做的。注意指令mvn
,它与mov
有所不同。mvn <Rd>, <Rm>
是"移动NOT"指令,它将<Rm>
的补码写入<Rd>
。在r1
的mvn r1, #0
值等于0xFFFFFFFF之后。
您遇到的启动代码可能不需要内存保护,或者暂时关闭它只是为了稍后启用它。尽管如此,并不是任何一种规则都应该始终启用对所有域的完全访问。