15

最新の x86 システムでメモリ マップされたファイルにバックアップされた領域に割り当てられている CPU キャッシュの動作またはポリシー (キャッシュ不可能な書き込み結合など) のタイプを知っている人はいますか?

どちらが該当するかを検出し、デフォルトの動作をオーバーライドする方法はありますか?

Windows と Linux は、関心のある主要なオペレーティング システムです。

(編集者注: 質問は以前はメモリ マップド I/O と表現されていましたが、特に CPU キャッシュについて話す場合、そのフレーズには特定の技術的意味があります。つまり、NIC やビデオ カードなどの実際の I/O デバイスは、負荷をかけて通信します。 /店。

mmap(some_fd, ...)この質問は、実際には、 MAP_ANONYMOUS を使用せず、ディスク上の通常のファイルによってサポートされている場合に、から取得するメモリの種類に関するものです。)

4

2 に答える 2

15

TL:DR メモリ マップ ファイルは、プロセスのアドレス空間にマップするページキャッシュのページに対して通常のライトバック ポリシーを使用します。WB ではないページが必要な場合は、OS 固有の特別な操作を行う必要があります。


アドレス空間領域に適用されるキャッシュ ポリシーは、通常、オペレーティング システムに依存せず、アドレス空間ページの背後にあるデバイスのタイプのみに依存します。実際、オペレーティング システムは任意のキャッシュ ポリシーを任意のメモリ領域に自由に適用できますが、キャッシュ ポリシーが正しく割り当てられていないと、システム パフォーマンスが低下したり、システム ロジックが壊れたりする可能性があります。

少なくとも 4 つのキャッシング ポリシーがあります。

  1. フル キャッシング (ライトバック、別名 WB)。メイン メモリ (RAM) にマップされた物理アドレス空間に適用されます。メモリ サブシステムのパフォーマンスを向上させるために使用されます。このようなデバイスの主な特性は、その状態をソフトウェアによってのみ変更でき、ソフトウェアのみに影響を与えることができるということです。

    メモリ マップド ファイルの実装では、フル キャッシュが使用されます。これは、ディスクからファイル チャンクを読み取ってメモリに配置し、このチャンク (変更されている可能性がある) をディスクに戻すソフトウェア (オペレーティング システム) によって完全に実装されているためです。ハードウェアは、ページ テーブルの「ダーティ」ビットを更新して、ディスクに同期する必要があるものを OS が認識できるようにします。

  2. ライトスルー キャッシング。(WT) このようなデバイスの主な特性は、その状態をソフトウェアによってのみ変更できることですが、変更はデバイスに即座に影響を与える必要があります。このポリシーに従って、メモリ マップド IO デバイス レジスタに書き込まれたデータは、キャッシュとデバイスの 2 つの場所に同時に配置されます。ただし、データの読み取りが開始されると、デバイスへの高価なアクセスなしでキャッシュからデータがキャプチャされます。

    このキャッシュ ポリシーは、メモリに書き込みを行わず、CPU が書き込んだ内容のみを読み取る MMIO デバイスに役立ちます。実際には、何にも使用されることはめったにありません。GPU はそうではなく、ビデオ メモリに書き込むため、ビデオ RAM には使用されません。(GPU がリージョンの CPU キャッシュを無効にするメカニズムはありません。GPU は CPU のキャッシュ コヒーレンシ ドメインの一部ではないためです)

  3. Uncacheable, write-combining (WC aka USCW) : 通常、ビデオ RAM のマッピングに使用される弱い順序付けのメモリ。キャッシュ不可と同様ですが、NT ストアでは一度にキャッシュ ライン全体を効率的に書き込むことができます。 movntdqaロードを使用すると、キャッシュ ライン全体を効率的に読み取ることができます。これは、WC リージョンから他の方法では実行できません。通常のロードでは、キャッシュできないため、同じライン内であっても、ロードごとに個別にデータをフェッチします。
  4. キャッシュを無効にしました。(UC) ほとんどすべての IO デバイスに適用されます。これは、メモリ マップド IO デバイス レジスタへの書き込みが即座に有効になり、メモリ マップド IO デバイス レジスタからの読み取りがデバイスからの実際のデータをリーダーに返さなければならないためです。キャッシュがメモリ マップド IO デバイスに適用される場合、次の 2 つの悪影響が生じます。
    1. メモリ マップド IO デバイス レジスタへの書き込みは、キャッシュ コントローラーが書き込まれたデータでキャッシュ ラインをフラッシュすることを決定する瞬間まで遅延されます。その結果、ドライバーは、デバイスに書き込まれたコマンドがいつ有効になるかを知ることができません。
    2. メモリ マップド IO デバイス レジスタからの読み取りデータはキャッシュできます。また、同じメモリ マップド IO デバイス レジスタから読み取られた後続のデータは、デバイスから実際のデータではなく、キャッシュから古いデータを返す可能性があります。このため、ドライバーがデバイスの実際の状態をキャプチャするのは難しくなります。

ソフトウェアがキャッシュ ポリシーを指定できる方法は、プロセッサにのみ依存するため、同じアルゴリズムをどのオペレーティング システムにも適用できます。最も簡単な方法は、CR3 レジスタの内容をキャプチャし、それを使用して、知りたいキャッシュ ポリシーのアドレスに適したページ テーブル エントリを見つけ、PCD フラグと PWT フラグを確認することです。しかし、キャッシングに影響を与える可能性のある他の機能がほとんどないため、この方法は完全ではありません (たとえば、キャッシングは CR0 で完全に無効にすることができます。MTRR、PAT も参照してください)。

于 2013-04-07T17:20:31.577 に答える
2

ZarathustrA の既存の回答に追加するには: Windows では、SEC_NOCACHEこのキャッシュを無効にします。がありますがSEC_WRITECOMBINE、それは壊れているように見えます (SEC_RESERVEまたはでのみ動作しSEC_COMMITます。つまり、ページ ファイルでのみ動作し、それを設定する必要はありませんSEC_WRITECOMBINE)。

于 2013-04-07T23:28:31.837 に答える