Linux PCIe DMA驱动程序

时间:2019-07-09 15:26:34

标签: linux-kernel linux-device-driver dma pci-e

我目前正在为PCIe设备编写驱动程序,该驱动程序应该使用DMA将数据发送到Linux系统。据我了解,我的PCIe设备需要DMA控制器(DMA主设备)和Linux系统(DMA从设备)。当前,PCIe设备没有DMA控制器,因此不应获得一个。这让我感到困惑。

A。有可能吗?

  1. PCIe设备发送中断
  2. 等待Linux驱动程序中的中断
  3. 开始从内存映射的PCIe寄存器到Linux系统DMA的DMA传输。
  4. 从用户空间的内存中读取数据

我为此做了所有设置,我唯一想念的是如何将数据从PCIe寄存器传输到内存。

B。我需要调用哪个系统调用(或一系列)来进行DMA传输?

C。我可能需要在Linux系统上设置DMA,但是我发现指向假定有从站的代码,例如struct dma_slave_config。

用例是从PCIe设备收集数据并将其在内存中提供给用户空间。

非常感谢您的帮助。预先感谢!

1 个答案:

答案 0 :(得分:2)

根据定义,

DMA完全独立于CPU及其上运行的任何软件(即OS内核)。 DMA是设备在不涉及主机CPU的情况下对主机内存执行内存读写的一种方式。

DMA通常的工作方式是这样的:软件将在内存中分配DMA可访问区域,并与设备共享物理地址,例如,通过对与设备BAR之一关联的地址空间执行内存写操作。然后,设备将对该内存块执行DMA读取或写入操作。该操作完成后,设备将向设备驱动程序发出中断,以便它可以处理数据和/或释放内存。

如果您的设备不具备对主机存储器发出DMA读或写的能力,那么您将只能使用CPU与之交互。离散DMA控制器已经很久没有出现了。

相关问题