我正在研究这样一种情况:PCI/PCIe 机箱中有多个相同的 (National Instruments) PCIe DAQ 模块,通过单机箱或双机箱控制器连接。在最坏的情况下,总线上可能有 8 个相同的模块。
我一直认为 PCI 枚举是非确定性的 - 即无法保证每次启动时 PCI 总线都会以相同的顺序进行枚举。这是真的吗?
这是否也意味着即使物理硬件布局没有改变,PCI(e) 总线/设备/功能值也可以在启动时改变?
简而言之,我理解初始 PCI 枚举是由 BIOS 完成的,并且启动操作系统(在我的情况下是 RHEL 6)使用此枚举列表来服务已识别的硬件。此列表是否始终以相同的顺序包含找到的设备?
这是一个暗示红帽 Bugzilla这意味着 BIOS 顺序总是相同的。
请注意,我(还没有)谈论操作系统处理设备的顺序(例如,在 Linux 中,确定 /dev/ 名称顺序)。
谢谢!
答案1
如果 BIOS(执行初始枚举)符合 PCI 规范,那么简短的回答是“是”。
依据:《PCI Express 系统架构》R. Budruk、D. Anderson、T. Shanley,ADDISON-WESLEY DEVELOPER´S PRESS,2003 年。ISBN:0-321-15630-7,第 743 页:
规范指出枚举软件必须执行深度优先搜索,因此在继续发现总线 0 上的其他功能/设备之前,必须先搜索总线 1。
对于红帽企业版 6:
9. 设备和设备驱动程序
PCI 设备订购
在 Red Hat Enterprise Linux 6 中,PCI 设备排序基于 PCI 设备枚举。PCI 设备枚举基于 PCI 枚举算法(先深度后广度),并且每个系统类型都是恒定的。此外,一旦发现设备,模块加载过程就会按顺序进行,从而提供接口的持久命名。
但是,(某些版本的)Linux 支持内核参数“pci=bfsort”,它将 Linux 枚举算法更改为“广度优先”。这将改变 Linux 内核加载和初始化 PCI 设备的顺序,与 BIOS 的加载和初始化顺序不同。
无论如何,从启动到启动,枚举列表仍将按相同顺序包含检测到的项目。