我无法理解系统上的设备模型和 PCIe 拓扑。我列出了我一直在查看的输出,并尝试解释我对其中内容的心理模型,希望它能帮助突出我不理解的内容。
我的输出
$: lspci -t
-[0000:00]-+-00.0
+-00.2
+-01.0
+-01.1-[01-03]----00.0-[02-03]----00.0-[03]--+-00.0 # 1
| \-00.1 # 2
+-01.2-[04-0b]----00.0-[05-0b]--+-01.0-[06]----00.0
| +-04.0-[07]----00.0
| +-05.0-[08]----00.0
| +-08.0-[09]--+-00.0
| | +-00.1
| | \-00.3
| +-09.0-[0a]----00.0
| \-0a.0-[0b]----00.0
# ...
$: lspci
00:00.0 Host bridge: Advanced Micro Devices, Inc. [AMD] Renoir/Cezanne Root Complex
# ...
00:01.0 Host bridge: Advanced Micro Devices, Inc. [AMD] Renoir PCIe Dummy Host Bridge
00:01.1 PCI bridge: Advanced Micro Devices, Inc. [AMD] Renoir PCIe GPP Bridge
# ...
01:00.0 PCI bridge: Advanced Micro Devices, Inc. [AMD/ATI] Navi 10 XL Upstream Port of PCI Express Switch (rev c0)
02:00.0 PCI bridge: Advanced Micro Devices, Inc. [AMD/ATI] Navi 10 XL Downstream Port of PCI Express Switch
03:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Navi 21 [Radeon RX 6800/6800 XT / 6900 XT] (rev c0)
03:00.1 Audio device: Advanced Micro Devices, Inc. [AMD/ATI] Navi 21 HDMI Audio [Radeon RX 6800/6800 XT / 6900 XT]
# ...
$ ls /sys/bus/pci/devices/
# ...
0000:00:01.0 -> ../../../devices/pci0000:00/0000:00:01.0/
0000:00:01.1 -> ../../../devices/pci0000:00/0000:00:01.1/ # 3
0000:00:01.2 -> ../../../devices/pci0000:00/0000:00:01.2/
# ...
0000:01:00.0 -> ../../../devices/pci0000:00/0000:00:01.1/0000:01:00.0/ # 4
0000:02:00.0 -> ../../../devices/pci0000:00/0000:00:01.1/0000:01:00.0/0000:02:00.0/ #5
0000:03:00.0 -> ../../../devices/pci0000:00/0000:00:01.1/0000:01:00.0/0000:02:00.0/0000:03:00.0/
0000:03:00.1 -> ../../../devices/pci0000:00/0000:00:01.1/0000:01:00.0/0000:02:00.0/0000:03:00.1/
# ...
尝试解释
设备00:00.0
是仅有的总线与 CPU 接口,它控制总线 00 上的所有流量。CPU 可以00:00.0
直接与之接口,以配置它如何控制总线 00,但除此之外,它本质上是 CPU 与总线上其他设备通信的被动隧道。
设备00:01
是总线 00 上的物理控制器,扮演“子”角色(其操作方式与总线 00 上的任何其他设备相同)。它提供 3 种不同的功能:
- 00:01.0 主桥...PCIe 虚拟主桥
- 00:01.1 通往 01 号总线的桥梁
- 00:01.2 通往 02 号总线的桥梁
我大概将 00:01.0 解释为其他 2 个功能的配置/控制类型的接口。这是一个合理的假设吗?
对于桥接器,从 /sys/bus/pci/devices 中的链接,我们看到00:01.1
指向总线 00 上直接同名的设备。此外,01:00.0
指向嵌套在下面的设备00:01.1
(行 3 和 4 表示)。
此时,我认为这01:00.0
是一个总线控制器(概念上类似于00:00.0
),它需要发送所有通信才能00:01.1
到达 CPU。
但是,02:00.0
它嵌套得更深01:00.0
,并且没有类似的桥接设备来连接总线。我期望总线 02 可以:
- 镜像之前的嵌套。例如,我认为会有两个设备:
01:01.0
(Dummy)和01:01.1
(bridge),并且 bridge 会首先嵌套在目录中,然后才是 bus 02。 - 或者总线 02 和 03 将与总线 01 位于同一目录中,例如:
line 5:
0000:02:00.0 -> ../../../devices/pci0000:00/0000:00:01.1/0000:01:00.0/0000:02:00.0/
my expectation for what it would look like for case 1:
0000:02:00.0 -> ../../../devices/pci0000:00/0000:00:01.1/0000:01:00.0/0000:01:01.1/0000:02:00.0/
my expectation for what it would look like for case 2:
0000:02:00.0 -> ../../../devices/pci0000:00/0000:00:01.1/0000:02:00.0/
问题
- 如何理解总线1、2、3的拓扑结构?
- 注意到总线 3 实际上不是总线(它是 VGA 控制器),它怎么能存在于自己的总线上呢?此设备使用的内核驱动程序是
amdgpu
,我仔细检查了一下,这确实是一个将自身注册为 pci 驱动程序的驱动程序。
CPU/操作系统是否00:00.0
仅与配置目的交互
答案1
然而,02:00.0 进一步嵌套在 01:00.0 内,并且没有类似的桥接设备来连接总线。
有:它是 02:00 和 01:00 设备本身。如您在列表中所见,两个 PCI ID 都代表 PCIe 中的端口转变(即,它们是同一设备的两侧)。
虽然经典 PCI 确实是一种布局基本平坦的共享总线,但 PCI Express 不再是共享总线 - 它是一个具有点对点链路的分组交换网络,一个完全不同的系统,它只模仿经典 PCI 行为并继承术语,但“总线 ID”不再与经典 PCI 中的含义完全相同。
(这反映了各种其他技术 - 以太网、SCSI、ATA - 也从共享总线系统迁移到分组交换系统。)
因此,使用 PCI Express,您就有了交换机和点对点链路,就像以太网一样,端口和桥接器有“逻辑总线”编号,其分配方式使得逻辑拓扑看起来像传统 PCI 系统可以理解的东西。从规范来看:
PCI Express 将逻辑 PCI 总线号映射到 PCI Express 链路上,使得 PCI 3.0 兼容配置软件将 PCI Express 层次结构的配置空间视为包含多个总线段的 PCI 层次结构。
所命名的设备Root Complex
是层次结构中总线号为 00 的顶级交换机,而您在树中看到的[01-03]
是[04-0b]
下级交换机已声明的“总线号”范围(即“辅助总线号”和“从属总线号”寄存器),根据规格。
例如,如果我正确理解了规范,则01.2-[04-0b]
意味着 00:01.2 是一个交换机/桥接器,已分配总线 ID 范围 04–0b(十六进制)。连接到它的第一个也是唯一一个设备获得总线 ID 04(因此“00.0-[05-0b]”实际上是 04:00.0),并且还是一个交换机,它将剩余的总线 ID 05–0b 进一步路由到其自己的下游设备。
答案2
➜ lspci
00:00.0 Host bridge: Intel Corporation 10th Gen Core Processor Host Bridge/DRAM Registers (rev 02)
00:01.0 PCI bridge: Intel Corporation 6th-10th Gen Core Processor PCIe Controller (x16) (rev 02)
00:02.0 VGA compatible controller: Intel Corporation CometLake-H GT2 [UHD Graphics] (rev 05)
00:04.0 Signal processing controller: Intel Corporation Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Thermal Subsystem (rev 02)
00:08.0 System peripheral: Intel Corporation Xeon E3-1200 v5/v6 / E3-1500 v5 / 6th/7th/8th Gen Core Processor Gaussian Mixture Model
00:12.0 Signal processing controller: Intel Corporation Comet Lake PCH Thermal Controller
00:13.0 Serial controller: Intel Corporation Device 06fc
00:14.0 USB controller: Intel Corporation Comet Lake USB 3.1 xHCI Host Controller
00:14.2 RAM memory: Intel Corporation Comet Lake PCH Shared SRAM
00:14.3 Network controller: Intel Corporation Comet Lake PCH CNVi WiFi
00:15.0 Serial bus controller: Intel Corporation Comet Lake PCH Serial IO I2C Controller #0
00:15.1 Serial bus controller: Intel Corporation Comet Lake PCH Serial IO I2C Controller #1
00:16.0 Communication controller: Intel Corporation Comet Lake HECI Controller
00:1b.0 PCI bridge: Intel Corporation Comet Lake PCI Express Root Port #17 (rev f0)
00:1c.0 PCI bridge: Intel Corporation Device 06b8 (rev f0)
00:1c.4 PCI bridge: Intel Corporation Device 06bc (rev f0)
00:1d.0 PCI bridge: Intel Corporation Comet Lake PCI Express Root Port #9 (rev f0)
00:1f.0 ISA bridge: Intel Corporation Device 068e
00:1f.3 Multimedia audio controller: Intel Corporation Comet Lake PCH cAVS
00:1f.4 SMBus: Intel Corporation Comet Lake PCH SMBus Controller
00:1f.5 Serial bus controller: Intel Corporation Comet Lake PCH SPI Controller
01:00.0 VGA compatible controller: NVIDIA Corporation TU106M [GeForce RTX 2060 Max-Q] (rev a1)
01:00.1 Audio device: NVIDIA Corporation TU106 High Definition Audio Controller (rev a1)
01:00.2 USB controller: NVIDIA Corporation TU106 USB 3.1 Host Controller (rev a1)
01:00.3 Serial bus controller: NVIDIA Corporation TU106 USB Type-C UCSI Controller (rev a1)
02:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller SM981/PM981/PM983
03:00.0 Unassigned class [ff00]: Realtek Semiconductor Co., Ltd. RTS5260 PCI Express Card Reader (rev 01)
04:00.0 PCI bridge: Intel Corporation JHL7540 Thunderbolt 3 Bridge [Titan Ridge 4C 2018] (rev 06)
05:00.0 PCI bridge: Intel Corporation JHL7540 Thunderbolt 3 Bridge [Titan Ridge 4C 2018] (rev 06)
05:01.0 PCI bridge: Intel Corporation JHL7540 Thunderbolt 3 Bridge [Titan Ridge 4C 2018] (rev 06)
05:02.0 PCI bridge: Intel Corporation JHL7540 Thunderbolt 3 Bridge [Titan Ridge 4C 2018] (rev 06)
05:04.0 PCI bridge: Intel Corporation JHL7540 Thunderbolt 3 Bridge [Titan Ridge 4C 2018] (rev 06)
06:00.0 System peripheral: Intel Corporation JHL7540 Thunderbolt 3 NHI [Titan Ridge 4C 2018] (rev 06)
3a:00.0 USB controller: Intel Corporation JHL7540 Thunderbolt 3 USB Controller [Titan Ridge 4C 2018] (rev 06)
6e:00.0 PCI bridge: Intel Corporation JHL7540 Thunderbolt 3 Bridge [Titan Ridge 4C 2018] (rev 06)
6f:00.0 PCI bridge: Intel Corporation JHL7540 Thunderbolt 3 Bridge [Titan Ridge 4C 2018] (rev 06)
6f:01.0 PCI bridge: Intel Corporation JHL7540 Thunderbolt 3 Bridge [Titan Ridge 4C 2018] (rev 06)
6f:02.0 PCI bridge: Intel Corporation JHL7540 Thunderbolt 3 Bridge [Titan Ridge 4C 2018] (rev 06)
6f:04.0 PCI bridge: Intel Corporation JHL7540 Thunderbolt 3 Bridge [Titan Ridge 4C 2018] (rev 06)
70:00.0 System peripheral: Intel Corporation JHL7540 Thunderbolt 3 NHI [Titan Ridge 4C 2018] (rev 06)
a4:00.0 USB controller: Intel Corporation JHL7540 Thunderbolt 3 USB Controller [Titan Ridge 4C 2018] (rev 06)
➜lspci -t
-[0000:00]-+-00.0
+-01.0-[01]--+-00.0
| +-00.1
| +-00.2
| \-00.3
+-02.0
+-04.0
+-08.0
+-12.0
+-13.0
+-14.0
+-14.2
+-14.3
+-15.0
+-15.1
+-16.0
+-1b.0-[02]----00.0
+-1c.0-[03]----00.0
+-1c.4-[04-6d]----00.0-[05-6d]--+-00.0-[06]----00.0
| +-01.0-[07-39]--
| +-02.0-[3a]----00.0
| \-04.0-[3b-6d]--
+-1d.0-[6e-d7]----00.0-[6f-d7]--+-00.0-[70]----00.0
| +-01.0-[71-a3]--
| +-02.0-[a4]----00.0
| \-04.0-[a5-d7]--
+-1f.0
+-1f.3
+-1f.4
\-1f.5
PCI Express 拓扑图来自维基百科。
该domain:bus:device.function
符号用于唯一标识每个 PCIe 设备。通常,领域是0000
并被省略。
01:00.0 VGA compatible controller: NVIDIA Corporation TU106M [GeForce RTX 2060 Max-Q] (rev a1)
你可以看到这里的独立显卡已经打开总线 01、设备 00、功能 0。
-[0000:00]-+-00.0
+-01.0-[01]--+-00.0
| +-00.1
| +-00.2
| \-00.3
表中含量[]
表示公共汽车,应与其他部分连接起来,以获得相应的PCIe 设备在 的输出中lspci
。在上面的摘录中,00.0, 01.0
第二列需要与总线连接[0000:00]
以获取 PCIe 设备,分别为00:00.0, 00:01.0
。00.0, 00.1, 00.2 00.3
第三列需要与总线连接[01]
以获取 PCIe 设备,分别为01:00.0, 01:00.1, ...
。合理地,总线[01]
是secondary bus
由设备创建的00:01.0
。
从表中可以看到,bus00
是主总线(Root Complex),然后00:01.0
是 ,PCI bridge
连接到主总线,并且它创建了辅助总线01
,总线上的第一个设备01
分别具有四种功能01:00.0, 01:00.1, 01:00.2, 01:00.3
。你可以在 的输出中找到这些设备lspci
。
+-1c.4-[04-6d]----00.0-[05-6d]--+-00.0-[06]----00.0
| +-01.0-[07-39]--
| +-02.0-[3a]----00.0
| \-04.0-[3b-6d]--
这里的[04-6d]
意思是总线04
,[05-6d]
意思是总线05
,但它表示总线号04 - 6d
已经分配给它的子总线。所以这里的设备应该是:00:1c.4, 04:00.0, 05:00.0, 06:00.0, 05:01.0, 05:02.0, 3a:00.0, 05:04.0
。你可以在“lspci”的输出中找到所有这些设备。
我其实不明白你问的是什么。但我觉得如果你能理解 输出的含义lspci -t
,那么你就可以自己弄清楚。该表清楚地显示了 PCIe 拓扑。
我没有找到任何权威来源,这些都是我个人的猜测。