1. PCIe 基础:总线架构概述、拓扑结构与分层协议
PCI Express(PCIe)作为现代高性能外设互连标准,取代了传统的 PCI/PCI-X 并行总线,采用高速串行点对点连接与分组交换技术。在 DMA 控制器编程与数据传输优化中,理解 PCIe 的物理拓扑、分层协议及事务规则是编写高效驱动的前提。
1.1 PCIe 总线架构概述
PCIe 是一种基于 高速差分串行链路 的互连技术,每个通道(Lane)由两对差分信号线(发送对 + 接收对)组成。与并行总线不同,PCIe 使用 数据包(Packet) 在设备间传输事务,而非共享地址/数据线。
| 特性 | 传统 PCI(并行) | PCIe(串行) |
|---|---|---|
| 总线宽度 | 32/64 位共享总线 | 1/2/4/8/16 通道(x1 ~ x16) |
| 传输方式 | 同步并行,共享仲裁 | 高速串行,点对点全双工 |
| 时钟模式 | 共享时钟(33/66 MHz) | 内嵌时钟(2.5/5/8/16 GT/s) |
| 数据包化 | 无,直接总线事务 | TLP/DLLP 数据包交换 |
| 热插拔支持 | 有限 | 原生支持 |
1.2 拓扑结构
PCIe 采用 树形拓扑,由根复合体(Root Complex)、交换器(Switch)、端点(Endpoint)和桥接器(Bridge)组成。所有设备通过虚拟通道(VC)实现隔离与优先级控制。
1.3 分层协议
PCIe 协议栈分为三个逻辑层:事务层(Transaction Layer)、数据链路层(Data Link Layer) 和 物理层(Physical Layer)。每层对上层提供服务,对下层封装数据。
1.3.1 事务层(Transaction Layer)
事务层是驱动开发者最常接触的层次,负责生成与解析 事务层包(TLP)。TLP 包含事务类型、地址、数据负载、标签(Tag)和流量类别(TC)等信息。
- 存储器事务: Memory Read/Write,用于 DMA 读写系统内存。
- IO 事务: IO Read/Write,用于访问传统 IO 空间。
- 配置事务: Configuration Read/Write,用于枚举与配置设备。
- 消息事务: 中断(MSI/MSI-X)、错误报告、电源管理等。
1.3.2 数据链路层(Data Link Layer)
数据链路层负责 可靠传输,在 TLP 前后添加序列号(Sequence Number)和 CRC(LCRC),并通过 数据链路层包(DLLP) 进行链路管理。
| DLLP 类型 | 功能 | 与 DMA 关系 |
|---|---|---|
| Ack/Nak | 确认/重传 TLP | 保证 DMA 数据不丢失 |
| InitFC1/InitFC2 | 初始化流量控制 | 建立发送窗口 |
| UpdateFC | 更新信用量 | 控制 DMA 发送速率 |
| PM_* | 电源管理 | 影响 DMA 延迟 |
1.3.3 物理层(Physical Layer)
物理层分为 逻辑子层 和 电气子层,负责串行化/解串行化、8b/10b 或 128b/130b 编码、时钟恢复与链路训练。
1.4 分层协议数据流(TLP 封装过程)
当 DMA 引擎发起一次内存写入时,数据从事务层逐层向下封装,经过数据链路层添加序列号和 CRC,最终由物理层发送到链路上。接收端反向解封装。
1.5 流量控制与信用量机制
PCIe 使用 信用量(Credit) 机制防止接收端缓冲区溢出。每个虚拟通道(VC)维护独立的信用量池,分为 Posted(P)、Non-Posted(NP)和 Completion(Cpl)三类。
- Posted 事务: Memory Write,不需要完成(Completion),DMA 写操作属于此类。
- Non-Posted 事务: Memory Read / IO / Configuration,需要返回 Completion。
- Completion 事务: 对 Non-Posted 的响应,携带读取数据。