1. PCIe基础概念:总线架构、拓扑结构与分层模型
PCI Express(PCIe)作为现代高性能串行互连标准,已全面取代传统的并行 PCI/PCI-X 总线。本章从总线架构、拓扑结构及分层协议模型三个维度,建立 PCIe 系统的完整知识框架,为后续深入 RC(Root Complex)与 EP(Endpoint)驱动开发奠定基础。
1.1 PCIe 总线架构概述
PCIe 采用点对点串行差分信号传输,每个链路(Link)由一对或多对发送/接收差分对组成。与共享并行总线不同,PCIe 每个设备拥有独立的物理通道,无需仲裁即可全双工通信。
| 特性 | 传统 PCI | PCI Express |
|---|---|---|
| 总线类型 | 共享并行总线 | 点对点串行差分 |
| 信号线数 | 32/64 位并行 | 每 Lane 2 对差分线(4 线) |
| 时钟方式 | 同步共享时钟 | 内嵌时钟(8b/10b 或 128b/130b 编码) |
| 最大设备数 | 受限于总线负载 | 通过 Switch 扩展,几乎无限制 |
| 带宽 | 共享带宽 | 每 Lane 独立带宽,可聚合 |
| 热插拔 | 不支持 | 原生支持 |
关键概念:PCIe 链路宽度以 x1、x2、x4、x8、x16、x32 表示,x16 为图形卡典型配置。链路宽度在枚举阶段通过训练协商确定,可向下兼容。
1.2 拓扑结构:RC、Switch、EP 与 Bridge
PCIe 拓扑采用树形层次结构,由以下核心组件构成:
- Root Complex (RC):系统根节点,连接 CPU/内存子系统与 PCIe 域,负责生成配置请求、处理中断和错误。
- Switch:由上游端口(Upstream Port)和多个下游端口(Downstream Port)组成,实现数据包路由和扩展。
- Endpoint (EP):功能设备节点,如网卡、NVMe SSD、GPU,作为事务的发起者或完成者。
- PCIe Bridge:用于连接传统 PCI/PCI-X 总线,实现协议转换。
驱动视角:RC 在 Linux 中通常由平台代码或 ACPI 描述,驱动开发者主要关注 EP 的 BAR 空间、MSI/MSI-X 中断及 DMA 操作。Switch 对软件透明,但影响拓扑枚举顺序。
1.3 分层模型:事务层、数据链路层、物理层
PCIe 协议栈采用分层架构,从高到低依次为事务层(Transaction Layer)、数据链路层(Data Link Layer)和物理层(Physical Layer)。每一层封装来自上层的包,添加本层头部或校验信息。
1.3.1 事务层(Transaction Layer)
事务层是协议栈的最上层,负责生成和处理事务层包(TLP)。TLP 是 PCIe 通信的基本单元,包含地址、数据、事务类型等信息。
- 事务类型:Memory Read/Write、I/O Read/Write、Configuration Read/Write、Message。
- 地址空间:Memory(32/64 位)、I/O、Configuration、Message。
- 关键机制:Posted/Non-posted 事务区分、流量分类(TC)、虚拟通道(VC)。
1.3.2 数据链路层(Data Link Layer)
数据链路层位于事务层之下,负责可靠传输和链路管理。
- 数据链路层包(DLLP):用于链路管理,如 Ack/Nak 确认、流控更新、电源管理。
- TLP 封装:在 TLP 前后添加序列号(Sequence Number)和 CRC(LCRC),实现端到端错误检测。
- 重传机制:接收方通过 Nak DLLP 请求重传,发送方维护重放缓冲区。
1.3.3 物理层(Physical Layer)
物理层是协议栈的最底层,负责串行/解串、链路训练和电气特性。
- 逻辑子层:8b/10b 或 128b/130b 编码、加扰、弹性缓冲区。
- 电气子层:差分信号驱动、接收均衡、时钟恢复。
- 链路训练状态机(LTSSM):管理链路初始化、恢复、电源状态转换。
驱动开发注意:事务层是驱动直接交互的层次,通过配置空间访问 BAR 地址、发送 Memory 读写 TLP。数据链路层和物理层由硬件自动处理,驱动通常不直接干预,但理解 LTSSM 状态对调试链路异常至关重要。
1.4 关键概念对比:RC 与 EP 的驱动视角
| 维度 | Root Complex (RC) | Endpoint (EP) |
|---|---|---|
| 角色 | 系统根节点,发起配置枚举 | 功能设备,响应配置请求 |
| 配置空间 | 通过内存映射或 ACPI 访问 | 标准 PCIe 配置空间(256B + 4KB) |
| 中断 | 处理来自 EP 的 MSI/MSI-X | 发送 MSI/MSI-X 或 INTx |
| DMA | 通常由 EP 发起 DMA 读写 | 通过 DMA 引擎访问系统内存 |
| 错误处理 | 接收并上报 AER 错误 | 发送错误消息(ERR_COR/ERR_NONFATAL/ERR_FATAL) |
| Linux 驱动 | 平台驱动 / ACPI 驱动 | 标准 PCIe 设备驱动(pci_driver) |