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(数据链路层包),通过串行差分信号在链路上传输。
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模式驱动中,可以通过增大接收缓冲区或调整信用初始化值来缓解。
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带宽将直接减半。
1.5 本章小结
PCIe的分层体系结构为驱动开发提供了清晰的抽象:
- 事务层:驱动直接交互的层次,负责TLP封装,DMA读写操作的核心。
- 数据链路层:保证传输可靠性,流控机制直接影响DMA吞吐。
- 物理层:提供物理传输介质,链路宽度和速率决定带宽上限。