私が関わっているプロジェクトの背景から始めましょう。新しいx86プロセッサに存在する最後のブランチレコード(LBR)機能を有効にするLinuxカーネルモジュール(3.5カーネル)を作成しようとしています。後で分析するために、ブランチデータをハードディスク上のファイルに書き込みます。
現在、LBRを有効にすることができ、ブランチを検出するとLBR Top of Stack Pointerが変化するのを確認できます(したがって、LBRが有効になっていることがわかります)。
私たちの問題は、LBRスタックからデータを読み取ってハードディスクに書き込むことができるように、LBRスタックがいついっぱいになるかを判断する方法がわからないという点で発生します。理想的には、LBRスタックがいっぱいに近づいたときに例外をスローし、情報を取得するハンドラーを作成するLBRのオプションを有効にします。
これまでのところ、これを行うのに最も近いのは、分岐が検出されるたびに割り込みをスローできるようにするIA32_DEBUGCTLMSRの8番目のビットを設定することです。残念ながら、分岐が発生するたびにディスクに書き込むと、パフォーマンスに必要以上の影響が生じます。個々のブランチではなく、LBRスタックがいっぱいになるたびにデータをバッチで書き込むことをお勧めします。私が見逃している代替案はありますか、それともすべての分岐の後に弾丸を噛んでディスクに書き込む必要がありますか?
ありがとう