【发布时间】:2014-06-03 19:52:35
【问题描述】:
如何绕过所有从 ARM 用户空间访问某个内存位置的缓存?
这是一个例子:
uint16_t* ptr = (uint16_t*) malloc(MEM_SIZE * sizeof(uint16_t));
*ptr = 0xFFFF;
我可以使 ptr 不被缓存以避免缓存污染吗?我在 ARMv7 架构上以系统调用仿真模式(非常有限的操作系统支持)运行。
更新:
解决下面的一些 cmets:
我在 gem5 模拟器 (http://www.gem5.org/) 上以 Syscall Emulation 模式运行此代码,简而言之如下:
gem5 可以模拟一个带有设备和操作的完整系统 系统处于完整系统模式(FS 模式),或仅用户空间程序 其中系统服务由模拟器直接提供 系统调用仿真模式(SE 模式)。
SE 模式正在使用 MMU。我目前在 ARM Cortex-A9 之后建模,但我假设是否有办法解决这个问题,它应该取决于 ISA 而不是处理器实现?我正在使用 L1/L2 缓存,但是当我正在研究各种架构时,这也应该是无关紧要的,因为我正在寻找一种绕过特定内存位置的所有缓存的通用机制。
【问题讨论】:
-
@artlessnoise 感谢您的评论。我没有包括这些细节,因为我认为它们不会以任何方式影响答案。我不确定 PSMA 是什么,但我将在编辑我的问题时解决您的所有其他问题。见上文。
-
ARM 的缓存刷新最终是处理器相关的。它是通过 CP15 寄存器完成的,这对于 Cortex-A 和 Cortex-M 是不同的,甚至在 Cortex-A CPU 之间也存在很小的差异。同样,MMU 表可能会将特定条目标记为不可缓存。最有可能的是,可以在 GEM5 源代码中找到答案。模拟 CP15 寄存器可能没有意义。 Linux armv7 cache code 在
v7_flush_dcache_all中有示例,其中mcr/mrc指令操作CP15;每个模型的值不同。 -
@artlessnoise 谢谢!您能否详细说明 CP15 与将页面标记为不可缓存的关系?
-
这是两种不同的机制。 CP15 是缓存刷新/无效操作。如果数据在缓存中,则清空。另一种机制是用 MMU 标记内存永远不会被缓存(然后你永远不必刷新)。我的要点是真正的 ARM 可能与 Gem5 系统仿真模式有很大不同。
-
@artlessnoise 谢谢!是的,所以对于我正在做的刷新缓存将不起作用。但是在 MMU 中标记页面听起来要好得多。我想我的问题是在真正的 ARM 平台上是否有合适的方法来做到这一点?比如什么是指令序列,或者是从 MMU 或操作系统请求未缓存内存位置的函数调用?
标签: c memory compiler-construction arm cpu-cache