【问题标题】:How to bypass caches on an ARM machine如何绕过 ARM 机器上的缓存
【发布时间】: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 codev7_flush_dcache_all 中有示例,其中mcr/mrc 指令操作CP15;每个模型的值不同。
  • @artlessnoise 谢谢!您能否详细说明 CP15 与将页面标记为不可缓存的关系?
  • 这是两种不同的机制。 CP15 是缓存刷新/无效操作。如果数据在缓存中,则清空。另一种机制是用 MMU 标记内存永远不会被缓存(然后你永远不必刷新)。我的要点是真正的 ARM 可能与 Gem5 系统仿真模式有很大不同。
  • @artlessnoise 谢谢!是的,所以对于我正在做的刷新缓存将不起作用。但是在 MMU 中标记页面听起来要好得多。我想我的问题是在真正的 ARM 平台上是否有合适的方法来做到这一点?比如什么是指令序列,或者是从 MMU 或操作系统请求未缓存内存位置的函数调用?

标签: c memory compiler-construction arm cpu-cache


【解决方案1】:

来自用户空间 - 不。 malloc() 的内存来自堆。

通过内核模块,可能是的。内存页面可以由 MMU 设置为未缓存,例如使用dma_alloc_coherent(),然后提供给用户空间,参见LDD3 15.2.7. Remapping Kernel Virtual Addresses。但是,这可能比您希望的更麻烦。

【讨论】:

  • 在 Syscall Emulation 模式下... 我不知道那是什么意思,但它不是 Linux。
  • 您认为可以将包含该原语的源代码链接到我的应用程序,以便用户代码可以运行 dma_alloc_coherent 吗?由于这都是模拟的,我假设模拟器对主管模式和/或保护不是超级严格。
猜你喜欢
  • 1970-01-01
  • 2021-10-23
  • 2010-09-26
  • 2010-10-19
  • 2010-10-14
  • 1970-01-01
  • 2018-08-01
  • 2021-01-29
  • 2011-10-27
相关资源
最近更新 更多