7

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

セグメンテーション違反

誰かが私が間違っていることを教えてもらえますか? これを実行するにはどうすればよいですか?

PS: いくつかのパフォーマンス テストを実行していますが、プロセッサ キャッシュの以前の内容が結果に影響しないことを確認したいと考えています。

4

2 に答える 2

13

インテル® 64 および IA-32 アーキテクチャー ソフトウェア開発者マニュアル ボリューム 2A および 2B を組み合わせたものからの引用: 命令セット リファレンス、AZ :

WBINVD 命令は特権命令です。プロセッサが保護モードで実行されている場合、この命令を実行するには、プログラムまたはプロシージャの CPL を 0 にする必要があります。

つまり、カーネル モード コードのみが実行を許可されます。

EDIT:キャッシュのクリアに関する以前のSOの議論:

"C" プログラムで Linux マシンの L2 キャッシュをクリアする

x86 Windows で CPU キャッシュをフラッシュするにはどうすればよいですか?

CPU L1 および L2 キャッシュをクリアする方法

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

于 2011-07-19T10:27:16.627 に答える
7

user786653 が書いたように、wbinvdこれはカーネル以外のコードでセグメンテーション違反を起こす特権命令です。

ベンチマークには使用しないでくださいwbinvd。これは、あらゆる種類のバス ロック サイクル、パイプラインのシリアル化を強制し、カーネルからユーザー空間へのオーバーヘッドを追加するなど、実際のプログラムでは発生しない可能性が高いためです。

したがって、測定はより正確ではなく、あらゆる種類のアーティファクトが含まれます。L2 キャッシュのサイズのデータ​​ チャンクを読み取ると、より良い結果が得られます。

「クロック サイクルとパフォーマンスの監視を測定するためのテスト プログラム」の下にあるソース コードを読んで、他の人がどのように有用な結果を得たかを確認できます。

于 2011-07-19T12:31:09.247 に答える