なぜメモリ領域が非キャッシュとしてマークされるのでしょうか?
質問
組み込みアプリケーションには、ターゲット ボード上で有効なさまざまなアドレス範囲を説明するテーブルがあります。このテーブルは、MMU をセットアップするために使用されます。
RAM アドレス範囲はキャッシュ可能としてマークされますが、他の領域はキャッシュ不可としてマークされます。何故ですか?
解決
メモリ領域がハードウェアとソフトウェアの両方によって同時にアクセスされた場合 (例:ハードウェア コンフィギュレーション レジスタまたは DMA のスキャッタ/ギャザー リスト)、この領域 しなければならない 非キャッシュとして定義されます。実際の DMA では、メモリ バッファをキャッシュとして定義できます。ほとんどの場合、アプリケーション レベルでそのバッファに高速にアクセスできるように、バッファをキャッシュすることをお勧めします。バッファを DMA またはアプリケーションに渡す前にキャッシュをフラッシュ/無効にするのはドライバーの責任です。
小規模なアップデート(上記) しなければならない 特殊なハードウェアがある場合、これは正しくありません。つまり、キャッシュ コヒーレンシー インターコネクト (CCI) は、さまざまなハードウェア ブロックのメモリへのアクセスを同期します。
他のヒント
これは、プロセッサがキャッシュによって古い値を使用しないようにするために行われます。(通常の) キャッシュされた RAM にアクセスすると、プロセッサはアクセスした値を「記憶」できます。次回同じメモリ位置を参照すると、プロセッサは RAM を参照せずに記憶している値を返します。これがキャッシングです。
メモリマップデバイス(たとえば、いくつかのデータパケットを返すFPGA)を使用している場合のように、プロセッサが知らないうちに位置の内容が変更される可能性がある場合、プロセッサは前回から「記憶されている」値を返す可能性があります。それは間違っているだろう。
この問題を回避するには、そのアドレス空間をキャッシュ不可としてマークします。これにより、プロセッサが値を記憶しようとしなくなります。
DMA またはその他のハードウェア対話に使用されるメモリ領域はキャッシュしないでください。
おそらくメモリマップド I/O に使用されますか?
フラッシュなどの一部の領域は 1 サイクルで読み取れるため、キャッシュする必要はありません。
最新のコントローラーは DMA に L2 キャッシュを使用できます。これは、DMA アクセスに使用されるキャッシュされたメモリ領域の一貫性を維持することを意味します。これは、コントローラーによって (DMA 経由で) 実行される「スヌープ可能なメモリ トランザクション」とも呼ばれます。