什么导致 PCI ID 发生变化

tbe*_*nz9 3 kernel pci udev

lspci在我的 RHEL 7.2 机器上运行时,我注意到我的以太网适配器更改了 PCI 总线 ID。在下面的示例中,它从“02:00.x”更改为“03:00.x”。

  1. 这可能是什么原因造成的?
  2. 有没有办法强制它到特定地址?

前:

[root@rhel:~]# lspci | grep Ethernet
02:00.0 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01)
02:00.1 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01)
Run Code Online (Sandbox Code Playgroud)

当前的:

[root@rhel:~]# lspci | grep Ethernet
03:00.0 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01)
03:00.1 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01)
Run Code Online (Sandbox Code Playgroud)

Sim*_*ter 5

除了根总线(通常是平台总线,例如 PC 上的 ACPI)之外的所有总线都从根总线桥接,并且它们的顺序取决于枚举。

现在通常总线枚举主要是确定性的,因为在总线上找到设备的顺序通常是静态的,但不能保证这一点,当两个总线桥连接时,枚举是并行的:

  1. 开始枚举 ACPI 总线
  2. 在 ACPI 总线上找到 PCIe 桥 1,分配总线 ID 0
  3. 开始枚举 PCIe 总线 0
  4. 在 ACPI 总线上找到 PCIe 桥 2,分配总线 ID 1
  5. 在 PCIe 总线 0 上找到 PCI 桥 1,分配总线 ID 2
  6. 在 ACPI 总线上找到 PCIe 桥 3,分配总线 ID 3

两个枚举线程之间没有排序,因此 PCI 桥可以得到 1、2 或 3 的 ID。