3、PCIe拓扑结构:根复合体(RC)、交换器(Switch)、端点(EP)、桥(Bridge)的层级关系
PCIe 采用点对点串行互连的树形拓扑结构,彻底摒弃了传统 PCI 的多分支并行总线架构。理解 RC、Switch、EP、Bridge 这四类组件的层级关系,是分析链路训练、设备枚举及热插拔流程的基础。
3.1 拓扑中的四类核心组件
| 组件 | 英文全称 | 功能角色 | 典型位置 |
|---|---|---|---|
| 根复合体 (RC) | Root Complex | CPU 与 PCIe 域的桥梁,生成事务层报文,管理配置空间 | CPU 内部或芯片组 |
| 交换器 (Switch) | Switch | 扩展端口数量,路由报文,隔离流量域 | 主板中间层或扩展板 |
| 端点 (EP) | Endpoint | 功能执行者,发起或响应 PCIe 事务 | GPU、NVMe SSD、网卡 |
| 桥 (Bridge) | PCIe/PCI Bridge | 连接不同总线标准(如 PCIe 转 PCI)或不同协议域 | 兼容性扩展卡 |
关键概念: 在 PCIe 枚举过程中,RC 作为 Bus 0 的拥有者,通过深度优先遍历发现所有下游设备。每个 Switch 的 Upstream Port 和 Downstream Port 在配置空间中表现为独立的 PCI-to-PCI Bridge 结构。
3.2 标准树形拓扑结构
下图展示了一个典型的 PCIe 树形拓扑,包含 RC、两级 Switch、多个 EP 以及一个 Bridge。
拓扑要点:
- RC 是拓扑的根节点,管理 Bus 0 并负责发起配置周期。
- Switch 本质上是多个 PCI-to-PCI Bridge 的集合,其 Upstream Port 连接父总线,Downstream Port 创建新的子总线。
- EP 只能作为叶子节点,不能继续向下扩展总线。
- Bridge 用于连接异构总线(如 PCIe 与 PCI-X),在枚举时会分配独立的次级总线号。
3.3 层级关系与总线号分配
PCIe 枚举的核心是总线号 (Bus Number) 的递归分配。RC 拥有 Bus 0,每经过一个 Downstream Port 或 Bridge,总线号递增。层级深度决定了配置空间的寻址路径。
| 层级 | 组件 | 分配的总线号 | 说明 |
|---|---|---|---|
| L0 | RC | Bus 0 | 根总线,包含 RC 内部虚拟设备 |
| L1 | Switch 1 (Upstream) | Bus 1 | Switch 1 的 Upstream Port 作为 Bus 0 上的设备 |
| L2 | Switch 1 (Downstream 1) | Bus 2 | 连接 EP 1 的子总线 |
| L2 | Switch 1 (Downstream 2) | Bus 3 | 连接 Switch 2 的子总线 |
| L3 | Switch 2 (Downstream 1) | Bus 4 | 连接 EP 3 的子总线 |
| L3 | Switch 2 (Downstream 2) | Bus 5 | 连接 Bridge 的子总线 |
| L4 | Bridge (Secondary) | Bus 6 | 传统 PCI 设备所在总线 |
3.4 热插拔场景下的层级影响
当热插拔事件发生时,层级关系直接影响链路训练与重枚举的范围:
- EP 热拔出: 仅影响该 EP 所在的 Downstream Port 链路状态,Switch 会检测到 Data Link Layer 的 Down 事件,并向上报告到 RC。
- Switch 热拔出: 该 Switch 及其下游所有设备(EP、Bridge、子 Switch)全部离线,RC 需要回收该分支的所有总线号。
- Bridge 热插入: 需要为 Bridge 的 Secondary Bus 分配新的总线号,并枚举其下游的传统 PCI 设备,这个过程比标准 EP 枚举更复杂,因为涉及 PCI 配置空间的兼容性处理。
工程陷阱: 在包含多级 Switch 的拓扑中,热插拔一个中间层 Switch 可能导致总线号碎片化。如果 RC 的枚举算法不支持动态总线号回收与重分配,后续插入的设备可能无法获得连续的总线号,导致配置空间访问异常。设计热插拔控制器时,必须确保总线号资源池支持碎片整理。
3.5 层级与事务路由
PCIe 事务路由依赖拓扑层级:
- 基于地址的路由: 用于 Memory 和 IO 事务,Switch 根据地址范围判断转发方向。
- 基于 ID 的路由: 用于配置事务,使用 Bus/Device/Function 三元组,必须严格遵循层级关系。
- 隐式路由: 用于 Message 事务,如 PME_Turn_Off、INTx 中断,由 RC 或 Switch 根据消息类型处理。
层级越深,事务延迟越高。在热插拔链路训练时,RC 通过配置读写访问目标设备的配置空间,如果中间 Switch 的链路尚未稳定,配置事务将超时,导致枚举失败。因此,热插拔流程必须逐级等待链路训练完成。