c - 如何绕过 ARM 机器上的缓存

标签 c memory compiler-construction arm cpu-cache

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

这是一个例子:

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

*ptr = 0xFFFF;

我可以使 ptr 不被缓存以避免缓存污染吗?我在 ARMv7 架构上以系统调用仿真模式(非常有限的操作系统支持)运行。

更新:

解决以下一些评论:

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

gem5 can simulate a complete system with devices and an operating system in full system mode (FS mode), or user space only programs where system services are provided directly by the simulator in syscall emulation mode (SE mode).

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

最佳答案

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

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

关于c - 如何绕过 ARM 机器上的缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24023772/

相关文章:

c++ - 实际从堆中为一个对象分配了多少内存?

java - PHP页面可以编译运行Java代码吗

C malloc 函数的大小参数

C 程序未打印出正确的输出

c++ - 蹩脚的 wav 到数组,然后用 c/c++ 返回 wav

Memory Hierarchy - 为什么寄存器很贵?

C++11 共享指针 vector 和内存泄漏

C 编译器问题,多个路径定义/链接

c++ - iphone 编译器继承了模板化基类,传递类型没有及时扩展(看看)

python - 将 numpy 加载到 IronPython 中