第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 |
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对) |
1.4 PCIe的拓扑结构
PCIe采用树形拓扑,核心组件有三个:Root Complex、Switch、Endpoint。我习惯把Root Complex想象成“根”,它直接连接CPU和内存;Switch相当于“路由器”,把一根上游链路分成多根下游链路;Endpoint就是实际设备(显卡、网卡、SSD)。另外还有Bridge,用来连接其他总线(比如PCIe to PCI桥),但咱们课程核心先聚焦前三个。
下面这张图是我自己画的典型拓扑,帮你建立空间感:
可以看到:Root Complex 是唯一的“根”,它内部集成了多个逻辑功能(内存控制器、中断控制器、DMA引擎等)。Switch 内部其实是一个逻辑上的虚拟PCI桥集,上游端口连接RC,下游端口连接Endpoint或其他Switch。Endpoint 就是功能设备,可以是一个单功能设备(如NVMe SSD),也可以是多功能设备(如GPU+音频)。
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中转。