尝试在linux用户空间中使用可缓存的映射缓冲区。加速器将访问这些缓冲区。 在ARMv7-A架构中,是否有可能从linux用户空间显式刷新/无效数据缓存?
尝试了__clear_cache(),它没有用。根据URL https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html,我的理解是它只刷新指令缓存。
用户空间应用程序在用户模式下运行,我们是否需要为缓存操作设置任何特权模式权限。
更多信息会有所帮助。
答案 0 :(得分:0)
如果不编写内核驱动程序(例如允许您执行 {{ 1}} 或 ioctl
操作会导致驱动程序为您希望刷新的 RAM 区域调用内核 API sysfs
。
见
arch_sync_dma_for_device
对于 #include <linux/dma-noncoherent.h>
的函数原型。
因此,除非您的项目后勤允许您向系统添加内核模块或重建和替换内核,否则您无法从用户空间应用程序刷新处理器缓存。对于在现场有产品的遗留项目,或者内核版本被数字签名锁定的项目,物流通常不支持这种侵入性的解决方案。
我已经成功地演示了这样一个 misc 驱动程序,它可以为新产品设计刷新 IPQ ARMv8a 实现上的处理器缓存。驱动程序花了我大约两个小时来编写和测试。