这可能是一个愚蠢的问题,但我还没有得到关于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