2016-09-06 75 views
1

這可能是一個愚蠢的問題,但我還沒有得到關於DMA的知識。
當執行存儲器到存儲器DMAing,它需要分配DMA緩衝區 (例如用dma_alloc_coherent()),然後爲每個我們需要將緩衝器複製到所分配的存儲器(源緩衝器)中,然後觸發DMA事務傳送。DMA事務每次都需要複製到緩衝區中?

因此,如果每筆交易需要額外的memcpy(),那麼使用DMA的好處是什麼?

步驟用於複製源到目的地 - 無DMA:從源

  1. 複製緩衝區(memcpy())到目的地

步驟用於複製源到目的地 - 與DMA

  1. 複製緩衝區(memcpy())從源到DMA緩衝器
  2. 觸發DMA事務(其中應複製緩衝器最終 目的地緩衝液)

這個問題的一個例子是與以太網驅動程序,這需要從收到sk_buf複製到FPGA的物理地址。在這種情況下,它需要首先將sk_buf複製到DMA源緩衝區(從dma_alloc_coherent())。

+0

你在說什麼車?您能否在主線內核**中向我們展示一些實際的代碼**,哪裏出現問題? –

+0

在內核中找到簡單的例子有點困難。我正在編寫自己的以太網驅動程序,我不確定使用dma是否有效 - 就像我寫的一樣。如果我的問題或假設中有任何錯誤,我想知道。 – ransh

回答

2

如果您可以將dma_map_single()sk_buf指針一起使用,那麼您不必將其複製到分配有dma_alloc_coherent()的緩衝區中。在網絡設備驅動程序中有很多這樣的例子。

int dma_len = skb->len; 
dma_addr_t dma_addr = dma_map_single(dev, skb->data, skb->len, DMA_TO_DEVICE); 

// error checking code here 
// then send the dma_addr to the drvice 
// when it is done, unmap it 
dma_unmap_single(dev, dma_addr, dma_len, DMA_TO_DEVICE); 

查看DMA Mapping API documentation瞭解更多詳情。

+0

但我使用內存內存(fpga空間映射),所以我不知道我應該使用DMA_TO_DEVICE?我看過DMA映射API文檔,但它並沒有明確何時應該存儲到內存中,內存到/從設備 – ransh

+1

當您使用內存兩側(*內存到內存*僅發生有** **增量地址和對應的總線寬度。在** **固定必須使用*內存到設備*和*設備到存儲器*傳輸FIFO的地址。 – 0andriy

+0

的情況下這是一個icremented地址我怎麼指定它是內存到內存 – ransh