PCIe四类核心请求TLP:配置、内存、I/O与消息
PCIe设备上线后,软件与硬件之间的所有通信都依赖事务层数据包(TLP,Transaction Layer Packet)。虽然TLP类型众多,但从“访问什么”和“如何访问”的角度看,最核心的是四类请求:配置读写(CfgRd/CfgWr)、内存读写(MRd/MWr)、I/O读写(IORd/IOWr)和消息(Msg/MsgD)。理解这四类的区别,是掌握PCIe访问模型的关键。
一、四类TLP速览:访问空间与响应模式
这四类TLP的核心区别可以从两个维度区分:访问的目标地址空间,以及是否需要等待对方的完成回复(Completion)。
| TLP类型 | 访问地址空间 | 是否等待回复(Posted/Non-Posted) | 关键用途 |
|---|---|---|---|
| CfgRd / CfgWr | 配置空间(每个Function独有) | Non-Posted(读和写都等待回复) | 系统枚举、设备识别与初始化 |
| MRd / MWr | 内存地址空间(系统RAM或MMIO) | MRd:Non-Posted MWr:Posted(不等待) |
高性能数据传输(DMA、MMIO访问) |
| IORd / IOWr | I/O端口空间(x86遗留,最大64KB) | Non-Posted(读和写都等待回复) | 兼容传统ISA设备,现代设备已不推荐 |
| Msg / MsgD | 无固定地址(消息通道) | Posted(不等待) | 中断、电源管理、错误上报等控制事件 |
最易混淆的记忆点:在所有写操作中,只有内存写(MWr)和消息(Msg/MsgD)是Posted(发出即忘),而配置写(CfgWr)和I/O写(IOWr)都必须是Non-Posted,需要等待确认。
二、CfgRd/CfgWr:枚举的核心工具,Type 0与Type 1的分工
配置读写是系统软件进行枚举(Enumerate)的根本手段。它内部包含两个关键变体,用于处理不同的总线层级:
- Type 0配置请求:用于访问直接挂载在当前总线上的设备。当TLP到达目标总线后,该总线上的所有设备都会检查其设备号(Device Number)是否匹配,只有匹配的设备才会响应。
- Type 1配置请求:用于访问位于下游(通过Switch)的设备。根联合体(RC)将Type 1 TLP发送给Switch,Switch会检查其中的总线号(Bus Number)是否在自己的管辖范围内(即从次总线号到从属总线号之间)。如果是,Switch会将其转换为Type 0并转发到对应总线上。如果不是,而忽略该TLP。
运作流程:系统软件在枚举时,交替使用Type 1配置写为Switch分配总线号范围,并使用Type 0/Type 1配置读来探测设备。这种机制使得软件无需预先知道拓扑,也能逐级遍历整棵PCIe设备树。
三、MRd/MWr:现代高性能数据传输的主干
内存读写是PCIe最繁忙的路径,几乎所有大数据量的传输都依赖它。
- MRd(内存读):Non-Posted。发起读请求后,必须等待设备返回包含所需数据的完成包(CplD)。这保证了数据读取的可靠性。
- MWr(内存写):Posted。写请求发出后,无需等待设备的任何确认即可继续发送。这种“流水线”操作极大提升了数据传输吞吐量,是PCIe高带宽的关键之一。
它覆盖的场景包括:CPU通过MMIO(内存映射I/O)读写设备寄存器、设备通过DMA(直接内存访问)读写系统内存,以及设备之间的对等(Peer-to-Peer)传输。
四、IORd/IOWr:从PCI时代继承的“慢车道”
I/O读写是x86架构中in/out指令的产物,访问的是独立的I/O端口空间(0x0000-0xFFFF)。
- 关键特性:与内存写不同,IOWr也是Non-Posted,必须等待完成包。这是为了兼容旧式x86 I/O操作的强排序语义,确保写操作到达设备后才继续执行。
- 现状:PCIe规范要求支持它主要是为了兼容传统设备。但现代PCIe设备强烈建议将所有寄存器通过MMIO暴露,不再使用I/O端口。新系统甚至可以声明不支持此空间。
五、Msg/MsgD:无需地址的“控制信号通道”
消息TLP是PCIe的一项设计改进,它用一个统一的包机制替代了传统总线中许多杂乱的边带信号线。
- 特性:全部为Posted,不等待回复。
Msg不带数据负载,MsgD带数据负载。 - 灵活的路由:消息可以路由到根联合体、按地址路由、按ID路由,甚至广播。
- 核心用途:
- 中断:模拟传统的INTx中断信号(Assert_INTx/Deassert_INTx),或作为MSI/MSI-X中断的替代路径。
- 电源管理:设备通过PME(电源管理事件)消息请求唤醒系统。
- 错误上报:上报可校正(ERR_COR)、不可校正(ERR_NONFATAL)或致命(ERR_FATAL)错误。
- 其他:热插拔事件、厂商自定义消息等。
总结
PCIe的四类核心TLP清晰地划分了不同通信场景的职责:CfgRd/Wr通过Type 0/Type 1变体,以精确的BDF寻址,承担了系统枚举的设备发现任务;MRd/MWr作为高性能主干,通过Posted/Non-Posted的差异化设计,兼顾了吞吐与可靠;IORd/Wr是保留的兼容路径;而Msg/MsgD则通过Posted机制和灵活路由,统一了控制面通信。理解这四类TLP,就抓住了PCIe数据交换协议的脉络。
PCIE百科





