0

私が関わっているプロジェクトの背景から始めましょう。新しいx86プロセッサに存在する最後のブランチレコード(LBR)機能を有効にするLinuxカーネルモジュール(3.5カーネル)を作成しようとしています。後で分析するために、ブランチデータをハードディスク上のファイルに書き込みます。

現在、LBRを有効にすることができ、ブランチを検出するとLBR Top of Stack Pointerが変化するのを確認できます(したがって、LBRが有効になっていることがわかります)。

私たちの問題は、LBRスタックからデータを読み取ってハードディスクに書き込むことができるように、LBRスタックがいついっぱいになるかを判断する方法がわからないという点で発生します。理想的には、LBRスタックがいっぱいに近づいたときに例外をスローし、情報を取得するハンドラーを作成するLBRのオプションを有効にします。

これまでのところ、これを行うのに最も近いのは、分岐が検出されるたびに割り込みをスローできるようにするIA32_DEBUGCTLMSRの8番目のビットを設定することです。残念ながら、分岐が発生するたびにディスクに書き込むと、パフォーマンスに必要以上の影響が生じます。個々のブランチではなく、LBRスタックがいっぱいになるたびにデータをバッチで書き込むことをお勧めします。私が見逃している代替案はありますか、それともすべての分岐の後に弾丸を噛んでディスクに書き込む必要がありますか?

ありがとう

4

1 に答える 1

2

記録を開始するときに TOS を読み取り、割り込み中に TOS がこの元の値と等しいかどうかを確認して、スタックが新しいレコードでいっぱいになっているかどうかを判断し、完全なスタックごとに 1 つのディスク書き込みのみを行う必要があります。初期のレコードの一部を失う可能性がある場合の別の代替手段は、TOS が値の範囲内の任意の値に等しい場合にのみディスクに書き込むことで、フルスタックごとにディスクに 1 回書き込みます。

1 つの問題は、割り込み自体がジャンプと見なされるため、LBR スタックにプッシュされることですが、さまざまな許可レベルに基づいてどのように機能するかはわかりません。

于 2013-02-04T20:33:05.470 に答える