Linux 如何通过DMA将数据从RAM传输到RAM?
我想写一个内核模块,可以通过DMA将数据从RAM传输到RAM。有一些帖子讨论了这一点,但我真的不明白。有人说这是可能的,也有人说不是 如果我正确理解了ldd3,那么在linux的DMA API中不可能实现RAM到RAM的复制,但是driver/DMA/dmaengine.c为“DMA传输类型”提供了一个标志DMA_MEMCPY,因此应该有一种方法 这是否正确,我可以使用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 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将是一个如何执行此操作的示例。