我目前正在为PCIe设备编写驱动程序,该驱动程序应该使用DMA将数据发送到Linux系统。据我了解,我的PCIe设备需要DMA控制器(DMA主设备)和Linux系统(DMA从设备)。当前,PCIe设备没有DMA控制器,因此不应获得一个。这让我感到困惑。
A。有可能吗?
我为此做了所有设置,我唯一想念的是如何将数据从PCIe寄存器传输到内存。
B。我需要调用哪个系统调用(或一系列)来进行DMA传输?
C。我可能需要在Linux系统上设置DMA,但是我发现指向假定有从站的代码,例如struct dma_slave_config。
用例是从PCIe设备收集数据并将其在内存中提供给用户空间。
非常感谢您的帮助。预先感谢!
答案 0 :(得分:2)
DMA完全独立于CPU及其上运行的任何软件(即OS内核)。 DMA是设备在不涉及主机CPU的情况下对主机内存执行内存读写的一种方式。
DMA通常的工作方式是这样的:软件将在内存中分配DMA可访问区域,并与设备共享物理地址,例如,通过对与设备BAR之一关联的地址空间执行内存写操作。然后,设备将对该内存块执行DMA读取或写入操作。该操作完成后,设备将向设备驱动程序发出中断,以便它可以处理数据和/或释放内存。如果您的设备不具备对主机存储器发出DMA读或写的能力,那么您将只能使用CPU与之交互。离散DMA控制器已经很久没有出现了。