1. PCIe总线概述:体系结构、拓扑结构与分层模型
PCI Express(PCIe)作为第三代高性能I/O互连标准,采用点对点串行差分信号替代传统并行总线,从根本上解决了PCI/PCI-X的带宽瓶颈与信号同步问题。本章从体系结构、拓扑组织和分层协议三个维度建立PCIe驱动的全局视图。
1.1 PCIe体系结构核心特征
| 特征 | PCIe | 传统PCI |
|---|---|---|
| 互连方式 | 点对点串行差分 | 共享并行总线 |
| 带宽扩展 | 通道宽度(×1/×4/×8/×16) | 总线宽度(32/64位) |
| 时钟机制 | 内嵌时钟(8b/10b或128b/130b编码) | 外部同步时钟 |
| 热插拔 | 原生支持 | 需额外控制器 |
| 配置空间 | 4 KB(扩展至4096字节) | 256字节 |
| 数据完整性 | CRC + 重传(数据链路层) | 无链路层校验 |
驱动开发要点:PCIe配置空间从256字节扩展到4 KB,新增的PCIe Capability结构(位于0x100之后)是驱动枚举链路能力、电源状态和中断机制的关键入口。
1.2 拓扑结构:树形层次化互连
PCIe拓扑采用树形结构,由根复合体(Root Complex, RC)、交换器(Switch)和端点(Endpoint, EP)三类组件构成。每个组件内部包含一个或多个逻辑设备(Function),最多支持8个Function(Function 0~7)。
拓扑枚举顺序:驱动通过配置空间中的Bus Number(Primary/Secondary/Subordinate)递归遍历树形结构。每个Switch的Upstream Port连接父节点,Downstream Port连接子节点或端点。枚举时从Bus 0(RC内部)开始,逐级分配Bus号。
1.3 分层模型:三层协议栈
PCIe协议栈分为事务层(Transaction Layer)、数据链路层(Data Link Layer)和物理层(Physical Layer)。上层与下层之间通过TLP(事务层包)和DLLP(数据链路层包)进行通信。
1.4 事务层详解
事务层是驱动开发最常打交道的层次,负责生成和解析TLP(Transaction Layer Packet)。TLP分为四大类:
- Memory TLP:内存空间读写(包括DMA传输的核心操作)
- I/O TLP:I/O空间读写(x86平台遗留,ARM平台较少使用)
- Configuration TLP:配置空间读写(Type 0 用于Endpoint,Type 1 用于Switch/Bridge)
- Message TLP:中断(MSI/MSI-X)、错误报告、电源管理等带内消息
| TLP类型 | Fmt[2:0] | 地址宽度 | 典型用途 |
|---|---|---|---|
| Memory Read (MRd) | 000 | 32/64位 | DMA读请求 |
| Memory Write (MWr) | 010 | 32/64位 | DMA写请求 |
| Configuration Read (CfgRd0) | 100 | — | 枚举配置空间 |
| Configuration Write (CfgWr0) | 110 | — | 配置BAR/中断 |
| Message (Msg) | 101 | — | MSI中断、PME |
驱动开发陷阱:Memory TLP的地址必须与Endpoint的BAR(Base Address Register)空间对齐。驱动在枚举阶段读取BAR寄存器后,需将物理地址映射到内核虚拟地址空间(ioremap),才能发起正确的Memory TLP。
1.5 数据链路层与物理层要点
数据链路层为TLP提供可靠传输:
- 在TLP前后添加Sequence Number和LCRC(链路层CRC)
- 接收方通过Ack/Nak DLLP确认或请求重传
- 管理链路状态(L0/L0s/L1/L2)和流控信用(VC Buffer)
物理层负责电气信号与链路训练:
- Gen1/Gen2使用8b/10b编码,Gen3/Gen4/Gen5使用128b/130b编码
- 链路训练状态机(LTSSM)完成位锁定、符号对齐、通道协商
- 每条Lane包含两组差分对(Tx+/Tx- 和 Rx+/Rx-)
性能调优关联:DMA传输性能受限于事务层的最大载荷大小(MPS)和读请求大小(MRRS)。MPS由链路训练协商决定(128B~4KB),驱动可通过配置空间修改Device Control寄存器调整MRRS,以匹配DMA描述符粒度。
1.6 本章小结
PCIe体系结构以点对点串行互连替代共享总线,通过树形拓扑实现灵活扩展,借助三层协议栈分离事务语义、可靠传输和物理信号。驱动开发者需重点掌握:
- 配置空间枚举流程(Bus/Device/Function遍历)
- TLP类型与BAR地址映射关系
- 数据链路层重传机制对DMA可靠性的影响
- 物理层链路训练参数(MPS/MRRS)对吞吐量的约束