PCIe 热插拔在实践中真的有效吗?

电器工程 pcie
2022-01-28 13:30:45

我在https://security.stackexchange.com/questions/109199/is-physical-security-less-important-now-for-securing-a-server?noredirect=1#comment194327_109199的评论中进行了讨论

问题很简单。有没有人成功热插拔 PCIe 卡的经验?它是否需要特殊的主板和卡,或者它应该适用于所有消费类硬件?

4个回答

我曾经设计的 PCI-Express 硬件需要硬件和软件上的完全热插拔支持,这当然是可能的,但它涉及的内容非常多,需要大量的软件支持——硬件实际上非常简单。我必须设计硬件,然后实现 BIOS (UEFI) 和内核 (Linux) 支持,以通过光纤和铜线热插拔任意 PCIe 设备。

从软件的角度来看,必须记住 PCIe 延续了 PCI 软件模型,包括总线、设备、功能寻址的概念。当枚举 PCI 总线时,它是作为广度优先搜索完成的: 来自 tldp.org 的 PCI 总线拓扑

PCIe 枚举通常进行两次。首先,您的 BIOS(UEFI 或其他)会执行此操作,以确定谁在场以及他们需要多少内存。然后可以将这些数据传递给可以按原样处理的主机操作系统,但 Linux 和 Windows 通常也会执行它们自己的枚举过程。在 Linux 上,这是通过核心 PCI 子系统完成的,该子系统搜索总线,在必要时根据设备的 ID 应用任何怪癖,然后在其探测函数中加载具有匹配 ID 的驱动程序。PCI 设备是通过它的供应商 ID(16 位,例如 Intel 是 0x8086)和设备 ID(另一个 16 位)的组合来识别的——最常见的互联网来源在这里:http://pcidatabase.com /

自定义软件部分在此枚举过程中出现,即您必须提前为潜在的未来设备保留 PCI 总线编号和内存段——这有时称为“总线填充”。这避免了将来重新枚举总线的需要,这通常不能在不中断系统的情况下完成。PCI 设备具有 BAR(基地址寄存器) 向主机请求设备需要多少和什么类型(内存或 I/O 空间)内存——这就是你不再需要像 ISA 这样的跳线的原因 :) 同样,Linux 内核通过 pciehp 实现 PCIe 热插拔司机。Windows 会根据版本做不同的事情——旧版本(我认为是 XP)会忽略 BIOS 所说的任何内容并进行自己的探测。我认为较新的版本更尊重主机固件 (BIOS/EFI) 提供的 ACPI DSDT,并将包含该信息。

这可能看起来很复杂,而且确实如此!但是请记住,任何带有 ExpressCard 插槽的笔记本电脑/设备(实现 PCIe,因为您可以拥有仅 USB 的 ExpressCard)必须这样做,尽管通常填充非常简单——只有一条总线。我的旧硬件曾经是一个 PCIe 交换机,后面有另外 8 个设备,所以填充变得有点复杂。

从硬件的角度来看,这要容易得多。卡的 GND 引脚首先接触,我们会在卡上放置一个来自 LTC 或类似产品的热插拔控制器 IC,以便在连接完成后对电源进行排序。此时,板载 ASIC 或 FPGA 开始其上电序列,并开始尝试对其 PCI Express 链路进行链路训练。假设主机支持热插拔和 PCI Express SLTCAP / SLTCTRL寄存器(在规范中:PCI Express 插槽能力寄存器,PCI Express 插槽控制寄存器。这也有 1 和 2 —— 足够的位可以分成两个寄存器)。对于该端口已配置为指示该端口支持热插拔,软件可以开始枚举新设备。插槽状态(SLTSTA,PCI Express 插槽状态寄存器)寄存器包含目标设备可以设置的位,指示电源故障、机械释放锁存器,当然还有存在检测 + 存在改变。

上述寄存器位于“PCI(Express)配置空间”中,这是分配给每个潜在 bdf(总线:设备:功能)的内存映射(PCIe 为 4K)的一个小区域。实际的寄存器通常驻留在外围设备上。

在主机端,我们可以使用 PRSNT1#/PRSNT2# 作为简单的直流信号,为电源开关 IC 的使能供电,或者运行到芯片组/PCH 上的 GPIO 以引起 IRQ 并触发 SW '嘿,有东西被插入,去寻找它并配置它!常规。

有很多信息不能直接回答您的问题(请参阅下面的快速摘要),但希望它能为您提供更好的背景知识来理解该过程。如果您对流程的特定部分有任何疑问,请在此处发表评论或给我发电子邮件,我可以进一步讨论 + 使用该信息更新此答案。

总而言之——外围设备的设计必须考虑到硬件 POV 的热插拔支持。设计合理的主机/插槽也可以热插拔,在高端主板上我希望它是安全的。但是,对此的软件支持完全是另一个问题,不幸的是,您要感谢您的 OEM 提供给您的 BIOS。

实际上,只要您从计算机中移除/插入 PCIe ExpressCard,您就可以使用此技术。此外,高性能刀片系统(电信或其他)也经常使用该技术。

最后的评论——保存与基本规范链接的 PDF,PCI-SIG 通常会为此收费 :)

如果上游开关已将电源状态监控连接暴露给连接器,并且可插拔单元已暴露这些引脚并配置为正确使用它们,并且(如 Jippie 所述)软件可以检测到热插拔事件并正确响应,则答案是肯定的。

通常,此功能主要用于服务器场和数据中心,用于热插拔 PCIe 磁盘等;我不确定消费类设备是否完全支持热插拔(据我所知,规范中是可选的)。

请记住,提供必要的硬件来支持热插拔是要花钱的(虽然大部分都在 PCIe 端点内,但仍然需要设置,通常通过 eeprom),通常不会在价格敏感的市场中提供。

请注意,动态更新 PCI 地址映射会显着增加PCI(e) 驱动程序的复杂性;如果插入了一个新设备,那么它必须映射到它所在的任何总线,并带有相关的新地址转换,但是如果一个设备被移除然后用不同的东西替换,它会使跟踪 PCI 空间地址变得非常复杂.

如果没有这种复杂性,PCI 子系统会被扫描一次(在系统重置时)并保持静态;无需进一步努力。

这是PCIe v3.0 Base Spec,第 514 页,关于热插拔支持的第 6.7 节。此处提供了支持热插拔的 PCIe 卡示例,由iocrest提供。可以清楚地看到较短的连接器走线被布线: 2 端口 SATA III (6G) PCI-e 控制器卡,Marvell 88SE9120 芯片组

然而,在这张Axxon卡上,可以清楚地看到较短的走线路由到相邻的走线。仅在物理级别上,此卡无法支持热插拔: MAP/950 1 个用于 PCI Express (PCIe) 的 RS232 串行端口 I/O 卡

它应该适用于所有符合 PCIe 的硬件,是否所有消费类硬件都真正符合标准是一个很好的问题,因为我对 PCIe 规范的了解并不深入,无法了解测试要求,即便如此,所有零售商都会检查索赔的有效性吗?我认为几乎没有人这样做。

就像整个安全标准一样。我们拥有的 EE 标签的一半(<-hyperbole?)您可以声称兼容,而无需对您所做的一切进行测试。由于热插拔的东西不会危及生命,我无法想象人们对此会更加严格。

一方面,我从未尝试过,看到我的 Clevo 笔记本电脑将台式机完全赶出了我的房子,我不打算尝试它,因为我笔记本电脑中的 GPU 模块声称没有热插拔功能,而且太贵了戴夫·琼斯(Dave Jones)为爆炸性 GPU 的视频获得了美元。

是的,它有效。我能够让它热插拔路由器机箱线卡(包含 10 多个 PCIe 设备)。机箱有 16 个热插拔卡。任何一张卡都可以在运行时随机插入或拔出,​​而不影响其他卡上的流量操作。

使其工作的复杂性取决于 CPU 环境。在嵌入式 CPU 上,工作只是设置静态资源映射并通过附加和分离 PCI 设备来处理连接更改事件。在 x86 上,由于错误处理和 BIOS/OS 交互的复杂性,它涉及的更多。