从ARMv7上的用户模式刷新缓存行(rpi2)

时间:2016-05-19 19:12:12

标签: caching assembly arm raspberry-pi2

我使用以下代码刷新覆盆子pi 2上的缓存行:

clflush

我遇到一个错误,当我运行它时,这是一个特权指令。这段代码是否正确?有没有办法从这台机器上的用户空间刷新缓存行?在x86上{{1}}无需任何修改即可使用。

1 个答案:

答案 0 :(得分:4)

  

这段代码是否正确?

事实上,没有。这是一些虚假的不存在的系统寄存器编码 - 缓存维护操作存在于c7空间,而不是c12。

但更不正确的是假设你可以这样做。在ARMv8之前,所有缓存维护操作只能在特权模式下执行。从用户空间,您需要操作系统的支持才能请求它;例如,Linux有一个特定于ARM的系统调用,GCC为通过__clear_cache() - there might be some permission-related caveats提供了一个接口,虽然我在the current mainline kernel code中没有看到对VMA权限的任何引用,所以也许这是一个老核心的怪癖。

无论哪种方式,真正适用于用户空间代码的唯一缓存维护问题是指令和数据缓存之间的一致性,以满足JIT或自修改代码。像主存储器的数据缓存一致性这样的事情永远不应该与用户空间代码相关(在这种事情确实重要的情况下通常会调用操作系统内的驱动程序代码),并且在许多系统上需要单独的外部缓存维护,只有操作系统是无论如何都要管理。