x86/x86_64プロセッサでは、L1、L2、L3のキャッシュに物理アドレスと仮想アドレスのどちらが使用されていますか? 質問する

x86/x86_64プロセッサでは、L1、L2、L3のキャッシュに物理アドレスと仮想アドレスのどちらが使用されていますか? 質問する

x86/x86_64プロセッサでは、L1、L2、L3(LLC)のキャッシュにどのアドレスが使用されますか?物理または仮想(PT/PTEを使用)TLB)そしてどういうわけかPAT(ページ属性テーブル)それに影響しますか?

この場合、ドライバー (カーネル空間) とアプリケーション (ユーザー空間) の間に違いはありますか?


短い答え - Intelは仮想的にインデックスされ、物理的にタグ付けされる(VIPT) L1 キャッシュ:HT を使用して 1 つのコアで実行されているスレッド間のデータ交換には何が使用されますか?

  • L1 -バーチャルアドレス指定(8-wayキャッシュでは定義にSet必要なアドレスは低く12 bits、仮想アドレスと物理アドレスで同じ)
  • L2 -物理的なアドレス指定(Virt-2-Phys の TLB へのアクセスが必要)
  • L3 -物理的なアドレス指定(Virt-2-Phys の TLB へのアクセスが必要)

ベストアンサー1

あなたの質問に対する答えは、状況によって異なる、ということです。これは厳密には CPU 設計上の決定であり、パフォーマンスと複雑さのトレードオフのバランスを取るものです。

最近のIntel Coreプロセッサを例に挙げてみましょう。これらは物理的にタグ付けされ、仮想的にインデックス化されています(少なくともhttp://www.realworldtech.com/sandy-bridge/7/)。つまり、キャッシュは、ラインが存在するかどうかを判断するために、純粋な物理アドレス空間でのみ検索を完了できます。ただし、L1 は 32k、8 ウェイ アソシエイティブであるため、64 セットを使用するため、正しいセットを見つけるにはアドレス ビット 6 から 11 のみが必要です。この範囲では仮想アドレスと物理アドレスは同じであるため、キャッシュ セットの読み取りと並行して DTLB を検索できます。これは既知のトリックです (参照 -http://en.wikipedia.org/wiki/CPU_cache良い説明についてはこちらをご覧ください。

理論上は、仮想インデックス + 仮想タグ付きキャッシュを構築することができ、これにより、アドレス変換 (TLB ルックアップ、および TLB ミスの場合のページ ウォーク) を実行する必要がなくなります。ただし、これにより、特にメモリ エイリアシング (2 つの仮想アドレスが同じ物理アドレスにマップされる場合) で多くの問題が発生します。

たとえば、core1 には、このような完全仮想キャッシュに仮想アドレス A キャッシュがあります (これは物理アドレス C にマップされますが、このチェックはまだ実行していません)。core2 は、同じ物理アドレス C にマップされる仮想アドレス B に書き込みます。つまり、core1 のその行を無効にして、必要に応じてデータのマージと一貫性の管理を行う何らかのメカニズム (通常は Jim Goodman が考案した「スヌープ」) が必要です。ただし、core1 は仮想アドレス B を認識しておらず、物理アドレス C を仮想キャッシュに格納していないため、そのスヌープに応答できません。したがって、問題があることがわかります。これは主に厳密な x86 システムに関連しますが、他のアーキテクチャではより緩やかで、このようなキャッシュの管理が簡単になる可能性があります。

他の質問に関してですが、私が考える限りでは PAT との実際の関係はありません。キャッシュはすでに設計されており、異なるメモリ タイプに合わせて変更することはできません。他の質問についても同じ答えです。HW は、主にユーザー モードとカーネル モードの区別の下にあります (セキュリティ チェック用に提供されるメカニズム (主にさまざまなリング) を除く)。

おすすめ記事