WBINVD指令用法

时间:2011-07-19 10:23:08

标签: c caching assembly x86 cpu-cache

我正在尝试在linux上使用WBINV指令来清除处理器的L1缓存。

以下程序编译,但在我尝试运行时会产生分段错误。

int main() {asm ("wbinvd"); return 1;}

我正在使用gcc 4.4.3并在我的x86机器上运行Linux内核2.6.32-33。

处理器信息:Intel(R)Core(TM)2 Duo CPU T5270 @ 1.40GHz

我按如下方式构建了程序:

$ gcc

$ ./a.out

分段错误

有人可以告诉我我做错了什么吗?我如何让它运行?

P.S:我正在运行一些性能测试,并希望确保处理器缓存的先前内容不会影响结果。

2 个答案:

答案 0 :(得分:13)

引自Intel® 64 and IA-32 Architectures Software Developer's Manual Combined Volumes 2A and 2B: Instruction Set Reference, A-Z

  

WBINVD指令是特权指令。当处理器运行时   保护模式,程序或过程的CPL必须为0才能执行此操作   指令。

换句话说,只允许内核模式代码执行它。

编辑:以前关于清除缓存的SO讨论:

"C" programmatically clear L2 cache on Linux machines

How can I do a CPU cache flush in x86 Windows?

How to clear CPU L1 and L2 cache

https://stackoverflow.com/questions/3443130/how-to-clear-cpu-l1-and-l2-cache

答案 1 :(得分:5)

正如user786653所写,wbinvd它是一个特权指令,它在非内核代码中进行了段错误。

您应该避免使用wbinvd进行基准测试,因为它会强制所有类型的总线锁定周期,管道序列化以及从内核到用户空间等的开销,这很可能不会发生在您的真实世界程序中。

因此,您的测量将不会更精确,它将包含所有类型的工件。读取L2缓存大小的数据块将产生更好的结果。

您可以阅读Test programs for measuring clock cycles and performance monitoring下的源代码,了解其他人如何获得有用的结果。