如何从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缓存,但是当我研究各种体系结构时,这也应该是无关紧要的,因为我正在寻找绕过特定内存位置的所有缓存的一般机制。
答案 0 :(得分:0)
来自用户空间 - 没有。来自malloc()的内存来自堆。
通过内核模块,可能是的。可以使用例如MMU将MMU设置为存储器页面。 dma_alloc_coherent(),然后可供用户空间使用,请参阅LDD3 15.2.7. Remapping Kernel Virtual Addresses。但是,这可能比你想要的更麻烦。