2010-05-12 87 views
6

我有一个NIC卡和一个HDD都连接在Linux机器的PCIe插槽上。理想情况下,我希望将传入的数据包传送到HDD而不涉及CPU,或者将其最小化。可以像这样在PCI总线上建立直接通信吗?有没有人有指示什么要阅读以开始这样的项目?两个PCI设备之间的直接通信

谢谢大家。

+0

您是否正在使用任何编程? – Jonas 2010-05-12 20:46:47

+0

是的。目前还没有任何东西被写入,但我认为它会在C中。我只是想知道是否可以直接沟通。 – mindloss 2010-05-13 15:37:02

回答

2

假设NIC卡和HDD都是端点(或传统端点),则无法在不涉及根联合体(CPU)的情况下获取流量。与PCI或PCI-X不同,PCIe不是总线,而是链接,因此任何来自Endpoint设备(例如NIC)的事务都必须通过根联合体(CPU)才能到达另一个设备分支(HDD)。

6

不确定是否询问PCI或PCIe。您使用了两个词,每个词的答案都不相同。

如果您正在谈论传统PCI总线:答案是肯定的。董事会登上DMA是可行的。例如,视频采集卡可以将DMA视频帧直接存储到显卡存储器中。

在您的示例中,视频卡可以直接DMA存储设备。但是,这些数据将是非常“原始的”。例如,你的网卡没有文件系统的概念。您还需要确保您可以将NIC的DMA引擎编程为位于SATA控制器寄存器的范围内。你不想走出BAR的尽头!

如果您正在谈论现代PCIe总线:答案是“通常不,但取决于”。点对点总线交易在PCI Express规范中是一件有趣的事情。根联合体设备不需要支持它。

在我的测试中,如果您的设备位于PCIe交换机(不直接插入主板)后面,对等DMA将可以正常工作。但是,如果您的设备直接连接到芯片组(根复合体),则对等DMA将不起作用,除外,在某些特殊情况下除外。最显着的特例是我前面提到的视频捕捉示例。芯片组数据手册中提到了特殊情况。

我们用几种不同的英特尔和AMD芯片组测试了对等PCIe DMA,并发现一致的行为。虽然没有测试过最新一代的芯片组。 (我们已经讨论过英特尔缺乏对等PCIe DMA支持,不确定我们的反馈对他们的工程部门是否有任何影响。)