好的,各位同学,我们开始上课。 ## PCIe 基础回顾:架构、拓扑与分层模型 ### 1.1 聊聊PCIe总线架构 PCIe这个接口,大家应该不陌生。不管是电脑主板上插显卡的插槽,还是服务器里连SSD的接口,现在基本都是它。 它的全称是 PCI Express,说白了就是把PCI那种共享总线的并行架构,彻底换成点对点的串行差分连接。这么换有什么好处?我刚开始接触的时候也觉得只是换了个接口形式,后来才体会到,这背后是整个系统数据流动方式的革命。 **为什么非换不可?** 传统的PCI总线,所有设备挂在一个共享的并行总线上,就像一条单车道,谁先上谁走,还得大家商量着来,避免信号冲突。频率一高,电磁干扰和信号同步就成了噩梦。 PCIe则不同。每个设备都有自己专用的高速车道,而且是串行差分传输。频率可以跑得极高,而且因为不是共享的,每个设备都能独享带宽。

PCIe 的核心思想: 用高速串行差分信号,替代低速并行共享总线,实现点对点的全双工通信。

**那串行差分信号是个啥?** 这个概念其实不复杂。一条PCIe链路(Link)由若干通道(Lane)组成,每一对TX/RX通道就是一条物理链路。发送端通过两条线,分别发送完全反相的信号。接收端通过比较这两条线的电压差来还原数据。 这样做的好处,是能极大地抑制共模噪声。我有个朋友,早期做132总线纠错就吃够了并行信号毛刺的亏,换成PCIe之后,调试工作量明显下来了。 ### 1.2 拓扑结构:从CPU到你手上的设备 PCIe的拓扑是一个树形结构,从根节点开始,一层层延伸出去。这个结构里主要有三种角色: - **根复合体 (Root Complex, RC)**:CPU的大脑,连接内存、显卡等关键设备。 - **交换机 (Switch)**:像路由器一样,把上游的一路流量分成多路,或者合并多路。 - **端点 (Endpoint, EP)**:我们最终要操作的设备,比如网卡、磁盘控制器。
PCIe 树形拓扑结构 PCIe 树形拓扑结构 根复合体 (Root Complex) 交换机 (Switch 1) 端点 (Endpoint 1) 交换机 (Switch 2) 端点 (Endpoint 2) 端点 (Endpoint 3) PCIe-PCI 桥接器 遗留 PCI 设备 (Legacy PCI Device) 说明:虚线连接表示通过桥接器连接传统 PCI 设备;其余均为原生 PCIe 连接。

交换机内部的工作原理: 交换机内部其实就是个专门的PCIe交换芯片,它不参与上层协议解析,只是根据路由信息把TLP包发到对应的端口上。

**拓扑里的小陷阱** 我遇到过一个挺头疼的bug。某款主板上,一个PCIe SSD直接连到CPU的RC,另一个SSD通过一个Switch再连RC。结果前一个设备跑满了,后一个设备带宽就出现奇怪波动。调了很久才发现,是RC内部的设计问题,当某个端口压力大时,其他端口会间歇性被卡住。 这告诉我们,拓扑不只是画个方块图,它直接关系到性能的稳定。 ### 1.3 分层模型:数据在栈里怎么走 最核心的部分来了。PCIe用了分层的架构,每一层只管自己那点事,把复杂的东西包装起来。这个模型分为三层: | 层级 | 主要职责 | 协议数据单元 | |:---|:---|:---| | **事务层** | 处理读写请求、完成包、顺序、QoS | 事务层包 (TLP) | | **数据链路层** | 数据完整性校验、重传、流控 | 数据链路层包 (DLLP) | | **物理层** | 信号编码、序列化/反序列化、链路训练 | 物理层包 (PLP) | **事务层 —— 应用的代言人** 事务层是顶层,它不关心数据怎么物理传输,只管生成和解析T的事务层包(TLP)。比如,软件发起一个读内存请求,事务层就会生成一个内存读TLP。 事务层里有个东西叫“事务描述符”,里面有请求者ID、标签等信息,用来唯一标识一个事务。这就像寄快递时的面单,收件人、寄件人、流水号都有。 **数据链路层 —— 快递的安检员** 这一层负责在相邻的两个设备间可靠传输TLP。它会在每个TLP上加上序列号和CRC校验码,形成一个DLLP。接收方校验无误后,会发一个ACK回来;如果校验失败,发送方会重传。 注意,数据链路层是点到点的,只负责一个链路段内的可靠传输。跨过Switch,数据每经过一个链路,就会经过一次数据链路层。 **物理层 —— 真正的搬运工** 物理层是实实在在的硬件,负责把DLLP变成电信号发射出去,以及把收到的电信号还原成DLLP。 它包含几个子块:物理编码子层 (PCS)、介质访问控制子层 (MAC) 和物理介质附加子层 (PMA)。其中,PCS负责8b/10b或128b/130b编码,PMA负责串行化和反序列化。

重要提示: 当我们在研究 ASPM(主动状态电源管理)时,主要会跟物理层和数据链路层打交道。特别是物理层的链路状态转换(L0s, L1, L2等),以及数据链路层的电源管理DLLP,是ASPM的核心。

**为什么这样分层?** 很简单。 每一层都能独立演进。比如物理层从2.5 GT/s进化到5 GT/s、8 GT/s,但上层的事务层和数据链路层协议基本没变。调试起来也轻松——哪一层出的问题,就在哪一层抓包分析,不会一头雾水。 好,这节课把PCIe的骨架搭完了。有了这个基础,下一节我们正式进入ASPM的世界。