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

在深入 DMA 延迟优化之前,必须重新理解 PCIe 的层次化架构。PCIe 采用树形拓扑与分层协议栈设计,每一层都对延迟和吞吐产生直接影响。本章将快速梳理核心概念,为后续的驱动优化建立共同语言。

1.1 PCIe 拓扑结构

PCIe 系统由 Root Complex (RC)、Switch、Endpoint (EP) 和 Bridge 组成。所有设备通过点对点链路连接,不再共享总线。

关键认知: 拓扑决定了 DMA 路径的跳数。每经过一个 Switch,会增加约 150–300 ns 的穿越延迟。驱动优化时,必须了解目标 EP 在拓扑中的位置。
性能提示: 同一 Root Port 下的 EP 之间进行 Peer-to-Peer DMA,延迟通常比经过 RC 的路径低 30%–50%。
PCIe 典型拓扑结构 Root Complex (RC) Switch (Upstream + 4 Downstream) EP 1 (NVMe) EP 2 (GPU) Switch 2 EP 3 (NIC) EP 4 (FPGA) 图例: Root Complex Switch Endpoint 链路 直接连接

1.2 事务层 (Transaction Layer)

事务层是 PCIe 协议栈的最上层,负责事务层包 (TLP) 的封装与解析。TLP 是 DMA 数据传输的基本单元。

TLP 类型 方向 DMA 相关场景 延迟敏感度
Memory Read (MRd) EP → RC DMA 读取系统内存 高
Memory Write (MWr) EP → RC DMA 写入系统内存 中
Completion (Cpl/CplD) RC → EP 读请求的返回数据 高
Message (Msg) 双向 中断 (MSI/MSI-X) 低
优化陷阱: 驱动中如果频繁使用 MRd 读取小数据块,会因 Completion 延迟累积导致吞吐骤降。应优先使用 MWr 或合并读请求。

1.3 数据链路层 (Data Link Layer)

数据链路层在 TLP 前后添加 序列号 (Sequence Number) 和 CRC (LCRC),实现可靠传输与重传机制。该层对延迟的影响主要体现在:

  • ACK/NAK 协议: 每收到一个 TLP,接收方返回 ACK。若超时未收到 ACK,发送方重传。重传延迟通常在 1–5 µs 级别。
  • 流控 (Flow Control): 基于信用 (Credit) 机制。如果接收方信用耗尽,发送方必须等待,造成 Stall。
  • 数据完整性: LCRC 校验失败会触发重传,对延迟敏感应用(如实时控制)影响显著。
驱动级优化: 通过配置 Max Payload Size (MPS) 和 Read Completion Boundary (RCB),可以减少数据链路层的包拆分次数,降低重传概率。

1.4 物理层 (Physical Layer)

物理层负责串行化/解串行、8b/10b 或 128b/130b 编码、链路训练和电气特性。物理层参数直接决定链路带宽和位延迟。

PCIe 版本 编码方式 每 Lane 速率 (GT/s) 有效带宽 (x16) 典型位延迟
Gen 3 128b/130b 8.0 ~15.75 GB/s ~125 ps
Gen 4 128b/130b 16.0 ~31.5 GB/s ~62 ps
Gen 5 128b/130b 32.0 ~63.0 GB/s ~31 ps
延迟构成公式: 总延迟 ≈ 事务层处理延迟 + 数据链路层排队/重传延迟 + 物理层串行化延迟 + 传播延迟。其中物理层串行化延迟 = 包大小 / 链路速率,是 DMA 延迟的下限。
PCIe 分层协议栈与数据流 发送端 (EP) 事务层 TLP 封装 数据链路层 Seq + LCRC + ACK 物理层 串行化 / 编码 PCIe 链路 (Lane 0 ~ Lane N) 接收端 (RC) 物理层 解串 / 解码 数据链路层 校验 + ACK/NAK 事务层 TLP 解析 数据流方向: EP 事务层 → 数据链路层 → 物理层 → 链路 → 物理层 → 数据链路层 → RC 事务层

1.5 关键性能参数总结

以下表格汇总了影响 DMA 延迟和吞吐的核心 PCIe 参数,驱动开发者在初始化阶段必须确认这些值:

参数 所属层 对延迟的影响 对吞吐的影响 驱动可配置
Max Payload Size (MPS) 事务层 大 MPS 减少包数量,降低延迟 大 MPS 提升吞吐 是
Max Read Request Size (MRRS) 事务层 限制读请求大小,影响延迟 大 MRRS 提升读吞吐 是
Read Completion Boundary (RCB) 事务层 影响 Completion 拆分粒度 间接影响 是
链路宽度 (Lane Count) 物理层 无直接影响 线性提升 否 (硬件决定)
链路速率 (Gen) 物理层 降低串行化延迟 线性提升 否 (硬件决定)
Flow Control Credits 数据链路层 信用不足导致 Stall 限制吞吐 部分 (通过配置空间)
驱动初始化检查清单:
1. 读取 Device Capabilities 寄存器,确认 MPS/MRRS 上限。
2. 通过 Device Control 寄存器设置 MPS 和 MRRS 为最大值(通常 512B 或 1024B)。
3. 确认链路宽度和速率是否达到预期(通过 Link Status 寄存器)。
4. 检查 ACS (Access Control Services) 是否启用,避免 Peer-to-Peer 被阻塞。