我有一个 NIC 卡和一个 HDD,它们都连接在 Linux 机器的 PCIe 插槽上。理想情况下,我希望将传入数据包传输到 HDD,而不涉及 CPU,或最少涉及 CPU。是否可以像这样沿着 PCI 总线建立直接通信?有谁知道要阅读什么内容才能开始这样的项目吗?
谢谢大家。
不确定您问的是 PCI 还是 PCIe。您使用了这两个术语,并且每个术语的答案都不同。
如果您谈论的是传统 PCI 总线:答案是“是”。板对板 DMA 是可行的。例如,视频捕获板可以将 DMA 视频帧直接传输到显卡内存中。
在您的示例中,视频卡可以直接 DMA 到存储设备。然而,这些数据将是相当“原始”的。例如,您的网卡没有文件系统的概念。您还需要确保可以对 NIC 的 DMA 引擎进行编程,使其位于 SATA 控制器寄存器的范围内。您不想走出酒吧的尽头!
如果您谈论的是现代 PCIe 总线:答案是“通常不会,但这取决于情况”。在 PCI Express 规范中,点对点总线事务是一件有趣的事情。根联合体设备不需要支持它。
在我的测试中,如果您的设备位于 PCIe 交换机后面(未直接插入主板),则点对点 DMA 将起作用。但是,如果您的设备直接连接到芯片组(Root Complex),点对点 DMA 将无法工作,除某些特殊情况外。最值得注意的特殊情况是我之前提到的视频捕获示例。芯片组数据表中提到了特殊情况。
我们使用一些不同的 Intel 和 AMD 芯片组测试了点对点 PCIe DMA,并发现了一致的行为。但尚未测试最新一代的芯片组。 (我们已经与 Intel 讨论了缺乏对等 PCIe DMA 支持的问题,不确定我们的反馈是否对他们的工程部门产生了任何影响。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)