PCIe基础概念与设备树详解
PCIe基础概念与设备树详解
PCIe(Peripheral Component Interconnect Express)是一种用于连接外设的总线标准,自2003年推出以来,已成为现代计算机系统中CPU与各种外设(如GPU、网卡、USB控制器等)交互的基础。本文将详细介绍PCIe的基础概念与设备树结构,帮助读者理解其硬件架构和设备连接方式。
1. PCIe总体框图
首先,我们先从PCIe的基本概念开始。PCIe的架构主要由五个部分组成:Root Complex,PCIe Bus,Endpoint,Port and Bridge,Switch。其整体架构呈现一个树状结构,如下图所示:
2. Root Complex(RC)
Root Complex是整个PCIe设备树的根节点,CPU通过它与PCIe的总线相连,并最终连接到所有的PCIe设备上。
由于Root Complex是管理外部IO设备的,所以在早期的CPU上,Root Complex其实是放在了北桥(MCU)上,后来随着技术的发展,现在已经都集成进了CPU内部了。下图展示了System Agent部分,其中包含了PCIe Root Complex:
系统中可以存在多个Root Complex。例如,i9-10980XE CPU有4个Root Complex,而i7-9750H CPU则只有一个。在Linux系统中,可以通过lspci
命令查看所有Root Complex:
$ lspci -t -v
-+-[0000:c0]-+-00.0 Advanced Micro Devices, Inc. [AMD] Starship/Matisse Root Complex
+-[0000:80]-+-00.0 Advanced Micro Devices, Inc. [AMD] Starship/Matisse Root Complex
+-[0000:40]-+-00.0 Advanced Micro Devices, Inc. [AMD] Starship/Matisse Root Complex
\-[0000:00]-+-00.0 Advanced Micro Devices, Inc. [AMD] Starship/Matisse Root Complex
3. PCIe总线(Bus)
PCIe上的设备通过PCIe总线互相连接。与老式的PCI和PCI-X相比,PCIe有以下两点重要区别:
- PCIe采用点对点的连接方式,类似于网络中的交换机,而不是传统的共享总线。
- PCIe使用高速串行信号,取代了老式PCI的单端并行信号,解决了频率提升受限的问题。
4. PCIe Device
PCIe上连接的设备可以分为两种类型:
- Type 0:表示PCIe上的终端设备,如显卡、声卡、网卡等。
- Type 1:表示PCIe Switch或Root Port,主要用于连接其他PCIe设备。
4.1. BDF(Bus Number, Device Number, Function Number)
每个PCIe设备在系统启动时都会被分配一个唯一的BDF地址,由三部分组成:
- Bus Number:8位,最多支持256条总线
- Device Number:5位,最多支持32个设备
- Function Number:3位,最多支持8个功能
BDF地址通常表示为BB:DD.F
格式。例如,可以通过lspci
命令查看设备的BDF地址:
$ lspci -t -v
# [Domain:Bus]
\-[0000:00]-+-00.0 Advanced Micro Devices, Inc. [AMD] Starship/Matisse Root Complex
# Device.Function
+-14.0 Advanced Micro Devices, Inc. [AMD] FCH SMBus Controller
此外,PCIe还支持ARI(Alternative Routing-ID Interpretation)模式,可以将Device Number和Function Number合并为一个8位字段,最多支持256个Function。
4.2. Type 0 Device和Endpoint
所有连接到PCIe总线上的Type 0设备都可以实现PCIe的Endpoint,用于发起或接收PCIe请求和消息。例如,一块双网口网卡可以为每个网口实现一个单独的Endpoint。
4.3. RCIE(Root Complex Integrated Endpoint)
RCIE是指直接连接到Root Complex的集成设备,如内存控制器、集成显卡等。这些设备的Bus Number通常为0。
4.4. Port / Bridge
需要通过插槽连接的设备需要通过PCIe Port连接。Root Complex上的每个Root Port实际上由两个Bridge组成:一个Host Bridge连接到CPU,一个PCI Bridge连接到下游设备。
通过lspci
命令可以看到这些桥的存在:
$ sudo lspci -s 80:01.0 -v
80:01.0 Host bridge: Advanced Micro Devices, Inc. [AMD] Starship/Matisse PCIe Dummy Host Bridge
Flags: fast devsel, IOMMU group 13
$ sudo lspci -s 80:01.1 -v
80:01.1 PCI bridge: Advanced Micro Devices, Inc. [AMD] Starship/Matisse GPP Bridge (prog-if 00 [Normal decode])
Flags: bus master, fast devsel, latency 0, IRQ 35, IOMMU group 13
Bus: primary=80, secondary=81, subordinate=81, sec-latency=0
I/O behind bridge: 0000b000-0000bfff [size=4K]
Memory behind bridge: f0000000-f10fffff [size=17M]
Prefetchable memory behind bridge: 0000020030000000-00000200420fffff [size=289M]
Kernel driver in use: pcieport
4.5. Switch
PCIe Switch内部包含Upstream Port、Downstream Port和虚拟总线,用于连接多个设备。Switch内部的总线是逻辑上的虚拟总线,实际通过交换电路实现信号转发。
5. 小结
通过以上介绍,我们可以看到PCIe设备树的主要部件及其连接方式。下图展示了完整的PCIe设备树结构:
本文介绍了PCIe的基础概念与设备树结构,后续将继续探讨PCIe的配置空间、消息路由等高级主题。
参考资料
- [1]: PCI Express Base Specification
- [2]: Thunderbolt™ 3 Technology Brief
- [3]: USB4™ Specification
- [4]: Compute Express Link™ (CXL™) Specification
- [5]: Intel® 3000 and 3010 Chipset Memory Controller Hub (MCH) datasheet
- [6]: H12DSi-NT6 motherboard manual
- [7]: fpga4fun - PCI Express 2 - Topology
- [8]: White Paper: Introduction to Intel® Architecture
- [9]: Crossbar Switch
- [10]: Mindshare - An Introduction to PCI Express