キャッシュ同期操作について質問があります。
無効:CPUがデバイスによって更新されたメモリの一部を読み取ろうとする前に、対応するメモリを無効にする必要があります。
フラッシュ:デバイスがCPUによって更新されたメモリの一部を読み取る前に、CPUはキャッシュからメモリにコンテンツをフラッシュする必要があります(ライトバックも正しいですか?)。これにより、デバイスは更新されたコンテンツでメモリからコンテンツを読み取ります。 。
フラッシュが実行されない場合、メモリはキャッシュに書き込まれた内容でまだ更新されていないため、メモリに存在するジャンクデータを読み取る可能性があります。
上記の理解が正しいかどうかを確認してください。
いつフラッシュと無効化の両方を組み合わせたいですか?デバイス制御記述子で遊んでいる間、flushとinvalidateを組み合わせて同期する必要があると聞きました。なぜそうなのか?
フラッシュの後に無効化するようなシーケンスに従う必要がありますか?
無効化に続いてフラッシュが役立つシナリオはありますか?
Flushはキャッシュの内容をメインメモリに書き戻し、invalidateはキャッシュラインを無効としてマークし、将来の読み取りがメインメモリに送られるようにします。
デバイスがメモリのブロックを更新している場合は、フラッシュと無効化を組み合わせると思います。フラッシュはデバイスに最新のコンテンツがあることを確認し、無効化はデバイスが終了したときにCPUが新しいコンテンツを読み取ることを保証します。メモリから。
上記の理解が正しいかどうかを確認してください。
一般的にあなたは完全に正しいですが、つまずく可能性のあるいくつかの石があります。 HWプラットフォームを指定していません。 SRAMを搭載した小型の組み込みコントローラーについて話していない場合は、次のことを考慮してください。 MMU)がパックされたプロセッサは、通常のDDRメモリとドライバ(HW関連)メモリの異なるメモリ属性をサポートします。最後のプロセッサはキャッシュできないため、フラッシュ/無効化の心配はありません。
いつフラッシュと無効化の両方を組み合わせたいですか?デバイス制御記述子で遊んでいる間、flushとinvalidateを組み合わせて同期する必要があると聞きました。なぜそうなのか?
DMAはタグで言及されているため)、いくつかのシナリオがあります(HWバッファーがキャッシュ不可能なデバイスメモリであると想定)。
NOTE
を参照してください)DMA CPUがキャッシュからの「古い」データを使用しないようにします。ハードウェアバッファのフラッシュは冗長です。NOTE
:DMAの前に「ソース」をフラッシュする必要があることは明らかです。それでも、いつ無効にするかという疑問があります。技術的には、CPUが「宛先」データへのアクセスを試みる前であり、DMA(DMAがジョブを終了したことを確認する必要があります))の前または後の可能性があります。IRL afterDMAを無効にすると、問題が発生する可能性があります。 仮想アドレスによる範囲のフラッシュ/無効化; ARMv8;キャッシュ; を参照してください。
ご覧のとおり、この特定のプラットフォームではinvalidateをbeforeDMAingで実行する必要があります。また、ARMv7デバイスのBSPコードをとりとめながら、転送前に宛先バッファを無効にするa DMA)という推奨事項を見つけました。
フラッシュの後に無効化するようなシーケンスに従う必要がありますか?
ソースバッファとデスティネーションバッファが互いに交差しないと仮定すると、依存関係はありません。あなたは出来る flush-invalidate
またはinvalidate-flush
。
無効化に続いてフラッシュが役立つシナリオはありますか?
そうは思わないでください。