C WBINVD指令使用

C WBINVD指令使用,c,caching,assembly,x86,cpu-cache,C,Caching,Assembly,X86,Cpu Cache,我试图在linux上使用WBINV指令清除处理器的一级缓存 下面的程序可以编译,但在我尝试运行它时会产生分段错误 int main(){asm(“wbinvd”);返回1;} 我正在使用GCC4.4.3,并在我的x86机器上运行Linux内核2.6.32-33 处理器信息:英特尔(R)核心(TM)2双CPU T5270@1.40GHz 我构建了如下程序: $gcc 美元/年 分段故障 谁能告诉我我做错了什么?我如何让它运行 附言:我正在运行一些性能测试,希望确保处理器缓存的先前内容不会影响结果

我试图在linux上使用WBINV指令清除处理器的一级缓存

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

int main(){asm(“wbinvd”);返回1;}

我正在使用GCC4.4.3,并在我的x86机器上运行Linux内核2.6.32-33

处理器信息:英特尔(R)核心(TM)2双CPU T5270@1.40GHz

我构建了如下程序:

$gcc

美元/年

分段故障

谁能告诉我我做错了什么?我如何让它运行


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

引用自:

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

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

编辑:关于清除缓存的上一个SO讨论:


正如用户786653所写,
wbinvd
它是一条特权指令,用于区分非内核代码中的错误

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

因此,您的测量将不会更精确,它将包含各种各样的工件。读取二级缓存大小的数据块将产生更好的结果


您可以阅读下面的源代码,查看其他人是如何获得有用结果的。

为什么要刷新CPU缓存?正如回答中所说,您不能使用该指令,但如果您告诉我们您的目标是什么,我们可能会建议另一种实现itI的方法。我正在运行一些性能测试,并希望确保处理器缓存的先前内容不会影响结果。相反的方向通常更有用。多次运行基准测试,确保数据已经在缓存中。无论如何,这是最现实的场景,所以它是一个有意义的基准测试。人为地清除缓存不会给你更准确的结果,它只会使你的基准测试更依赖于硬件。在Ubuntu 12.04上,使用
sudo
(即root用户)运行你的程序时,可能会出现至少重复的情况,这不会导致分段冲突(但我不清楚缓存是否真的被清除了…)谢谢!我可以在用户空间中使用任何其他指令来清除处理器缓存吗?@roelf:添加了一些到以前SO讨论的链接。当然,您也可以编写一个设备驱动程序,使用
WBINVD
来为您清除缓存。@roelf:一般来说,创建特权in有什么意义指令与非特权指令具有相同的功能?此指令具有特权的原因是,它实际上不是您希望用户代码执行的操作。;)