如何绕过ARM计算机上的缓存

时间:2014-06-03 19:52:35

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

如何从ARM上的用户空间绕过所有访问某个内存位置的缓存?

以下是一个例子:

uint16_t * ptr =(uint16_t *)malloc(MEM_SIZE * sizeof(uint16_t));

* ptr = 0xFFFF;

我可以将ptr设为未缓存以避免缓存污染吗?我在ARMv7架构上运行Syscall Emulation模式(非常有限的OS支持)。

更新:

解决以下一些评论:

我在Syscall Emulation模式下在gem5模拟器(http://www.gem5.org/)上运行此代码,简述如下:

  

gem5可以模拟具有设备和操作的完整系统   系统处于完整系统模式(FS模式)或仅用户空间程序   其中系统服务由模拟器直接提供   系统调用仿真模式(SE模式)。

SE模式正在使用MMU。我目前正在ARM Cortex-A9之后进行建模,但我假设如果有办法解决这个问题它应该依赖ISA而不依赖于处理器实现?我正在使用L1 / L2缓存,但是当我研究各种体系结构时,这也应该是无关紧要的,因为我正在寻找绕过特定内存位置的所有缓存的一般机制。

1 个答案:

答案 0 :(得分:0)

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

通过内核模块,可能是的。可以使用例如MMU将MMU设置为存储器页面。 dma_alloc_coherent(),然后可供用户空间使用,请参阅LDD3 15.2.7. Remapping Kernel Virtual Addresses。但是,这可能比你想要的更麻烦。