2016-09-06 40 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