繁体   English   中英

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

[英]Flush a cache line from user mode on ARMv7(rpi2)

我正在使用以下代码刷新树莓派2上的缓存行:

 static inline void flush(void addr)
 {
     asm volatile("mcr p15, 0, %0, c7, c6, 1"::"r"(addr));                                              
 } 

运行此命令时,我收到一条错误消息,指出这是特权指令。 此代码正确吗? 有什么方法可以从此计算机上的用户空间刷新缓存行吗? 在x86上, clflush无需任何修改clflush工作。

此代码正确吗?

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

但是,更错误的是您可以做到这一点。 在ARMv8之前, 所有缓存维护操作只能在特权模式下执行。 在用户空间中,您需要操作系统的支持才能允许您请求它; 例如,Linux有一个特定于ARM的syscall,GCC通过__clear_cache()提供了一个接口- 可能会有一些与权限有关的警告 ,尽管我在当前的主线内核代码中看不到对VMA权限的任何引用,因此也许这是旧内核的怪癖。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM