Jyo*_*lli 5 c linux gcc caching arm
尝试在 Linux 用户空间中使用可缓存的映射缓冲区。这些缓冲区将由加速器访问。在 ARMv7-A 架构中,是否有可能从 Linux 用户空间显式刷新/无效数据缓存?
尝试过__clear_cache(),但没有用。根据 URL https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html,我的理解是它仅刷新指令缓存。
用户空间应用程序运行在用户模式下,我们是否需要为缓存操作设置任何特权模式权限。
更多信息会有帮助。
ioctl如果不编写内核驱动程序(例如允许您执行或sysfs操作的简单杂项类驱动程序),则无法从用户空间(内核 <= 5.13.x)刷新 ARMv7-A/ARMv8-A 处理器缓存驱动程序arch_sync_dma_for_device为您想要刷新的 RAM 区域调用内核 API 。
看
#include <linux/dma-noncoherent.h>
Run Code Online (Sandbox Code Playgroud)
为 的函数原型arch_sync_dma_for_device。
因此,除非项目的逻辑允许您向系统添加内核模块或重建和替换内核,否则您无法从用户空间应用程序刷新处理器缓存。对于现场有产品的遗留项目,或者通过数字签名锁定内核版本的项目,物流通常不支持这种类型的侵入式解决方案。
我已经成功演示了这样一个杂项驱动程序,该驱动程序可以在新产品设计的 IPQ ARMv8a 实现上刷新处理器缓存。驱动程序花了我大约两个小时来编写和测试。