Linux PCIe DMA 驱动程序



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

一个。以下可能吗?

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

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

二.我需要调用哪个系统调用(或一系列)才能进行 DMA 传输?

三.我可能需要在 Linux 系统上设置 DMA,但我发现的内容指向假设存在从属的代码,例如结构dma_slave_config。

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

任何帮助都非常感谢。提前感谢!

根据定义,DMA完全独立于CPU和在其上运行的任何软件(即操作系统内核)。 DMA 是设备针对主机内存执行内存读取和写入的一种方式,无需主机 CPU 的参与。

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

如果您的设备无法对主机内存发出 DMA 读取或写入,则您只能使用 CPU 与它进行交互。 分立式DMA控制器

已经很久没有出现过了。

最新更新