是否可以在Linux中进行内存到内存的DMA传输?如果是这样,什么函数调用DMA开始传输?

时间:2017-06-21 23:35:48

标签: linux dma

我的朋友和我正在尝试为高级操作系统类编写虚拟设备的设备驱动程序(读取:不是PCI或USB)。我们正在使用Ubuntu 16.04。我们的任务是在驱动程序中调用IOCTL,并为其提供一个充满RGB值(一个整数数组)的源缓冲区,一个空的目标缓冲区和一个长度。我们将调用DMA控制器将源缓冲区的内容传输到目标缓冲区,然后对目标缓冲区中的值应用线性转换。

我们已经成功完成了没有DMA的转换,我们已经成功地为我们的设备分配了一个DMA通道。我们遇到的问题是,我们似乎无法找到一个功能任何地方,它描述了使用DMA启动传输。我们希望在完成时引发一个中断(驱动程序不应该等待传输完成)。

为了清楚我们所要求的内容,我们只想知道在哪里可以找到描述此过程的函数的定义。我们不会要求代码或完成此任务的确切方法;我们只想知道可以使用哪些函数和/或找到它们的头文件。我们通过linux / dma-mapping.h查看了看似令人作呕的内容。我们还看了一段时间的LDD3,但似乎彻底完成了设置DMA的过程,但没有提供有关应该使用哪些函数来实际开始DMA传输的大量信息。

1 个答案:

答案 0 :(得分:1)

有" DMA引擎"最新Linux内核中的API支持能够在drivers/dma目录中进行内存到内存复制的本地DMA引擎,检查它们的实现方式:

http://elixir.free-electrons.com/linux/latest/source/drivers/dma/Kconfig

menuconfig DMADEVICES
bool "DMA Engine support"
depends on HAS_DMA
help
  DMA engines can do asynchronous data transfers without
  involving the host CPU.  Currently, this framework can be
  used to offload memory copies in the network stack and
  RAID operations in the MD driver.  This menu only presents
  DMA Device drivers supported by the configured arch, it may
  be empty in some cases.

DMA引擎在多个硬件平台中实现,但不是在每台PC或服务器或SoC中实现。检查Kconfig中的选项,如INTEL_IDMA64" Intel集成DMA .. Intel Skylake PCH",INTEL_IOATDMA" Intel(R)I / OAT DMA引擎,存在于最新的Intel Xeon芯片组中。"

其他选择是使用某些虚拟化平台(如qemu)并为其实施自己的设备模拟(https://stackoverflow.com/a/44612957 edu设备和simple driverhttp://wiki.qemu.org/Features/QOM)。

如果您询问如何注册中断处理程序,请告诉我们您的(虚拟)总线是什么,您的(虚拟)设备如何连接(以及您如何实现虚拟设备)。并qemu's "edu" pci.c driver has some examples for PCI-compatible interruptsrequest_irq(pci_irq, irq_handler, IRQF_SHARED, "pci_irq_handler0", &major)