2

これは、インテルのソフトウェア開発者マニュアル (注文番号: 325384-039US 2011 年 5 月) を参照して、セクション 4.10.4.4「無効化の遅延」で、TLB エントリの無効化の潜在的な遅延について説明しています。変更されました。

ソフトウェア開発者は、ページング構造エントリの変更とセクション4.10.4.2で推奨されている無効化命令の実行の間に、プロセッサが使用する可能性があることを理解する必要があります。ページング構造エントリの古い値または新しい値のいずれかに基づく変換. 次の項目は、遅延無効化の潜在的な結果のいくつかを説明しています: ページング構造エントリが変更され、R/W フラグが 0 から変更された場合1 にすると、このエントリによって変換が制御されるリニア アドレスへの書き込みアクセスで、ページ フォールト例外が発生する場合と発生しない場合があります。 "

線形アドレスのページ構造エントリが変更され (r/w フラグが 0 から 1 に反転)、その後、対応する TBL 無効化命令がすぐに呼び出される単純なケースを考えてみましょう。私の質問は、TLB の無効化の遅延の結果として、TLB の無効化を呼び出した後でも、問題の線形アドレスへの書き込みアクセスが失敗しない可能性があるということです (ページ フォールト)。

または、「遅延無効化」は、ページ構造が変更された線形アドレスの「無効化」命令が発行されていない場合にのみ、予測できない結果を引き起こす可能性がありますか?

4

1 に答える 1

1

TLBは、CR3の変更によって透過的に最適化されてキャッシュ解除されません。TLBエントリは、アドレススペースの一意の識別子でマークされ、間違ったプロセスによってタッチされるか(この場合、TLBエントリは破棄されます)、アドレススペースが復元されるまで(この場合、 TLBは、アドレス空間の変更を通じて保持されました)。

これはすべてCPUに対して透過的に行われます。プログラム(またはOS)は、この動作と、TLBの無効化によって実際に無効化されているTLBとの違いを、次の場合を除いて区別できないようにする必要があります。

  • A)タイミング-つまり、TLBは楽観的にキャッシングを解除しない方が高速です(これが、TLBが実行する理由です)
  • B)この動作がやや定義されていないエッジケースがあります。座っているコードページを変更したり、変更したばかりのメモリに触れたりすると、TLBの古い値がまだ残っている可能性があります(CR3の変更後も)。

これに対する解決策は、次のいずれかです。

  • 1)invlpg命令を介してTLB更新を強制します。これにより、TLBエントリが削除され、ページの次のタッチでTLBの読み込みがトリガーされます。
  • 2)CR0レジスタを介したページングを無効にしてから再度有効にします。
  • 3)CR0またはTLBのすべてのページのキャッシュ無効ビットを介してすべてのページをキャッシュ不可としてマークします(キャッシュ不可とマークされたTLBエントリは使用後に自動パージされます)。
  • 4)コードセグメントのモードを変更します。

これは本当に未定義の動作であることに注意してください。SMMに移行すると、TLBが無効になる場合と無効になる場合があり、競合状態になります。この振る舞いに依存しないでください。

于 2012-05-15T20:36:58.560 に答える