1. PCIe基础回顾:PCIe体系结构概述、事务层、数据链路层、物理层

1.1 PCIe体系结构概述

PCI Express(PCIe)是一种高速串行计算机扩展总线标准,采用点对点拓扑结构,取代了传统的并行PCI/PCI-X总线。在RC(Root Complex)模式驱动开发中,理解PCIe的分层体系结构是进行DMA传输性能调优的理论基础。

PCIe体系结构在逻辑上分为三个层次:事务层(Transaction Layer)、数据链路层(Data Link Layer)和物理层(Physical Layer)。每个层次负责不同的功能,共同保证数据的可靠传输。

关键概念: PCIe使用基于数据包的协议,所有数据在发送前被封装成TLP(事务层包)或DLLP(数据链路层包),通过串行差分信号在链路上传输。
PCIe分层体系结构图 PCIe 分层体系结构 发送端(A) 接收端(B) 事务层 TLP 封装/解封装 数据链路层 DLLP / 重传 / CRC 物理层 串行化 / 解串 事务层 TLP 解封装 数据链路层 DLLP / 重传 / CRC 物理层 串行化 / 解串 TLP 流 DLLP 流 串行比特流 差分信号对(Lane) 说明 数据从发送端事务层 → 数据链路层 → 物理层,经串行链路传输到接收端物理层 → 数据链路层 → 事务层。 每一层对上层透明,驱动开发主要关注事务层(TLP)和数据链路层(流控/重传)。

1.2 事务层(Transaction Layer)

事务层是PCIe体系结构的最上层,负责TLP(Transaction Layer Packet)的生成与解析。在RC模式驱动中,DMA传输的读写请求最终由事务层封装为TLP发送到目标设备。

1.2.1 TLP格式

一个标准的TLP由以下字段组成:

字段 长度(字节) 说明
前导码(STP) 1 标识TLP起始
TLP头 12 或 16 包含事务类型、长度、地址、Tag等关键信息
数据负载 0 ~ 4096 可选,最大为4KB(受Max_Payload_Size限制)
ECRC 4 端到端CRC校验(可选)
LCRC 4 链路CRC校验(由数据链路层添加)

1.2.2 事务类型

PCIe定义了四种基本事务类型,驱动开发中DMA主要使用Memory Read/Write事务:

  • Memory Read (MRd):从目标地址读取数据,用于DMA读操作。
  • Memory Write (MWr):向目标地址写入数据,用于DMA写操作。
  • Completion (Cpl/CplD):对MRd的响应,携带读取的数据。
  • I/O / Configuration:用于设备枚举和配置空间访问。
性能调优要点: DMA写操作使用MWr事务,不需要等待Completion,延迟更低;DMA读操作需要等待CplD返回,延迟较高。在RC模式驱动中,优先使用写操作(如Write Back)可提升吞吐量。

1.3 数据链路层(Data Link Layer)

数据链路层位于事务层和物理层之间,主要职责是保证TLP在链路上的可靠传输。它通过DLLP(Data Link Layer Packet)实现流控、重传和链路管理。

1.3.1 核心功能

功能 机制 对DMA性能的影响
CRC校验 为每个TLP添加LCRC 增加少量开销,但保证数据完整性
ACK/NAK重传 接收端返回ACK/NAK,NAK触发重传 链路质量差时增加延迟
流控(Flow Control) 基于信用(Credit)机制,防止接收端缓冲区溢出 信用不足时阻塞TLP发送,影响DMA吞吐
链路训练 初始化链路速率和宽度 决定最大带宽

1.3.2 流控机制详解

数据链路层使用信用(Credit)机制进行流控。发送端必须拥有足够的信用才能发送TLP,否则必须等待接收端返回信用更新DLLP。

  • Posted Credit:用于MWr等不需要响应的TLP。
  • Non-Posted Credit:用于MRd等需要响应的TLP。
  • Completion Credit:用于Cpl/CplD。
常见性能瓶颈: 如果接收端信用不足,发送端会暂停发送,导致DMA传输出现“气泡”。在RC模式驱动中,可以通过增大接收缓冲区或调整信用初始化值来缓解。
数据链路层流控机制图 数据链路层流控(Credit)机制 发送端(RC) 信用计数器:3 待发送TLP:5个 状态:等待信用 接收端(EP) 信用上限:10 已用信用:7 可用信用:3 TLP 流 DLLP:信用更新 流控工作流程 1. 发送端检查信用计数器,若信用不足则暂停发送。 2. 接收端处理完TLP后,通过DLLP返回信用更新。 3. 发送端收到信用更新后,恢复TLP发送。 4. 信用不足是DMA传输性能下降的常见原因之一。

1.4 物理层(Physical Layer)

物理层是PCIe体系结构的最底层,负责串行数据的发送与接收,以及链路训练和初始化。物理层分为逻辑子层和电气子层。

1.4.1 物理层组成

子层 功能 关键参数
逻辑子层 8b/10b编码(Gen1/Gen2)或128b/130b编码(Gen3+)、加扰、去加扰 编码效率、误码率
电气子层 差分信号驱动、接收均衡、时钟恢复 信号幅度、抖动、眼图

1.4.2 链路宽度与速率

物理层决定了链路的最大带宽,这是DMA传输性能的硬上限。常见配置如下:

PCIe 版本 单 Lane 速率(GT/s) 编码方式 x1 带宽(GB/s) x16 带宽(GB/s)
Gen1 2.5 8b/10b 0.25 4.0
Gen2 5.0 8b/10b 0.5 8.0
Gen3 8.0 128b/130b 0.985 15.75
Gen4 16.0 128b/130b 1.969 31.51
Gen5 32.0 128b/130b 3.938 63.02
性能调优提示: 在RC模式驱动中,应通过读取链路状态寄存器(如PCIe Capability中的Link Status Register)确认当前链路宽度和速率。如果链路未达到预期配置(如x16降级为x8),DMA带宽将直接减半。
物理层链路训练与数据传输图 物理层链路训练与数据传输 Lane 0:差分对(Tx+ / Tx-) Lane 0:差分对(Rx+ / Rx-) Lane 1:差分对(Tx+ / Tx-) Lane 1:差分对(Rx+ / Rx-) Lane 2:差分对(Tx+ / Tx-) Lane 2:差分对(Rx+ / Rx-) Lane 3:差分对(Tx+ / Tx-) Lane 3:差分对(Rx+ / Rx-) 链路训练阶段:物理层通过握手确定 Lane 数量、速率和极性,完成后进入 L0 状态进行正常数据传输。

1.5 本章小结

PCIe的分层体系结构为驱动开发提供了清晰的抽象:

  • 事务层:驱动直接交互的层次,负责TLP封装,DMA读写操作的核心。
  • 数据链路层:保证传输可靠性,流控机制直接影响DMA吞吐。
  • 物理层:提供物理传输介质,链路宽度和速率决定带宽上限。