什么是PCIe Switch?

PCIe Switch(交换器)是一种多端口的PCIe设备,用于扩展PCIe拓扑结构。它有一个上游端口(Upstream Port)连接Root Complex或其他Switch,以及多个下游端口(Downstream Port)连接Endpoint设备或下游Switch。

主要作用

  • 端口扩展:RC的PCIe端口有限,Switch可以扩展出更多端口连接设备
  • 拓扑扩展:支持多级级联,构建复杂的PCIe拓扑
  • 带宽汇聚:多个低速设备共享上游带宽
  • 热插拔支持:下游端口支持独立的热插拔

Switch架构

Root Complex

CPU/SoC

PCIe Switch

UP
DP0
DP1
DP2
DP3
GPU
NVMe
NIC
AI卡

内部结构

PCIe Switch内部包含:

  • 上游端口(Upstream Port):Type 1配置头,连接RC或上级Switch
  • 下游端口(Downstream Port):多个Type 1配置头,连接设备或下级Switch
  • 内部交换逻辑:负责TLP路由和转发
  • 仲裁器:管理多个端口间的流量仲裁

路由机制

Switch的核心功能是路由(Routing)——根据TLP中的地址或ID信息,将数据包转发到正确的端口。

地址路由(Address Routing)

用于Memory和I/O事务,Switch根据TLP中的目标地址决定转发端口。

Switch内部路由表示例:

目标地址范围 输出端口 说明
0xA0000000 - 0xAFFFFFFF Downstream Port 0 GPU BAR空间
0xB0000000 - 0xB0FFFFFF Downstream Port 1 NVMe SSD BAR空间
0xB1000000 - 0xB1FFFFFF Downstream Port 2 网卡 BAR空间
其他 Upstream Port 发往RC

ID路由(ID Routing)

用于配置事务,Switch根据Bus/Device/Function号路由TLP。

配置Type 0

目标为Endpoint,Switch根据设备号转发到对应下游端口

配置Type 1

目标为Bridge/Switch,Switch根据总线号决定是否转发到下游

隐式路由(Implicit Routing)

用于消息事务(如中断、电源管理),不需要地址信息,Switch根据消息类型决定处理方式。

Switch的配置空间

Switch的每个端口都有独立的Type 1配置空间,包含总线号配置和路由信息。

关键寄存器

寄存器 偏移 说明
Primary Bus Number 0x18 上游总线号
Secondary Bus Number 0x19 下游直接连接的总线号
Subordinate Bus Number 0x1A 下游最大总线号
Memory Base/Limit 0x20 Memory空间范围
Prefetchable Base/Limit 0x24 可预取Memory空间范围
I/O Base/Limit 0x1C I/O空间范围

总线号分配示例

RC (Bus 0)
  └── Switch Upstream Port (Bus 0, Dev 0)
        ├── Downstream Port 0 (Bus 1) → GPU (Bus 1, Dev 0)
        ├── Downstream Port 1 (Bus 2) → NVMe (Bus 2, Dev 0)
        └── Downstream Port 2 (Bus 3) → NIC (Bus 3, Dev 0)
                    

典型应用场景

1. 服务器扩展

服务器主板通常只有有限的PCIe插槽,通过Switch可以扩展连接更多设备:

  • 连接多个GPU用于AI训练/推理
  • 连接多个NVMe SSD构建高速存储
  • 连接多个高速网卡(25G/100G)

2. GPU服务器架构

典型8卡GPU服务器架构:

  • CPU提供2-4个PCIe x16端口
  • 每个CPU端口连接一个PCIe Switch
  • Switch下游连接4个GPU(x16或x8)
  • GPU之间通过NVLink或PCIe P2P通信

3. 存储服务器

全闪存存储服务器使用Switch连接大量NVMe SSD:

  • 单个Switch可支持24-32个NVMe设备
  • 多级级联支持更多设备
  • 支持热插拔,便于维护

4. 嵌入式系统

SoC的PCIe端口有限,使用Switch扩展:

  • 工业控制计算机
  • 网络设备(路由器、交换机)
  • 边缘计算设备

Switch高级特性

现代PCIe Switch支持多种高级特性,用于增强系统安全性、扩展性和虚拟化能力。

ACS (Access Control Services)

ACS是PCIe的一项重要安全特性,用于控制Switch内部的路由行为,防止恶意设备访问其他设备的资源。

ACS Source Validation

验证TLP的源地址,防止伪造源地址攻击

ACS Translation Blocking

阻止地址转换请求,确保设备只能访问分配给它的地址空间

ACS P2P Request Redirect

将点对点请求重定向到RC,由RC进行仲裁和转发

ACS P2P Completion Redirect

将点对点完成包重定向到RC

ACS Upstream Forwarding

控制上游端口的转发行为

ACS P2P Egress Control

控制 egress 端口的P2P访问

ACS应用场景

  • 虚拟化环境:防止虚拟机之间的非法内存访问
  • 安全隔离:将不同安全级别的设备隔离
  • SR-IOV:配合SR-IOV实现VF之间的隔离

ARI (Alternative Routing-ID Interpretation)

ARI扩展了PCIe设备的Function编号范围,从传统的3位(最多8个Function)扩展到8位(最多256个Function)。

特性 传统PCIe ARI扩展
Function位宽 3位 8位
最大Function数 8 256
Device号使用 5位(32个Device) 0(Function扩展)
应用场景 普通设备 高密度VF设备(如100G网卡)

MR-IOV (Multi-Root I/O Virtualization)

MR-IOV允许一个PCIe设备同时连接到多个Root Complex,实现多主机共享I/O设备。

MR-IOV架构特点

  • 多根支持:单个设备可被多个独立的RC访问
  • 资源分区:设备资源可以分配给不同的RC
  • 隔离性:不同RC之间的访问相互隔离
  • 应用场景:刀片服务器、多主机系统

路由表生成原理

Switch根据配置空间中的Base/Limit寄存器生成分路由表,决定TLP的转发端口。

地址路由决策流程

// 简化的路由决策逻辑
int route_packet(uint32_t addr, SwitchPort* ports, int num_ports) {
    for (int i = 0; i < num_ports; i++) {
        // 检查Memory空间范围
        if (addr >= ports[i].mem_base && addr <= ports[i].mem_limit) {
            return i;  // 转发到对应端口
        }
        // 检查Prefetchable Memory范围
        if (addr >= ports[i].prefetch_base && addr <= ports[i].prefetch_limit) {
            return i;
        }
        // 检查I/O空间范围
        if (addr >= ports[i].io_base && addr <= ports[i].io_limit) {
            return i;
        }
    }
    return UPSTREAM_PORT;  // 转发到上游端口
}
                        

Memory Base/Limit

定义32位Memory空间范围,用于路由Memory读写请求

Prefetchable Base/Limit

定义可预取Memory空间范围,通常用于大容量BAR

I/O Base/Limit

定义I/O空间范围,用于兼容传统PCI设备

常见PCIe Switch芯片

厂商 型号系列 特点
Broadcom PEX系列 市场份额最大,支持Gen3/Gen4,端口数多
Microchip Switchtec 支持Gen4,功能丰富,支持NVMe热插拔
ASMedia ASM系列 性价比高,常用于消费级产品
Diodes PI7C9X 支持Gen3,低功耗设计
Texas Instruments PCIe Switch 工业级产品,可靠性高

使用Switch的注意事项

带宽规划

  • 上游带宽是所有下游端口的共享资源
  • 避免下游总带宽超过上游带宽过多
  • 考虑设备实际带宽需求进行规划

散热设计

  • Switch芯片功耗较高(5-15W)
  • 需要良好的散热设计
  • 高负载时注意温度监控

延迟影响

  • Switch会引入额外的传输延迟
  • 对延迟敏感的应用需谨慎使用
  • 多级级联会累积延迟

成本控制

  • 高端Switch芯片价格较高
  • 根据实际需求选择合适规格
  • 考虑长期供货稳定性
理解检测
1. PCIe Switch 收到一个 Memory Read TLP,应根据哪种路由机制决定转发端口?
Memory 事务使用地址路由,Switch 根据各下游端口的 Memory Base/Limit 寄存器定义的地址范围来匹配目标地址,决定转发到哪个端口。如果地址不匹配任何下游端口范围,则转发到上游端口。ID 路由用于配置事务,隐式路由用于消息事务。
2. Switch 的下游端口配置空间中,Subordinate Bus Number 寄存器的作用是什么?
Subordinate Bus Number 记录该端口下游子树中分配的最大总线号,用于 ID 路由时判断配置请求是否应转发到该下游端口。Primary Bus Number 是上游总线号,Secondary Bus Number 是直接下游总线号。三者配合完成总线号范围的层级管理。
3. ACS(Access Control Services)在 PCIe Switch 中的主要作用是什么?
ACS 是安全特性,控制 Switch 内部的路由行为,防止恶意设备通过 P2P 访问其他设备的资源。包括源地址验证、转换请求阻止、P2P 请求重定向等功能。常用于虚拟化环境(防止 VF 间非法访问)和安全隔离场景。ARI 才是扩展 Function 编号范围的特性。