PCIe热插拔实际上是否可以正常工作?


20

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

问题很简单。有没有人能成功热插拔PCIe卡?它需要特殊的主板和卡,还是应该在所有消费类硬件上都可以使用?


1
答案应该是两个方面。硬件和软件(其驱动程序)都应支持热插拔。
jippie 2015年

我不知道这是否有帮助,但是我只是成功地从kvm Windows机器中删除了第二个通过的GPU,而没有影响到第一个GPU(屏幕仅闪烁了一秒钟)。
feedc0de

Answers:


43

我曾经设计过PCI-Express硬件,它要求在硬件和软件中提供完全的热插拔支持,这确实是可能的,但是它涉及很多并且需要广泛的软件支持-硬件实际上非常简单。我必须设计硬件,然后实现BIOS(UEFI)和内核(Linux)支持,以便通过光纤和铜缆热插拔任意PCIe设备。

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

PCIe枚举通常进行两次。首先,您的BIOS(UEFI或其他方式)将执行此操作,以确定谁在场以及需要多少内存。然后可以将该数据传递给可以按原样使用的主机OS,但是Linux和Windows通常也执行它们自己的枚举过程。在Linux上,这是通过核心PCI子系统完成的,该子系统搜索总线,并根据设备的ID进行必要的古怪,然后在其探测功能中加载具有匹配ID的驱动程序。通过PCI设备的供应商ID(16位,例如Intel为0x8086)和设备ID(其他16位)的组合对ID设备进行ID识别-最常见的Internet来源是: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(快速)配置空间”中,这是分配给每个潜在bdf(总线:设备:功能)的内存映射的较小区域(PCIe为4K)。实际的寄存器通常位于外围设备上。

在主机端,我们可以将PRSNT1#/ PRSNT2#用作简单的DC信号,以馈入电源开关IC的使能,或者运行到芯片组/ PCH上的GPIO引起IRQ并触发SW'嘿,插入了某些东西,找到它并进行配置!” 常规。

这是很多信息,不能直接回答您的问题(请参见下面的快速摘要),但希望它可以为您提供更好的理解过程的背景。如果您对过程的特定部分有任何疑问,请在此处的评论中告诉我,或给我发送电子邮件,我可以进一步讨论,并用相应的信息更新此答案。

总而言之 -外围设备在设计时必须考虑到硬件POV的热插拔支持。设计正确的主机/插槽也可以热插拔,在高端主板上,我希望它是安全的。但是,对此软件的支持完全是另一个问题,很遗憾,您会迷恋OEM提供的BIOS。

实际上,只要从计算机上卸下/插入PCIe ExpressCard,就可以使用此技术。此外,高性能刀片系统(电信或其他方式)也定期使用此技术。

最后意见-保存基本规范链接的PDF,PCI-SIG通常为此收费:)


2
为了结束安全性讨论,使用相对便宜的FPGA(如Cyclone IV GX)作为PCIe设备,您的主机就完成了-FPGA可以执行所需的任何DMA操作。
克鲁纳尔·德赛

很好的解释。交换支持热插拔的PCIe卡会怎样?一方面,操作系统必须再次枚举PCIe拓扑,并看到已插入新设备(它无法预测BAR的大小/新插入的设备可能会请求的总线数量),但另一方面-重新枚举系统可能无法实现,而不会影响已分配给拓扑中现有设备的资源...
so.very.tired

2
是的,这很棘手。因此,以ExpressCard(EC)为例,我做到的一种方法是“填充”总线数量以支持添加可能会分支到更多设备的设备。大多数具有简单EC插槽的BIOS只需将其填充一个总线号(我们使用该插槽将其扩展到许多PCIe设备)。同样,您可以“填充”可能的存储范围以在其中分配,以支持具有连续地址范围的各种设备,与IRQ相同。然后,操作系统(具有/不具有ACPI)可以执行其操作。它实际上是“简单的”,但是现代机器中SW层的复杂性使其变得更加困难。
Krunal Desai

PCIe枚举实际上不是深度优先搜索吗?基本寄存器和限制寄存器的设置使得在移至下一个端口之前,必须枚举给定端口以下的所有设备。
alex.forencich

8

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

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

请记住,提供必要的硬件来支持热插拔会花费金钱(尽管大多数硬件都在PCIe端点内,但仍必须通过eeprom对其进行设置),但通常不会在价格敏感的市场中提供。

需要注意的是动态更新的PCI地址映射增加显著复杂的PCI(E)的驱动程序; 如果插入了新设备,则必须使用相关的新地址转换将其映射到它所赖以生存的任何总线上,但是如果设备被移除然后被替换为其他不同的东西,则使PCI空间地址的跟踪变得非常复杂。

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

这是PCIe v3.0基本规范,第514页,有关热插拔支持的第6.7节。iocrest提供了一个支持热插拔的PCIe卡示例。可以清楚地看到较短的连接器走线是经过布线的: 2端口SATA III(6G)PCI-e控制器卡,Marvell 88SE9120芯片组

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


2

它应该可以在所有符合PCIe的硬件上工作,是否所有消费类硬件都真正符合标准是个好问题,因为我对PCIe规范并不了解测试要求,即使如此,所有零售商都可以检查索赔的有效性吗?我想几乎没有。

很像整个安全标准。我们拥有的EE标签有一半(<-hybole ??),您可以声称与之兼容,而无需测试所有产品。因为热插拔的东西不会威胁生命,所以我无法想象人们对此有更严格的要求。

我从来没有尝试过,并且看到我的Clevo笔记本电脑将台式机完全搬出我的家时,我不打算尝试它,因为我的笔记本电脑中的GPU模块声称没有热插拔功能,而且如果不安装它就太昂贵了戴夫·琼斯(Dave Jones),并且获得$$的GPU爆炸声。


1

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.