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