如何从linux用户空间执行数据缓存刷新/无效

时间:2015-12-16 07:17:37

标签: c linux caching gcc arm

尝试在linux用户空间中使用可缓存的映射缓冲区。加速器将访问这些缓冲区。 在ARMv7-A架构中,是否有可能从linux用户空间显式刷新/无效数据缓存?

尝试了__clear_cache(),它没有用。根据URL https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html,我的理解是它只刷新指令缓存。

用户空间应用程序在用户模式下运行,我们是否需要为缓存操作设置任何特权模式权限。

更多信息会有所帮助。

1 个答案:

答案 0 :(得分:0)

如果不编写内核驱动程序(例如允许您执行 {{ 1}} 或 ioctl 操作会导致驱动程序为您希望刷新的 RAM 区域调用内核 API sysfs

arch_sync_dma_for_device

对于 #include <linux/dma-noncoherent.h> 的函数原型。

因此,除非您的项目后勤允许您向系统添加内核模块或重建和替换内核,否则您无法从用户空间应用程序刷新处理器缓存。对于在现场有产品的遗留项目,或者内核版本被数字签名锁定的项目,物流通常不支持这种侵入性的解决方案。

我已经成功地演示了这样一个 misc 驱动程序,它可以为新产品设计刷新 IPQ ARMv8a 实现上的处理器缓存。驱动程序花了我大约两个小时来编写和测试。