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