8

我有一个 NIC 卡和一个 HDD 都连接在 Linux 机器的 PCIe 插槽上。理想情况下,我希望在不涉及 CPU 或最少涉及 CPU 的情况下将传入的数据包汇集到 HDD。是否可以像这样沿 PCI 总线建立直接通信?有没有人知道要阅读什么才能开始这样的项目?

谢谢大家。

4

2 回答 2

10

不确定您问的是 PCI 还是 PCIe。您使用了这两个术语,每个术语的答案都不同。

如果您谈论的是传统 PCI 总线: 答案是“是”。板对板 DMA 是可行的。例如,视频采集板可以将视频帧直接 DMA 到您的显卡内存中。

在您的示例中,视频卡可以直接 DMA 到存储设备。但是,数据将非常“原始”。例如,您的 NIC 将没有文件系统的概念。您还需要确保您可以对 NIC 的 DMA 引擎进行编程,使其位于 SATA 控制器寄存器的范围内。你不想离开酒吧的尽头!

如果您谈论的是现代 PCIe 总线: 答案是“通常不会,但这取决于”。对等总线事务在 PCI Express 规范中是一件有趣的事情。不需要根复杂设备来支持它。

在我的测试中,如果您的设备位于 PCIe 交换机后面(不直接插入主板),点对点 DMA 将起作用。但是,如果您的设备直接连接到芯片组(根联合体),点对点 DMA 将无法工作,除非在某些特殊情况下。最值得注意的特殊情况是我之前提到的视频捕获示例。芯片组数据表中提到了特殊情况。

我们已经使用几种不同的 Intel 和 AMD 芯片组测试了对等 PCIe DMA,并发现了一致的行为。不过,尚未测试最新一代的芯片组。(我们已经与英特尔讨论了缺乏对等 PCIe DMA 支持的问题,不确定我们的反馈是否对他们的工程部门产生了影响。)

于 2012-08-01T20:41:17.437 回答
2

假设 NIC 卡和 HDD 都是端点(或传统端点),您无法在不涉及根联合体 (CPU) 的情况下汇集流量。

PCIe 与 PCI 或 PCI-X 不同,它不是总线而是链路,因此来自端点设备(例如 NIC)的任何事务都必须通过根联合体 (CPU) 才能到达另一个分支 (HDD) .

于 2012-07-01T19:49:29.373 回答