ページテーブルウォークはキャッシュされますか?


12

ハードウェアTLB管理を備えたマイクロプロセッサ(Intel x86-64など)でTLBミスが発生し、プロセッサがページテーブルを歩いている場合、これらの(オフチップ)メモリアクセスはキャッシュ階層(L1、L2など)を通過します。 )?


電子設計とは関係ありません。質問は終了します。
レオン・ヘラー

8
特定のチップがどのように機能するかを尋ねているので、私はそれが話題になっていると思います。
オリンラスロップ

5
@OlinLathrop:同意します。集積回路の低レベルの詳細は話題になっていると思います。
-davidcary

プロセッサの機能をデバッグすることは、まともな決定論的なシステムを設計するための重要なステップです。これは私たちの境界の1つに近づいていますが、内部には強く見えます。
Kortuk

回答:


8

はい、Intel x86-64プロセッサでは、TLBミスが発生し、プロセッサがページテーブルを歩いているときに、それらのオフチップメモリ​​アクセスがキャッシュ階層を通過します。

私はまだいくつかの詳細について少しあいまいですが、他の答えがそれらを埋めることを願っています-ページウォークを非常に詳細に説明しているIntelまたはAMDのマニュアルはありませんか?私の理解は:

  • アドレスレジスタの仮想アドレスは、最初に高速TLBに渡されて物理アドレスに変換されます。PCのアドレスはL1 ITLBに渡され、他のレジスタのアドレスはL1 DTLBに渡されます。 。
  • 最初のルックアップが失敗した場合、別のレベルのより低速で大きなTLBが試行されます。(このL2 TLBもITLBとDTLBに分割されていますか、それとも統合TLBキャッシュですか?さらにTLBレベルがあります-L3?L4?)
  • TLBルックアップが完全に失敗し、x86およびx86-64 VHPTウォーカーが無効になっている場合、CPUはTLBミスフォールトを通知し、OSカーネルによってインターセプトされます。私の理解では、実質的にすべての非x86 CPUは同じことを行い、TLBミスを完全にソフトウェアで処理します。有効にした場合、x86およびx86-64プロセッサには、次のいくつかの手順を処理するハードウェア支援VHPTテーブルウォーカーがあります。(x86およびx86-64チップには、VHPTを完全に無効にするビットが1つありますか、それとも一部のアドレス範囲でVHPTを有効にし、他のアドレス範囲でVHPTを無効にできるビットがありますか?それらのビットはどこにありますか?)
  • TLBルックアップが完全に失敗した場合、元の(おそらくユーザーモードの)仮想アドレスV1は、V1の物理ページ番号を保持するページテーブルエントリPTEの仮想アドレスV2に変換されます。
  • V2は再び仮想アドレスであるため、CPUは通常の仮想アドレスから物理アドレスへの変換を行いますが、L1をスキップしてL2に進むことを除きます。
  • ハードウェアは、(仮想的にインデックス付けされた)L2キャッシュからそのPTEをフェッチするのと並行して、TLBで仮想アドレスV2を検索します。
  • V2は命令のアドレスではないため、L1命令キャッシュを経由しません。また、V2は通常のユーザーデータのアドレスではないため、L1データキャッシュを通過しません。V2は、最初にL2統合キャッシュ(統合命令+データ+ PTEキャッシュ)に供給されます。「キャッシュ階層の例」を参照してください。
  • L2キャッシュ(またはL3またはその他の仮想インデックス付きキャッシュ)にPTEが含まれている場合、VHPTはキャッシュメモリからPTEをフェッチし、TLBにV1のPTEをインストールし、そのPTEの物理アドレスを使用して元の仮想アドレスV1を物理RAMアドレスに格納し、最終的にOSの支援なしでそのデータまたは命令を完全にハードウェアでフェッチします。
  • 仮想インデックス付きキャッシュのすべてのレベルが失敗したが、V2でこの2番目のTLBルックアップが成功した場合、VHPTは物理インデックス付きキャッシュまたはメインメモリからPTEをフェッチし、TLBにV1のPTEをインストールし、その中の物理アドレスPTEを使用して、元の仮想アドレスV1を物理RAMアドレスに変換し、最終的にOSの支援なしでそのデータまたは命令を完全にハードウェアでフェッチします。
  • この2番目のTLBルックアップが失敗すると、ハードウェアVHPTウォーカーはVHPT TRANSLATION FAULTをあきらめます。
  • VHPT TRANSLATION FAULTが発生すると、CPUはOSにトラップします。OSは何がうまくいかなかったかを把握し、修正する必要があります。
  • (a)おそらく、V2を含むページは現在ディスクにスワップアウトされているため、OSはそれをRAMに読み込み、失敗した命令を再開します。
  • (b)バグのあるプログラムが無効な場所の読み取りまたは書き込みまたは実行を試みており、OSがプロセスを終了している可能性があります。
  • (c)OSライターがこのメカニズムを使用してさまざまな種類のアクセスをトラップするために行うその他のさまざまなトリック-ディスクにスワップアウトされる可能性のあるV1を含むページをロードします。新しいプログラムのデバッグに使用されるさまざまなトラップ。直接サポートしていないCPUで「W ^ X」をシミュレートする。コピーオンライトをサポートするため。等

Thomas W. Barr、Alan L. Cox、Scott Rixnerの2ページ目の図。 「翻訳キャッシュ:スキップして、歩いてはいけません(ページテーブル)」 は、「MMUキャッシュによって保存されたエントリ」と「L2データキャッシュによって保存されたエントリ」の間に線を引きます。(これは、新しいCPUを設計する人々にとって有用な論文になる可能性があります。これは、「電子設計」のトピックに完全に当てはまります)。

ステファン・エラニアンとデビッド・モスバーガー。 「IA-64 Linuxカーネルの仮想メモリ」 およびUlrich Drepper。 「すべてのプログラマは、メモリについて何を知っている必要があります」 と、おそらくスタックオーバーフロー- (これはEDのためのビットオフトピックであるIA-64ページテーブルを扱うことのオペレーティングシステムを書く人々のために有用かもしれ紙「operating- system」タグ「osdev」タグ、またはOSDev.org wiki がそのトピックに適しています。

Intelの533ページの表A-10。 Intel®64 およびIA-32アーキテクチャソフトウェア開発者マニュアル」「PAGE_WALKS.CYCLES ...は、ページウォークのほとんどがキャッシュによって満たされるか、L2キャッシュミスを引き起こすかを示唆できます。」


私は答えが大好きですが、おそらく十分に価値のある賛成票を与えることを快適に感じるために必要な専門知識を持っていない多くの人の一人でしょう。他の専門家が確認したように、すでに獲得した担当者に連絡します。
Kortuk

これが正しいとは思わない。TLBルックアップに関する箇条書き1 + 2は正しいAFAICTですが、3はそうではありません。x86(またはx86-64)でのページテーブルウォークは、ソフトウェア(例外が適用されます。後述)で処理されず、ハードウェアで処理されます。つまり、TLBを使用してアドレスを解決できないとCPUが判断すると、CR3レジスタが指すテーブルからページテーブルをウォークします。この解決が失敗した場合にのみ、CPUのページフォールトハンドラーを呼び出します。例外は、特定のモードでハイパーバイザーがゲストで発生するページフォールトを解決する仮想化拡張機能です。
モーティ

x86にはソフトウェアTLB更新を行う方法はないと思います。ソフトTLB処理を許可するISAには、SWがTLBエントリを変更するための特別な指示がありますが、x86にはinvlpg、特定のvirt addrのTLBキャッシングを無効にする以外に、それはないと思います。HWページウォークでその仮想アドレスのエントリが見つからない場合、またはエントリのアクセス許可でアクセスが許可されていない場合、#PF例外が発生します。OSはページテーブルを更新し(ディスクからデータをページングするか、コピーオンライトを実行した後)、障害のあるロード/ストアが再実行され、HWページウォークが成功するように再開することで処理します。
ピーター・コーデス


4

これは、電子機器のスタック交換ではなく、コンピューターアーキテクチャのスタック交換に属していることに同意する傾向がありますが、これはここにあるためです。

@davidcaryは正しいです。

いくつかの歴史:

Intel x86ページテーブルウォークは、P5(別名Pentium)までキャッシュされませんでした。より正確には、ページテーブルウォークのメモリアクセスはキャッシュされず、キャッシュをバイパスしました。それまでのほとんどのマシンはライトスルーであったため、キャッシュと一致する値を受け取りました。しかし、彼らはキャッシュをスヌープしませんでした。

P6、別名Pentium Pro、およびAFAIK以降のすべてのプロセッサのページテーブルウォークは、キャッシュにアクセスし、キャッシュから取得した値を使用できました。したがって、ライトバックキャッシュを使用していました。(もちろん、MTRRで定義されたキャッシュ不可メモリにページテーブルを配置することもできます。しかし、OSのデバッグには役立ちますが、これは大きなパフォーマンスの低下になります。)

ちなみに、この「ページテーブルウォークメモリアクセスがデータキャッシュにアクセスする可能性がある」は、「ページテーブルエントリがTLB Ttranslation Lookasideバッファに格納(キャッシュ)される」とは別です。一部のマシンでは、TLBは「トランスレーションキャッシュ」と呼ばれます。

別の関連する問題は、ページテーブルの内部ノードが、さらに多くのTLBのようなデータ構造、たとえばPDEキャッシュにキャッシュされる可能性があることです。

1つの重要な違い:データキャッシュは一貫性があり、スヌープされます。ただし、TLBおよびPDEキャッシュはスヌープされません。つまり、一貫性がありません。結論として、ページテーブルは非コヒーレントTLBやPDEキャッシュなどにキャッシュされる可能性があるため、ページテーブルエントリがそうである可能性がある場合、ソフトウェアは個々のエントリまたはバルクグループ(TLB全体など)を明示的にフラッシュする必要がありますキャッシュが変更されます。少なくとも「危険」な方法で変更された場合、RW-> R-> Iから変更された場合、またはアドレスを変更された場合。

これは、新しいタイプの非コヒーレントTLBのようなキャッシングが追加されるたびに、これが行われていないという暗黙の仮定があったため、一部のOSが壊れたと言ってもいいと思います。


新しいコンプ。アーチ。seの提案は「3か月前」に始まりました。area51から抜け出せなかった以前のものがあったと思います(十分なフォロワーがいないのですか?)。
ポールA.クレイトン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.