2

我对使用 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“控制器”。

4

1 回答 1

1

首先,现代PC内部没有奴隶和奴隶持有者。有南桥(在 PCI 中)或 Root Complex(PCI-express 设备树的根),还有一些其他 PCI/PCIe 参与者,如桥接器、焊接芯片、插卡、硬件调试器等。我假设你是询问插入的卡或其他一些外围设备,如焊接声卡或以太网芯片。

根据这个“Transaction Layer Packet”(TLP,“PCIe的最上层”)的详细描述,有“Bus Mastership (DMA)”:

在 PCIe 上,它明显不那么奇特。...总线上的任何人都可以在总线上发送读写 TLP,就像根复合体一样。这允许外设直接访问 CPU 的内存 (DMA) 或与对等外设交换 TLP(在交换实体支持的范围内)。

此外,插入设备的 DMA 功能还有一些好处:DMA 攻击。PCIe 被列为能够启动 DMA 传输:

如果系统具有 FireWire、ExpressCard、Thunderbolt 或其他扩展端口,通常像 PCI 和PCI-Express一样,将连接的设备直接连接到物理地址空间,则系统可能容易受到外部设备的 DMA 攻击。

我认为,没有用于编程从外围设备本身启动的 DMA 传输的通用 API。这取决于设备是什么、应该何时启动 DMA 以及将发送什么。

于 2012-06-08T22:18:45.570 回答