如何了解设备拓扑?

如何了解设备拓扑?

我无法理解系统上的设备模型和 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 可以:

  1. 镜像之前的嵌套。例如,我认为会有两个设备:01:01.0(Dummy)和01:01.1(bridge),并且 bridge 会首先嵌套在目录中,然后才是 bus 02。
  2. 或者总线 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. 如何理解总线1、2、3的拓扑结构?
  2. 注意到总线 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.000.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 拓扑。

我没有找到任何权威来源,这些都是我个人的猜测。

相关内容