在 ARM Cortex-R4F 上,当我使用 SCTLR 寄存器位 I 和 C 禁用指令和数据缓存时,将区域属性定义为可缓存(回写)的 MPU 区域会发生什么情况?它会因为全局缓存被禁用而被忽略还是会导致未知行为?
最佳答案
在 ARMv7-A/R 架构下,SCTLR C 和 I 位是否影响启用的 MMU/MPU 生成的属性实际上是实现定义的。但是,从 default memory map attributes in the Cortex-R4 TRM 的描述来看,它看起来属于“按预期运行”的阵营,其中 SCTLR.C = 0 表示对任何普通内存区域的访问都是不可缓存的。
即使情况并非如此,替代方案也只是该位无效,并且使用 MMU/MPU 属性。幸运的是,这里没有完全不可预测的行为。
也就是说,要考虑的更毛茸茸的方面是,虽然保证不可缓存的访问不会在缓存中分配,但如果该位置的有效条目是否仍然可以命中,则由实现定义恰好在场。因此,如果您在进行任何可缓存访问后关闭缓存,您将希望在继续之前立即清理并使整个内容无效 - 我不确定该实现选择 Cortex-R4 落在哪一边,但无论哪种方式我不会冒险不这样做。
关于ARM Cortex-R4F、缓存和 MPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35874533/