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)。

PCIe 树形拓扑结构 根复合体 (RC) 交换器 (Switch) 端点 EP-A (Function 0) 端点 EP-B (Function 0~1) 端点 EP-C (Function 0) 交换器 2 (Switch) 端点 EP-D (Function 0) 端点 EP-E (Function 0~3) RC Switch EP
拓扑枚举顺序:驱动通过配置空间中的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(数据链路层包)进行通信。

PCIe 分层协议栈模型 事务层 (Transaction Layer) TLP 组装/解析 · 事务排序 · 流量控制 · 虚通道管理 数据链路层 (Data Link Layer) DLLP 封装 · CRC 校验 · Ack/Nak 重传 · 链路状态管理 物理层 (Physical Layer) 8b/10b 或 128b/130b 编码 · 串行/解串 · 链路训练 · 电气特性 TLP 承载内存读写、I/O 读写、配置读写和消息;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体系结构以点对点串行互连替代共享总线,通过树形拓扑实现灵活扩展,借助三层协议栈分离事务语义、可靠传输和物理信号。驱动开发者需重点掌握:

  1. 配置空间枚举流程(Bus/Device/Function遍历)
  2. TLP类型与BAR地址映射关系
  3. 数据链路层重传机制对DMA可靠性的影响
  4. 物理层链路训练参数(MPS/MRRS)对吞吐量的约束