在 ARMv7(rpi2) 上从用户模式刷新缓存行
Flush a cache line from user mode on ARMv7(rpi2)
我正在使用以下代码刷新 raspberry pi 2 上的缓存行:
static inline void flush(void addr)
{
asm volatile("mcr p15, 0, %0, c7, c6, 1"::"r"(addr));
}
我在 运行 执行此操作时收到一条错误消息,提示这是一条特权指令。这段代码正确吗?有什么方法可以清除这台机器上用户 space 的缓存行吗?在 x86 上 clflush
无需任何修改即可工作。
Is this code correct?
事实上,没有。这是一些伪造的不存在的系统寄存器编码 - 缓存维护操作存在于 c7 space,而不是 c12.
但是,更不正确的是您可以做到这一点的假设。在ARMv8之前,all缓存维护操作只能在特权模式下执行。来自用户 space,您需要 OS 的支持才能请求它; Linux,例如,有一个特定于 ARM 的系统调用,GCC 通过 __clear_cache()
- there might be some permission-related caveats, although I don't see any reference to VMA permissions in the current mainline kernel code 提供一个接口,所以这可能是旧内核的一个怪癖。
无论哪种方式,真正适用于用户space 代码的唯一缓存维护问题是指令和数据缓存之间的一致性,以满足 JIT 或自修改代码的需要。诸如数据缓存与主内存的一致性之类的事情永远不应该与用户 space 代码相关(在这些事情确实重要的情况下,通常会在 OS 中调用驱动程序代码),并且在许多系统上需要单独的外部缓存维护,无论如何只有 OS 能够管理。
我正在使用以下代码刷新 raspberry pi 2 上的缓存行:
static inline void flush(void addr)
{
asm volatile("mcr p15, 0, %0, c7, c6, 1"::"r"(addr));
}
我在 运行 执行此操作时收到一条错误消息,提示这是一条特权指令。这段代码正确吗?有什么方法可以清除这台机器上用户 space 的缓存行吗?在 x86 上 clflush
无需任何修改即可工作。
Is this code correct?
事实上,没有。这是一些伪造的不存在的系统寄存器编码 - 缓存维护操作存在于 c7 space,而不是 c12.
但是,更不正确的是您可以做到这一点的假设。在ARMv8之前,all缓存维护操作只能在特权模式下执行。来自用户 space,您需要 OS 的支持才能请求它; Linux,例如,有一个特定于 ARM 的系统调用,GCC 通过 __clear_cache()
- there might be some permission-related caveats, although I don't see any reference to VMA permissions in the current mainline kernel code 提供一个接口,所以这可能是旧内核的一个怪癖。
无论哪种方式,真正适用于用户space 代码的唯一缓存维护问题是指令和数据缓存之间的一致性,以满足 JIT 或自修改代码的需要。诸如数据缓存与主内存的一致性之类的事情永远不应该与用户 space 代码相关(在这些事情确实重要的情况下,通常会在 OS 中调用驱动程序代码),并且在许多系统上需要单独的外部缓存维护,无论如何只有 OS 能够管理。