google-code-prettify

2008-11-20

[クイズ]DMAをする時に、いつcacheを操作するか

CPU<---Cache<---Memory<---Device

DeviceからMemoryにDMAで転送して、そのデータをCPUで読む場合、以下のいずれかのcacheの操作を行う必要がある。

1. DeviceからMemoryへの転送前に、cacheのinvalidate(cacheの内容を捨てる)をする。
2. DeviceからMemoryへの転送前に、cacheのflush(cacheの内容をMemoryへ書き出す)する。
3. DeviceからMemoryへの転送後に、cacheのinvalidateをする。

2.はflushの分遅くなるが、実質1.と変わり無い。これらの32つのうちどれかを行えば、正しくDMA転送ができる。

…のだと、ずっと思っていた。
今日まで。

ところが、上記のうち1つは正しくない事に、この歳になって今さらながら気付いた。

■クイズ

上記の3つ1と3のうち、正しくデータを読めないのはどれか。
また、正しくデータを読めない理由は何か。

■訂正

2.もダメでしたね。1.と3.の2択に変更しました。

2 件のコメント:

Unknown さんのコメント...

最低でも以下になってないと内容の保障ができないはず....bus_dmaのフラグがarchに実装を期待する機能のドキュメントとかが一番確実かしらん?

CPU<---Cache<---Memory<---Device
DeviceからMemoryへの転送後読み出し前に、cacheのinvalidate(cacheの内容を捨てる)をする。


CPU--->Cache--->Memory--->Device
MemoryからDeviceへ転送前(ハードのDMAを駆動させる前)に、cacheのflush(cacheの内容をMemoryへ書き出す)する。

Unknown さんのコメント...

問題が間違っていたので、修正しました。

Tsuyoshiさんは、1が間違っていて、3が正しい、という事ですよね。

解答は次の日記のエントリとして書きます。