ARM-域访问控制寄存器



我想知道,为什么我们总是要禁用位于协处理器寄存器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>。在r1mvn r1, #0值等于0xFFFFFFFF之后。

您遇到的启动代码可能不需要内存保护,或者暂时关闭它只是为了稍后启用它。尽管如此,并不是任何一种规则都应该始终启用对所有域的完全访问。

最新更新