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