第1章 PCIe概述

如果你做过嵌入式或者PC主板开发,大概率被PCIe折磨过——信号质量、链路训练、配置空间……随便哪个坑都够喝一壶的。但别怕,这章我们先从整体上把PCIe这根“高速公路”看明白。我会尽量用我自己的踩坑经验帮你们少走弯路。

1.1 为什么需要PCIe?

在PCIe出现之前,PC里的扩展总线是PCI(1992年推出)和更早的ISA。PCI是并行总线,32位或64位数据线同时传输。你想想看,信号频率一高,并行线路之间的串扰和时钟偏移就特别严重。我当年调一块PCI板卡,布线的等长约束改了三版才稳定——那还是33MHz的“低速”时代。

到了21世纪初,显卡、高速网卡、SSD的带宽需求猛增,PCI已经撑不住了。PCIe应运而生,从并行改串行,用差分对传输,频率高、抗干扰强。说白了,就像单车道变多车道高速,而且每条车道都是独立的。

1.2 PCIe的发展历史

PCIe从2003年发布1.0规范至今,已经迭代了好几代。我整理了一张简表,你一看就明白迭代的节奏:

版本 发布年份 单通道带宽 (每个方向) 典型应用场景
PCIe 1.0 2003 2.5 GT/s (≈250 MB/s) 取代PCI,早期显卡
PCIe 2.0 2007 5 GT/s (≈500 MB/s) 主流桌面,服务器
PCIe 3.0 2010 8 GT/s (≈985 MB/s) 显卡、NVMe SSD普及
PCIe 4.0 2017 16 GT/s (≈1.97 GB/s) 数据中心、高端GPU
PCIe 5.0 2019 32 GT/s (≈3.94 GB/s) AI加速、400GE网卡
PCIe 6.0 2022 64 GT/s (≈7.88 GB/s) 下一代计算、CXL
个人习惯:看版本号别只看数字翻倍,实际有效带宽还得扣掉编码开销(比如8b/10b、128b/130b)。3.0改用128b/130b后效率大幅提升,这也是为什么2.0到3.0看起来只从5 GT/s升到8 GT/s,但有效带宽几乎翻倍。

1.3 PCIe与PCI的区别

很多刚接触的朋友会把PCIe和PCI混为一谈,其实从架构到电气特性都完全不同。我列几个关键差异:

维度 PCI PCIe
总线类型 并行共享总线 串行点对点
拓扑 多设备挂在同一总线 树形结构,每个链路独占
带宽 最高 533 MB/s (PCI-X) 单通道已达 ~8 GB/s (6.0)
配置空间 256字节,固定头部 4096字节,扩展能力强
热插拔 基本不支持 规范定义明确支持
中断 共享中断线 (INTx) MSI/MSI-X 消息中断
信号线 约50根 (含控制/地址/数据) 每通道4根差分线 (2对)
我曾经踩过的坑:在PCIe设备上想当然地用PCI的IO空间映射,结果发现很多PCIe Root Complex根本不支持IO空间。配置空间访问方式也不一样,PCI用CF8/CFC端口,PCIe要通过ECAM(Enhanced Configuration Access Mechanism)。如果你从PCI迁移代码,记得先检查驱动里对配置空间的访问路径。

1.4 PCIe的拓扑结构

PCIe采用树形拓扑,核心组件有三个:Root Complex、Switch、Endpoint。我习惯把Root Complex想象成“根”,它直接连接CPU和内存;Switch相当于“路由器”,把一根上游链路分成多根下游链路;Endpoint就是实际设备(显卡、网卡、SSD)。另外还有Bridge,用来连接其他总线(比如PCIe to PCI桥),但咱们课程核心先聚焦前三个。

下面这张图是我自己画的典型拓扑,帮你建立空间感:

PCIe 典型拓扑结构 CPU + Memory Root Complex Switch Endpoint 1 Endpoint 2 Endpoint 3 说明 Root Complex 上接CPU/内存 下挂Switch或直接连Endpoint Switch 用于扩展下游端口

可以看到:Root Complex 是唯一的“根”,它内部集成了多个逻辑功能(内存控制器、中断控制器、DMA引擎等)。Switch 内部其实是一个逻辑上的虚拟PCI桥集,上游端口连接RC,下游端口连接Endpoint或其他Switch。Endpoint 就是功能设备,可以是一个单功能设备(如NVMe SSD),也可以是多功能设备(如GPU+音频)。

注意:PCIe拓扑中不允许有环路,一定是严格的树状。实际系统中Root Complex可能包含多个Root Port,每个Root Port可以接一个Switch或直接接Endpoint。我记得调试一块服务器主板时,发现CPU的Root Port竟然有40多个,驱动枚举配置空间时花了不少时间。

1.5 一个简单的例子

拿一台普通台式机举例:CPU内部集成Root Complex(Intel叫PCH,AMD叫FCH),其中一个Root Port连显卡(Endpoint),另一个Root Port连M.2插槽(NVMe SSD也是Endpoint),还有一个Root Port连一个PCH芯片(其实PCH内部包含Switch逻辑),然后PCH再出多个端口接USB控制器、网卡、SATA等。你看,是不是和上面的拓扑图一模一样?

理解了这个结构,后续学配置空间、内存映射、DMA都会顺畅很多。记住一句话:PCIe世界的一切通信,都是从RC发起或终结的。Endpoint不会主动发请求到内存——它只能通过RC中转。