これは愚かな質問かもしれませんが、私はこれまでDMAに関してこれを得ていません。
メモリ間DMAを行う場合は、DMAバッファ (たとえば、dma_alloc_coherent()
)を割り当てる必要があります。転送ごとに、割り当てられたメモリ(ソースバッファ)にバッファをコピーし、次にDMAトランザクションをトリガする必要があります。DMAトランザクションは毎回バッファにコピーする必要がありますか?
したがって、トランザクションごとに追加のmemcpy()
が必要な場合は、DMAを使用すると、 のメリットはありますか?先にソースをコピーする
ステップ - DMAなし:ソースから宛先に
- コピーバッファ(
memcpy()
)
ステップ先にソースをコピーする - DMAで:
- コピーバッファ(
memcpy()
) 宛先バッファに最終的にバッファをコピーしなければならないソースDMAバッファへ - トリガDMAトランザクション()
からこの問題の例は、に受け取っsk_buf
からコピーする必要がイーサネットドライバでありますFPGAの物理アドレス。この場合、第一(dma_alloc_coherent()
から)DMA転送元バッファにsk_buf
をコピーする必要がなければなりません。
正確ドライバーは、あなたが話しているのはどれですか?メインラインのカーネル**にいくつかの実際のコード**を表示できますか?問題がどこにあるのでしょうか? –
カーネルで簡単な例を見つけるのは少し難しいです。私は自分のイーサネットドライバを書いていますが、私が書いたのと同じように、dmaの使用が有効であるかどうかはわかりません。私の質問や前提に間違いがある場合、私は知りたいです。 – ransh