PCIe 基础知识
建立完整的知识框架
拓扑结构
PCIe采用层次化的树形拓扑结构,由Root Complex(根复合体)、Switch(交换器)、Bridge(桥接器)和Endpoint(终端设备)组成。
Root Complex
Bus 0
CPU/内存子系统
Switch A
Bus 1
上游:Bus0,下游:Bus2-4
Switch B
Bus 5
上游:Bus0,下游:Bus6-7
GPU
Bus 2
x16 Endpoint
NVMe SSD
Bus 3
x4 Endpoint
Switch C
Bus 4
级联Switch
网卡
Bus 6
x8 Endpoint
AI加速卡
Bus 7
x16 Endpoint
总线号分配示例
Root Complex (Bus 0)
├── Root Port 0 → Switch A (Bus 1)
│ ├── Downstream Port 0 → GPU (Bus 2)
│ ├── Downstream Port 1 → NVMe SSD (Bus 3)
│ └── Downstream Port 2 → Switch C (Bus 4)
│ └── Endpoint (Bus 4-Sub)
└── Root Port 1 → Switch B (Bus 5)
├── Downstream Port 0 → 网卡 (Bus 6)
└── Downstream Port 1 → AI加速卡 (Bus 7)
Root Complex (RC)
Root Complex是PCIe层次结构的根节点,连接CPU/内存子系统和PCIe域。它负责:
- 发起配置访问
- 处理来自Endpoint的内存请求
- 管理中断路由
- 提供时钟和电源管理
Switch
Switch是多端口设备,用于扩展PCIe拓扑:
- 一个上游端口连接RC或其他Switch
- 多个下游端口连接Endpoint或下游Switch
- 执行路由功能,转发TLP
Endpoint
Endpoint是终端设备,可以是:
- Legacy Endpoint:传统PCI设备
- PCIe Endpoint:原生PCIe设备
- 支持Memory、I/O、配置事务
协议分层模型
PCIe协议采用分层架构,每层负责特定功能,便于实现和验证。
软件层
设备驱动程序、操作系统
事务层 (Transaction Layer)
TLP组包/解包
虚拟通道管理
流量控制
数据链路层 (Data Link Layer)
序列号管理
CRC生成/校验
Ack/Nak重传
物理层 (Physical Layer)
编码/解码
串行化/解串
链路训练
数据封装流程
1
事务层
接收上层请求,构造TLP(事务层包),添加Header和可选ECRC
2
数据链路层
添加序列号和LCRC,计算并存储重传缓冲区
3
物理层
编码、加扰、添加起始/结束帧,串行发送
事务类型
PCIe定义了多种事务类型,满足不同的访问需求。
| 类型 | 读写 | 地址空间 | 用途 |
|---|---|---|---|
| Memory | Rd/Wr | Memory空间 | 大块数据传输,最常用 |
| I/O | Rd/Wr | I/O空间 | 传统设备兼容 |
| Configuration | Rd/Wr | 配置空间 | 设备枚举和配置 |
| Message | 仅写 | 无地址 | 中断、错误报告 |
Memory事务详解
Memory事务是最常用的事务类型,支持大块数据的高效传输。
Memory Read (MRd)
- 请求者发起读请求
- 指定地址、长度、标签
- 完成者返回CplD(带数据的完成包)
- 支持拆分事务
Memory Write (MWr)
- 请求者发送数据和地址
- Posted事务,无需完成包
- 提高写入效率
- 可选原子操作
地址路由方式
地址路由
Memory/I/O事务使用64位或32位地址路由
ID路由
配置事务和部分消息使用Bus/Device/Function号路由
隐式路由
消息事务可路由到RC,无需地址信息
流量控制
PCIe采用基于信用的流量控制机制,防止发送方淹没接收方。
发送方
Posted信用计数器
PH: 7 | PB: 127
Non-Posted信用计数器
NPH: 7 | NPD: 127
Completion信用计数器
CplH: 7 | CplD: 127
TLP
FC Update DLLP
接收方
VC0缓冲区
PH/PB/NPH/NPD/CplH/CplD
VC1-7缓冲区
每个VC独立信用管理
信用管理
通告可用缓冲空间
流量控制工作原理
1
初始化
接收方初始化各VC的信用值,通过FC_INIT DLLP通告给发送方
2
发送检查
发送方检查对应VC的信用计数器,有足够信用时才发送TLP
3
信用消耗
发送TLP后,发送方减少相应信用计数器(PH/PB/NPH/NPD/CplH/CplD)
4
信用更新
接收方处理TLP后释放缓冲区,通过FC_UPDATE DLLP通告新的信用值
信用类型
| 信用类型 | 用途 | 单位 |
|---|---|---|
| PH (Posted Header) | Posted请求头缓存 | Header个数 |
| PB (Posted Data) | Posted数据缓存 | 数据单元(4DW) |
| NPH (Non-Posted Header) | Non-Posted请求头缓存 | Header个数 |
| NPD (Non-Posted Data) | Non-Posted数据缓存 | 数据单元 |
| CplH (Completion Header) | 完成包头缓存 | Header个数 |
| CplD (Completion Data) | 完成数据缓存 | 数据单元 |
中断机制
PCIe支持多种中断方式,从传统的INTx到现代的MSI/MSI-X。
INTx (传统中断)
与传统PCI兼容,使用INTA#/INTB#/INTC#/INTD#信号线。
- 支持4条中断线
- 多个设备可共享中断线
- 需要中断控制器仲裁
- 性能较低,现代设备很少使用
MSI (消息信号中断)
通过Memory Write TLP发送中断消息,无需专用信号线。
- 支持1-32个中断向量
- 每个向量可独立配置目标CPU
- 避免中断共享,提高性能
- 适用于大多数设备
MSI消息格式:
┌─────────────────────────────────┐
│ Address: 0xFEExxxxx │
│ Data: Vector | CPU ID | etc │
└─────────────────────────────────┘
MSI-X (增强型MSI)
MSI的增强版本,支持更多向量和更灵活的配置。
- 支持最多2048个向量
- 每个向量独立地址/数据
- 向量配置存储在设备内存
- 支持动态向量掩码
适用于高性能设备:NVMe SSD、高速网卡等
错误处理
PCIe定义了完善的错误检测、报告和恢复机制。
错误类型
可纠正错误
- 物理层错误(8b/10b或扰码错误)
- Replay Timer超时
- Replay Number溢出
- Bad TLP
- Bad DLLP
不可纠正错误
- 训练序列错误
- 数据链路层协议错误
- 中毒TLP (Poisoned TLP)
- 流量控制协议错误
- 完成超时
- 意外完成
AER (高级错误报告)
PCIe扩展能力,提供详细的错误诊断信息。
AER Capability
0x140起始
Uncorrectable Error Status
记录发生的不可纠正错误
Uncorrectable Error Mask
屏蔽特定错误报告
Correctable Error Status
记录发生的可纠正错误
Header Log
记录错误TLP的Header