我有一个 NIC 卡和一个 HDD 都连接在 Linux 机器的 PCIe 插槽上。理想情况下,我希望在不涉及 CPU 或最少涉及 CPU 的情况下将传入的数据包汇集到 HDD。是否可以像这样沿 PCI 总线建立直接通信?有没有人知道要阅读什么才能开始这样的项目?
谢谢大家。
我有一个 NIC 卡和一个 HDD 都连接在 Linux 机器的 PCIe 插槽上。理想情况下,我希望在不涉及 CPU 或最少涉及 CPU 的情况下将传入的数据包汇集到 HDD。是否可以像这样沿 PCI 总线建立直接通信?有没有人知道要阅读什么才能开始这样的项目?
谢谢大家。
不确定您问的是 PCI 还是 PCIe。您使用了这两个术语,每个术语的答案都不同。
如果您谈论的是传统 PCI 总线: 答案是“是”。板对板 DMA 是可行的。例如,视频采集板可以将视频帧直接 DMA 到您的显卡内存中。
在您的示例中,视频卡可以直接 DMA 到存储设备。但是,数据将非常“原始”。例如,您的 NIC 将没有文件系统的概念。您还需要确保您可以对 NIC 的 DMA 引擎进行编程,使其位于 SATA 控制器寄存器的范围内。你不想离开酒吧的尽头!
如果您谈论的是现代 PCIe 总线: 答案是“通常不会,但这取决于”。对等总线事务在 PCI Express 规范中是一件有趣的事情。不需要根复杂设备来支持它。
在我的测试中,如果您的设备位于 PCIe 交换机后面(不直接插入主板),点对点 DMA 将起作用。但是,如果您的设备直接连接到芯片组(根联合体),点对点 DMA 将无法工作,除非在某些特殊情况下。最值得注意的特殊情况是我之前提到的视频捕获示例。芯片组数据表中提到了特殊情况。
我们已经使用几种不同的 Intel 和 AMD 芯片组测试了对等 PCIe DMA,并发现了一致的行为。不过,尚未测试最新一代的芯片组。(我们已经与英特尔讨论了缺乏对等 PCIe DMA 支持的问题,不确定我们的反馈是否对他们的工程部门产生了影响。)
假设 NIC 卡和 HDD 都是端点(或传统端点),您无法在不涉及根联合体 (CPU) 的情况下汇集流量。
PCIe 与 PCI 或 PCI-X 不同,它不是总线而是链路,因此来自端点设备(例如 NIC)的任何事务都必须通过根联合体 (CPU) 才能到达另一个分支 (HDD) .