2

メモリマップドI/Oに関する質問があります。 CPUが値を読み取っているメモリマップされたIOペリフェラルがあるとします。読み取られると、その値はキャッシュに保存されます。しかし、メモリ内の値は外部IO周辺装置によって更新されています。 そのような場合、CPUがキャッシュを無効にしたと判断する方法と、そのような場合の回避策は何ですか?メモリマップドI/Oでキャッシュを管理する

答えて

1

これはプラットフォームによって大きく異なります。実際には、2つの異なるケースがあります。

ケース#1。メモリマップされた周辺装置。これは、ある範囲の物理メモリアドレスへのアクセスが周辺デバイスにルーティングされることを意味します。実際のRAMは含まれていません。たとえば、キャッシュを制御するために、x86はMTRR(「メモリタイプ範囲レジスタ」)とPAT(「ページ属性テーブル」)を持っています。特定の範囲の物理メモリに対してキャッシングモードを設定できます。通常の状況下では、RAMにマップされるメモリの範囲はライトバックキャッシング可能であり、周辺デバイスにマップされるメモリの範囲はuncacheableです。異なるキャッシング・ポリシーについては、Intel's system programming guide「11.3キャッシングの方法」で説明しています。したがって、メモリマップされた周辺機器に読み出しまたは書き込み要求を発行すると、CPUキャッシュはバイパスされ、要求はデバイスに直接送られます。

ケース#2。 DMA。周辺装置はRAMに非同期でアクセスできます。この場合、DMAコントローラはどのCPUとも同じであり、キャッシュ・コヒーレンシ・プロトコルにも同様に参加します。周辺からの書き込み要求は他のCPUのキャッシュによって認識され、キャッシュラインは無効化されるか、または新しいデータで更新されます。また、他のCPUのキャッシュにも読み取り要求があり、メインRAMではなくキャッシュからデータが返されます。 (これが唯一の例です。実際の実装はプラットフォームに依存し例えば、SOCが一般的に強力なキャッシュ・コヒーレンシ周辺<保証するものではありません - > CPU)のどちらの場合も

、キャッシングの問題も、コンパイラレベルで存在する:コンパイラをデータ値をレジスタにキャッシュすることができる。そのため、プログラミング言語には、そのような最適化を禁止する手段がいくつかあります。たとえば、volatileというキーワード。

関連する問題