1. PCIe基础回顾
在深入TLP报文与DMA传输之前,必须牢固掌握PCIe的拓扑结构、角色定义与分层模型。本章作为全课程的基石,将用最精炼的方式重建这些核心概念。
1.1 PCIe拓扑结构
PCIe采用点对点串行互连的树形拓扑,取代了传统PCI的共享并行总线。每个设备通过独立的Lane(通道)与交换器(Switch)或Root Complex直接连接,不再共享带宽。
关键特征: 点对点连接、串行差分信号、多Lane捆绑(×1、×4、×8、×16)、基于包的传输。
下图展示了典型的PCIe系统拓扑结构:
拓扑要点: 所有通信必须经过 Root Complex 或 Switch。Endpoint 之间不能直接通信,必须通过 Switch 转发。这种设计保证了系统的可扩展性和隔离性。
1.2 Root Complex 与 Endpoint 角色
| 角色 | 功能描述 | 典型设备 | TLP 处理能力 |
|---|---|---|---|
| Root Complex (RC) | 连接 CPU/内存与 PCIe 域,是层次结构的根节点。负责地址转换、中断路由、错误处理。 | CPU 内部集成 RC、芯片组 | 完全支持所有 TLP 类型(Mem、IO、Cfg、Msg) |
| Endpoint (EP) | 功能设备,作为 PCIe 总线上的最终节点。发起或响应 TLP 事务。 | NVMe SSD、GPU、网卡、FPGA 加速卡 | 通常支持 Mem 和 Msg TLP,部分支持 IO/Cfg |
| Switch | 扩展 PCIe 端口数量,透明转发 TLP。对软件不可见。 | PCIe 交换芯片 | 转发所有 TLP,不修改内容 |
| Bridge | 连接 PCIe 与传统 PCI 总线,进行协议转换。 | PCIe-to-PCI 桥接芯片 | 转换 TLP 与 PCI 总线周期 |
驱动开发注意: Endpoint 驱动通常不需要关心 RC 内部实现,但必须理解 RC 对 Mem 空间的映射方式。在 DMA 传输中,RC 负责将物理地址转换为 PCIe 总线地址,这是驱动配置 DMA 的关键。
1.3 PCIe 总线分层模型
PCIe 采用三层分层架构,从下到上依次为:物理层、数据链路层、事务层。每一层都有明确的职责和协议边界。
1.3.1 事务层 (Transaction Layer)
事务层是驱动开发最常打交道的层次。它负责:
- TLP 封装与解析: 将 CPU 的内存读写请求封装为 Memory Read/Write TLP,或将 IO/配置请求封装为对应 TLP。
- 事务排序: 遵循 PCIe 排序规则(Strongly-Ordered / Relaxed-Ordering),保证数据一致性。
- 虚拟通道 (VC): 支持最多 8 个虚拟通道,实现流量隔离与 QoS。
驱动视角: 驱动通过 MMIO 访问设备寄存器时,事务层自动生成 Memory TLP。驱动配置 DMA 描述符时,实际上是在构造 TLP 的地址、长度、属性字段。
1.3.2 数据链路层 (Data Link Layer)
数据链路层为事务层提供可靠传输保障:
- CRC 校验: 为每个 TLP 附加 32 位 LCRC,接收端校验。
- Ack/Nak 重传: 接收端返回 Ack DLLP 确认,Nak 触发重传。
- 链路管理: 链路训练、电源状态管理(L0s/L1/L2)。
| DLLP 类型 | 功能 | 长度 |
|---|---|---|
| Ack | 确认 TLP 正确接收 | 6 字节 |
| Nak | 请求 TLP 重传 | 6 字节 |
| PM_Enter_L1 | 进入 L1 低功耗状态 | 6 字节 |
| InitFC1/InitFC2 | 初始化流量控制 | 6 字节 |
1.3.3 物理层 (Physical Layer)
物理层负责比特传输,分为逻辑子层和电气子层:
- 逻辑子层: 8b/10b 编码(Gen1/Gen2)或 128b/130b 编码(Gen3+),加扰、去扰。
- 电气子层: 差分信号驱动、接收均衡、时钟恢复。
- 链路训练: 上电时自动协商速率和宽度(Link Training & Status State Machine, LTSSM)。
性能指标: 每条 Lane 的原始速率:Gen1 = 2.5 GT/s,Gen2 = 5 GT/s,Gen3 = 8 GT/s,Gen4 = 16 GT/s,Gen5 = 32 GT/s。有效带宽需扣除编码开销(Gen1/2 约 20%,Gen3+ 约 1.5%)。
1.4 分层模型与 TLP 的关系
理解分层模型对 TLP 报文处理至关重要。下图展示了一个 Memory Write TLP 在发送端的封装过程:
驱动开发核心认知: 驱动只与事务层交互(通过 MMIO、DMA 描述符)。数据链路层和物理层的可靠性由硬件自动保证,驱动无需干预。但理解底层机制有助于调试链路问题(如 CRC 错误、链路降速)。
1.5 本章小结
- PCIe 拓扑是树形点对点结构,RC 是根节点,EP 是功能设备。
- RC 负责地址映射和中断路由,EP 驱动必须正确配置 DMA 地址。
- 三层模型(事务层、数据链路层、物理层)各司其职,驱动开发聚焦事务层。
- TLP 是事务层的基本数据单元,后续章节将深入其格式与传输机制。