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

标签 linux dma

<分区>

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

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

为了明确我们的要求,我们只想知道在哪里可以找到描述此过程的函数定义。我们不要求代码或完成此任务的确切方法;我们只是想知道可以使用哪些函数和/或在哪个头文件中找到它们。我们已经浏览了 linux/dma-mapping.h 似乎令人作呕。我们也研究了 LDD3 一段时间,但它似乎彻底完成了设置 DMA 的过程,但没有提供太多关于应该使用哪些函数来实际开始 DMA 传输的信息。

最佳答案

drivers/dma 目录中最近的 Linux 内核中有“DMA 引擎”API 支持能够进行内存到内存复制的本地 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 interrupts : request_irq(pci_irq, irq_handler, IRQF_SHARED, "pci_irq_handler0", &major)

关于linux - 是否可以在 Linux 中进行内存到内存的 DMA 传输?如果是这样,什么函数调用 DMA 开始传输?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44687809/

相关文章:

rust - 如何在Rust结构实现中编写SPI DMA代码?

c - 使用 STM32F103 微 Controller (Cortex-M3) 重新编程 DMA 起始地址

linux - 如何在内核模块中禁用高速缓存

linux - 使用 FOR/F %I IN () DO(复制)命令复制文件,文件包含空间

C:套接字编程设计选项

c - 为什么 execvp() 使用 fork() 执行两次?

linux - 如何调试 Linux I2S 音频输入问题

linux - 为什么 du 命令在文件夹和父文件夹中显示不同的总数

c - 如何通过 getaddrinfo 限制建议端口的数量

c - Linux 内核设备驱动程序中的分散聚集列表