PCIe从入门到精通
+ -

PCIe从入门到精通之三:PCIe设备的内部组件

2026-04-02 0 0

0. 引言

PCIe 是硬件工程师跨不过去的坎。我刚开始工作就接触 PCIe,工作中遇到的所有产品都有 PCIe 总线。在此想把自己学习 PCIe 的一些经历和感悟,以及踩过的坑分享在这里,与大家一起进步。

所有 PCIe 主题的文章都会收录在《深入浅出聊 PCIe》合集里,每篇文章涵盖一个 PCIe 的主题,预计会有几十篇文章。

在上一篇文章《PCIe 从入门到精通之二:计算机王国中的 PCIe 设备》中,我们介绍了三类 PCIe device:PCIe Root Complex、PCIe Endpoint 和 PCIe Switch,并着重详细介绍了 Root Complex 内的三个组件:Host Bridge、RCiEP 和 Root Port 的基本功能。在这一篇文章中我们继续介绍 PCIe device 的更多内部组件。

需要下载 PCIe 学习资料的朋友(pdf 格式),请关注本微信公众号“硬件工程师宝典”,在对话框内回复“PCIe”,将获取标准下载链接。


1. PCIe 设备内的组件:Upstream Port、Downstream Port 和 Virtual PCI-PCI Bridge

在 PCIe 设备中,“上游端口”(Upstream Port)和“下游端口”(Downstream Port)是根据它们相对于“根联合体”(Root Complex, RC)的方向来定义的,就像总公司向子公司传达命令的方向。如下图所示。

PCIe拓扑结构

上图是一个 Root Complex 和 PCIe device 直接互联图:

  • Root Complex:包含 Virtual PCI-PCI Bridge 和 Downstream Root Port(因为总公司总是向下传达命令的)。
  • PCIe device:包含一个 Upstream Port(因为子公司总是向上递交报告的)。

图中蓝色的箭头代表一个 PCIe Bus。Root Complex 通过自身的 Virtual PCI-PCI Bridge 连到自己的 Root Port 上,Root Port 具有向下的 Downstream Port,Endpoint device 上的 Upstream Port 与 Root Complex 的 Downstream Port 相连接。

1.1 上游端口(Upstream Port)

  • 定义:指向根联合体(Root Complex)方向的端口。
  • 作用:负责将数据和控制信号从设备或 PCIe 交换机发送到更靠近根联合体的方向。

Upstream Port 示例

  • 对于终端设备(Endpoint Device),例如显卡或 SSD,它连接到 CPU(即根联合体)的端口就是上游端口。
  • 对于 PCIe 交换机,连接到根联合体或另一个更靠近根联合体的交换机的端口,是该交换机的上游端口。

1.2 下游端口(Downstream Port)

  • 定义:远离根联合体(Root Complex)方向的端口。
  • 作用:负责将数据和控制信号从根联合体或 PCIe 交换机发送到更远离根联合体的设备。

Downstream Port 示例

  • 对于根联合体本身,其根端口(Root Port)就是下游端口,因为它连接着拓扑结构中更下层的设备。
  • 对于 PCIe 交换机,连接到终端设备或另一个更远离根联合体的交换机的端口,是该交换机的下游端口。

1.3 Virtual PCI-PCI Bridge

“虚拟 PCI-PCI 桥”并不是一个像传统 PCI 架构中那样独立的物理桥接芯片,而是一个逻辑概念或软件抽象。它的存在是为了让操作系统(OS)能够沿用 PCI 时代已有的设备枚举和配置机制来管理 PCIe 设备。

可以将“虚拟 PCI-PCI 桥”比拟成一个公司内的项目小组,每个“项目小组”有一个项目名字,我们用 PCIe Bus Number 来命名它。因此每个“虚拟 PCI-PCI 桥”下面有一个独立的 PCIe Bus Number。

  • Host Bridge 的 PCIe Bus Number 从 0 开始
  • 其他的 PCIe Bus Number 根据系统开机时枚举来确定(关于 PCIe Bus 枚举,后面在专门章节讲解)

每个根端口在软件角度来看都像一个 PCI-PCI 桥,这意味着它拥有一个配置空间,操作系统可以通过这个配置空间进行管理。

简而言之:理解上游和下游的关键在于方向性——数据流向根联合体为“上游”,数据流离根联合体为“下游”。


2. PCIe Switch 的内部组件

PCIe 交换机(PCIe Switch)是扩展 PCIe 总线拓扑的关键组件。它通过上游端口和下游端口来管理和路由数据流量:

  • 与 Root Complex 联系时:它俯耳倾听,拥有 Upstream Port(可以向上递交报告的权利)
  • 与 Endpoint 联系时:它趾高气扬,拥有 Downstream Port(可以向下传达命令的权利)

PCIe Switch 角色转换非常丝滑。如下图所示,这个 PCIe Switch 拥有一个 Upstream Port 和三个 Downstream Port,每个 PCIe Port 都和一个 Virtual PCI-PCI Bridge 相连。

PCIe Switch内部结构

PCIe Switch 是唯一一个既有 Upstream Port 又有 Downstream Port 的 PCI device

  • 和 Root Complex 一样,每个“虚拟 PCI-PCI 桥”下面有一个独立的 PCIe Bus
  • 图中每一个蓝色的箭头代表一个 PCIe Bus,拥有唯一的 PCIe Bus Number

端口说明

  • 上游端口:连接到 PCIe 层次结构中更高级别(即更靠近根联合体)的端口。一个 PCIe 交换机通常只有一个上游端口(Multi-Host mode 可以有两个 Upstream Port)。
  • 下游端口:连接到 PCIe 层次结构中更低级别(即更远离根联合体)的端口。一个 PCIe 交换机通常有多个下游端口,这使得它能够连接多个设备或进一步扩展 PCIe 总线数量。

3. CPU Root Complex 的内部组件

我们再回过头来看看 CPU Root Complex 的内部组件。它作为总公司 CEO 的秘书办,是最复杂的,通常包含:

  • Host Bridge
  • 若干个 Virtual PCI-PCI Bridge
  • 若干个 RCiEP
  • 至少一个 Root Port
  • 若干个 Root Complex Integrated Endpoint
  • 若干个 Root Complex Event Collector(RCEC)

Host Bridge、Virtual PCI-PCI Bridge、RCiEP 和 Root Port 在上一篇文章中介绍过,下面补充介绍 Root Complex Event Collector 和非透明桥(Non-Transparent Bridge)。

CPU Root Complex内部结构

上图中 Host CPU 直接与 Host Bridge 相连,Host Bridge 向下分别连接:

  • 两个 Root Complex Integrated Endpoint(RCiEP)
  • 一个 Root Complex Event Collector(RCEC)
  • N 个 Virtual PCI-PCI Bridge

每个“虚拟 PCI-PCI 桥”下面有一个独立的 PCIe Bus,图中每一个蓝色的箭头代表一个 PCIe Bus,拥有唯一的 PCIe Bus Number。

3.1 Root Complex Event Collector(RCEC)

RCEC 相当于 Root Complex 的情报机构,也是一个 Root Complex 的内部 PCIe device。它的主要作用是:

收集和处理来自 PCIe 层次结构中特定设备(特别是根联合体集成终端设备 RCiEP)的各种事件消息,并将其报告给系统软件(如操作系统或固件)。

  • RCEC 是专门为支持 RCiEP 而设计的
  • RCiEP 是直接集成在根联合体内部的 PCIe 终端设备(例如某些 CPU 内部的集成显卡或存储控制器)

注意:RCEC 在 PCIe 规范中是一个可选组件。在某些平台中,可能存在硬件执行类似功能但对操作系统不可见的情况,或者通过 ACPI 平台错误接口(APEI)等其他机制来报告错误。但在支持 RCEC 的系统中,它提供了一个标准化的接口来处理这些重要的系统事件。Intel 将 RCEC 集成在 IEH(Integrated Error Handler)里。


4. 透明桥与非透明桥

4.1 透明桥(Transparent Bridge)

在一个集团公司内部(一个 PCIe 体系 Hierarchy 内),总公司(Root Complex)、区域总公司(Switch)和子公司(Endpoint)大家都在一个局域网内,内部的信息和资源是完全公开共享的。

因此 Root Complex、Switch 和 Endpoint 之间的 Memory Space 和 Configuration Space 等信息都相互可以访问——就像“Endpoint 今天穿的内裤的颜色,Root Complex 一清二楚”,大家都是透明的。

处于同一个 PCIe 体系 Hierarchy 内,前面提到的 Root Complex 和 PCIe Switch 内部的 Virtual PCI-PCI Bridge 都是工作在透明模式(白盒模式),其工作方式和所有信息对系统是可见的,我们称之为透明桥(Transparent Bridge, TB)

透明桥将两个连接的总线域合并到一个统一的地址空间中,并将它们视为一个统一的地址域。

4.2 非透明桥(Non-Transparent Bridge)

两个集团公司(两个不同的 PCIe 体系 Hierarchy)之间有可能建立长期的战略合作伙伴关系,它们之间需要经常的大规模的业务往来(数据交换)。两个集团公司可以各自指派一个代表(Contact Window,即 PCIe Bridge)直接联系处理。

例如:

  • 一个 CPU 系统和另一个 CPU 系统通过 Root Port 的 PCIe Bridge 互联
  • 一个 CPU 系统和另一个 CPU 系统通过 PCIe Switch 的 Non-Transparent Bridge 互联

非透明桥连接示例1

非透明桥连接示例2

这两名 Contact Window(PCIe Bridge)只负责交换信息,关于公司内部的运营情况和数据是机密,大家相互之间都守口如瓶。两个 PCIe 体系的 Memory Space 和 Configuration Space 等信息都相互屏蔽,它们都工作在非透明模式(黑盒模式),我们称之为非透明桥(Non-Transparent Bridge, NTB)

非透明桥是一种特殊的 PCIe 桥接器,它不将两个连接的总线域合并到一个统一的地址空间中,而是将它们视为两个独立的地址域。

PCI Express 非透明桥接器(NTB)起到了桥梁的作用,能够实现两个 PCI Express 体系(例如本地系统和远程系统)之间的高性能、低延迟通信。NTB 允许本地处理器独立配置和控制本地系统,并将本地主机内存域与远程主机内存域隔离开来,同时实现两个域之间的状态和数据交换。本地处理器会将 NTB 视为根复杂集成端点(RCiEP)来进行识别。

4.3 透明桥和非透明桥区别总结

特征 透明桥(Transparent Bridge) 非透明桥(Non-Transparent Bridge, NTB)
地址空间 合并为一个统一的地址空间,主机“看到”所有下游设备 隔离的独立地址空间,每个主机只“看到”NTB 本身作为终端设备
主机可见性 对主机透明,主机直接枚举和访问下游设备 对主机不透明,主机将 NTB 视为一个终端设备
主要功能 扩展 PCIe 总线,连接更多设备 连接独立的 PCIe 域/处理器,实现域间隔离和通信
通信方式 直接路由事务 通过地址转换、共享内存窗口、Scratchpad 和 Doorbell 寄存器进行
应用场景 标准 PCIe 拓扑扩展,如 PCIe 交换机、根端口 多主机系统、高可用性/冗余系统、智能 I/O、专用数据传输

简而言之:透明桥是用于构建和扩展单一 PCIe 树的标准方式,而 NTB 则是一种高级功能,用于在需要隔离和独立管理多个 PCIe 域(通常是多个处理器或子系统)时实现它们之间的通信。


5. 非透明桥(Non-Transparent Bridge)在哪里?

5.1 透明桥模式和非透明模式

下面两幅图分别是 CPU 和 Switch 的内部组件图,从图中我们根本找不到非透明桥(Non-Transparent Bridge)在哪里。

CPU内部组件

Switch内部组件

其实图中的 Virtual PCI-PCI Bridge 既可以工作在透明桥模式,又可以工作在非透明桥模式。因此合二为一在一个 Root Port 实体上,而且一个 Root Port 只需要一个 device 充当非透明桥——毕竟两个公司之间的 contact window 只要一对就可以了。

5.2 嫡长子袭爵

一个 Root Port 一般有 16 个 Lane,可以通过 bifurcation 被均分为两个或四个 devices(Intel 给这个功能起了个时尚的新名字叫 subdivision)。不管是 bifurcation 还是 subdivision,其实就是“分家”。

“分家”时,“财富”(Lanes)可以在儿子之间均等分配,一碗水端平。但是只有一个非透明桥的角色,分配给哪个儿子?其实老祖宗早就给出了答案:世袭罔替的爵位不都是由嫡长子承袭吗?

那么问题又来了,谁是嫡长子?

下图是一个 x16 Lane 的 PCIe IO 在不同的 bifurcation 情况,这个 PCIe IO 可以工作在 x16 模式、x8 模式或 x4 模式。在 PCI Express x16 IIO 模块中,只能将一个 Root Port 配置为非透明桥端口。

  • 灰色的 Lane:表示充当一般的 PCIe 角色
  • 绿色的 Lane:表示充当非透明桥的角色(嫡长子就是从物理 Lane 的编号最大者开始向编号小的选择)

这里可千万不要连错了,否则只能 respin 我们的 layout 了,血淋淋的教训啊!

PCIe Lane分配

PCIe Physical Lanes to Ports 映射表:

配置 Lane 0-15 映射情况
NT Port x16 Lane 0-15 全部为 NT Port
PCIe Port x8 Lane 0-7 为 PCIe Port
NT Port x8 Lane 8-15 为 NT Port
PCIe Port x4 Lane 0-3 为 PCIe Port
NT Port x4 Lane 12-15 为 NT Port

在非透明桥端口为 x16 的情况下,NT 端口总是映射到从第 15 到第 0 的最高位物理通道。对于非透明桥端口为 x8 的情况,它从物理通道 15 到 8 映射;而对于非透明桥端口为 x4 的情况,则从物理通道 15 到 12 映射。


6. 大团圆

前面我们分别将 Root Complex、Switch 和 Endpoint 掰开了、揉碎了讲解了一遍。是时候让它们团聚了!

PCIe完整拓扑结构

上图是将它们合并到一起的样子(敲黑板:这张图在以后的很多章节中都会用到)。

  • 黄色的组件:是拥有 PCIe 配置空间的 device
  • PCIe Switch 下面挂载着三个 NVMe SSD

下一章我们将以这张图为中心,介绍 PCIe 总线的拓扑结构(Topology)。


这篇文章就聊到这里,敬请关注下一篇:
《PCIe 从入门到精通之四:PCIe 总线的拓扑结构》


参考文献

  1. PCI Express® Base Specification Revision 5.0 Version 1.0
  2. PCI Express® Base Specification Revision 6.4
  3. PCI Express® Base Specification Revision 7.0

0 篇笔记 写笔记

关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!