Linux 如何通过DMA将数据从RAM传输到RAM?

Linux 如何通过DMA将数据从RAM传输到RAM?,linux,linux-kernel,dma,Linux,Linux Kernel,Dma,我想写一个内核模块,可以通过DMA将数据从RAM传输到RAM。有一些帖子讨论了这一点,但我真的不明白。有人说这是可能的,也有人说不是 如果我正确理解了ldd3,那么在linux的DMA API中不可能实现RAM到RAM的复制,但是driver/DMA/dmaengine.c为“DMA传输类型”提供了一个标志DMA_MEMCPY,因此应该有一种方法 这是否正确,我可以使用dma引擎将数据从一个ram地址传输到另一个ram地址吗 如果它依赖于硬件,我如何确定我的系统是否支持dma memcpy?正如

我想写一个内核模块,可以通过DMA将数据从RAM传输到RAM。有一些帖子讨论了这一点,但我真的不明白。有人说这是可能的,也有人说不是

如果我正确理解了ldd3,那么在linux的DMA API中不可能实现RAM到RAM的复制,但是driver/DMA/dmaengine.c为“DMA传输类型”提供了一个标志DMA_MEMCPY,因此应该有一种方法

这是否正确,我可以使用dma引擎将数据从一个ram地址传输到另一个ram地址吗


如果它依赖于硬件,我如何确定我的系统是否支持dma memcpy?

正如您正确指出的,应该使用
dma_memcpy
执行RAM到RAM的复制。如中所述。以下是相关摘录,请查看整个文件以了解更多详细信息:

支持的事务类型 接下来需要设置设备的事务类型 (和驱动器)支架

我们的
dma_设备
结构有一个名为
cap_mask
的字段,用于保存 支持各种类型的事务,您需要对此进行修改 使用
dma\u cap\u set
功能进行屏蔽,根据需要使用不同的标志 作为参数支持的事务类型

所有这些功能都在
dma\u事务类型
enum中定义,
在
include/linux/dmaengine.h

目前,可用的类型有:

  • DMA_MEMCPY
    • 该设备能够进行内存到内存的复制
总结一下:

  • 这取决于您的DMA控制器。有些能做RAM到RAM的事务,有些不能

  • 例如,对于基于OMAP的SOC,DMA控制器执行以下操作(
    drivers/DMA/OMAP DMA.c
    文件,在
    OMAP\u DMA\u probe()
    函数中):

    dma_cap_集(dma_MEMCPY,od->ddev.cap_掩码);
    
  • 这样,您可以稍后在驱动程序中检查它(如果您的DMA控制器能够进行RAM到RAM事务)。在
    drivers/dma/dmatest.c
    中,在
    dmatest\u add\u channel()
    函数中,查看它是如何完成的:

    if(dma\u有上限(dma\u MEMCPY,dma\u dev->cap\u掩码)){
    

如果您需要一个关于如何使用DMA API执行RAM到RAM事务的示例,请参阅。

我将添加两件事,即:a)如果DMA_PRIVATE不是由驱动程序设置的,则memcpy通常可以由DMA支持,b)drivers/DMA/dmatest.c将是一个如何执行此操作的示例。