這可能是一個愚蠢的問題,但我還沒有得到關於DMA的知識。
當執行存儲器到存儲器DMAing,它需要分配DMA緩衝區 (例如用dma_alloc_coherent()
),然後爲每個我們需要將緩衝器複製到所分配的存儲器(源緩衝器)中,然後觸發DMA事務傳送。DMA事務每次都需要複製到緩衝區中?
因此,如果每筆交易需要額外的memcpy()
,那麼使用DMA的好處是什麼?
步驟用於複製源到目的地 - 無DMA:從源
- 複製緩衝區(
memcpy()
)到目的地
步驟用於複製源到目的地 - 與DMA:
- 複製緩衝區(
memcpy()
)從源到DMA緩衝器 - 觸發DMA事務(其中應複製緩衝器最終 目的地緩衝液)
這個問題的一個例子是與以太網驅動程序,這需要從收到sk_buf
複製到FPGA的物理地址。在這種情況下,它需要首先將sk_buf
複製到DMA源緩衝區(從dma_alloc_coherent()
)。
你在說什麼車?您能否在主線內核**中向我們展示一些實際的代碼**,哪裏出現問題? –
在內核中找到簡單的例子有點困難。我正在編寫自己的以太網驅動程序,我不確定使用dma是否有效 - 就像我寫的一樣。如果我的問題或假設中有任何錯誤,我想知道。 – ransh