我对使用 PCIe 设备进行 DMA 传输有点困惑。
例如,我有一个从属 PCIe 设备,我想使用 DMA 事务将数据块从设备传输到 RAM。请注意,该设备是从设备,并且上面没有 DMA“机器”。
我知道我需要首先在 RAM 中获得一个支持 DMA 的缓冲区(通过分配一个一致的缓冲区,或者通过映射一个页面)。
但接下来是什么?启动从地址 S 到地址 D 的 N 个字节的 DMA 传输的 API 是什么?
现代系统可以向/从从pci 设备发出 DMA 传输吗?如果是这样,那么 Linux API 是什么?
如此处所述:
[ISA] 在最初的 IBM PC 中,只有一个 Intel 8237 DMA 控制器 [...] PCI 架构没有中央 DMA 控制器,这与 ISA 不同。相反,任何 PCI 组件都可以请求控制总线(“成为总线主机”)并请求读取和写入系统内存
PCI 总线没有“中央”DMA 控制器——相反,每个设备都可以是一个 DMA“控制器”。