pci-bus - 两个 PCI 设备之间的直接通信

标签 pci-bus

我有一个 NIC 卡和一个 HDD,它们都连接在 Linux 机器的 PCIe 插槽上。理想情况下,我希望在不涉及 CPU 或最少涉及 CPU 的情况下将传入数据包传送到 HDD。是否可以像这样沿着 PCI 总线建立直接通信?有没有人有关于开始这样一个项目的阅读内容的指示?

谢谢大家。

最佳答案

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

如果您在谈论传统 PCI 总线:答案是"is"。板对板 DMA 是可行的。例如,视频捕获板可以将视频帧直接 DMA 到您的图形卡内存中。

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

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

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

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

关于pci-bus - 两个 PCI 设备之间的直接通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2822561/

相关文章:

c++ - mmap 通过 PCI 将 VME 总线覆盖到用户空间内存中?

c++ - 如何读取 PCIe 总线上使用的带宽?

Java访问pci-modem

linux-kernel - cdev 及其关联的文件操作如何工作?

windows - 使用 Win32 API 访问 PCI 配置空间

c - 从 pci-/pcie-card 读取芯片 ID

linux - 如何解读/proc/bus/pci/devices的内容?

c - uboot函数pci_hose_read_config_word()定义?

Linux Kernel 4.7 (Arch ARM64) 不在/sys/bus/pci/devices/*/中为 PCI BAR0 创建 "resource0"文件