PCIe基本概念理解
- 1. 南北桥体系架构
- 2. PCIe体系结构
- 3. Root Complex(RC)
- 4. PCIe总线(Bus)
- 5. PCIe Device
- 5.1 BDF(Bus Number, Device Number, Function Number)
- 5.2 RCIE(Root Complex Integrated Endpoint)
- 5.3 Port / Bridge
- 5.4 Switch
为了方便理解,本文首先介绍了传统的南北桥体系架构,随后再介绍了PCIe的系统架构。
1. 南北桥体系架构
南桥和北桥是传统计算机架构中的两个重要组件,它们共同负责连接CPU(中央处理器)与其他主要组件,并协调它们之间的数据传输和通信。
North Bridge(北桥)
:
- 负责连接CPU和高速主存储器(RAM),以及一些其他高速设备接口,如AGP(加速图形端口)。
- 北桥是系统中速度最快的部分,它通过高速总线(如系统总线或FSB总线)与CPU通信,以确保快速的数据传输。
- 北桥还负责处理内存控制、缓存控制、总线控制等任务,直接影响系统的性能和响应速度。
南桥(Southbridge)
:
- 负责连接各种低速外围设备接口,如USB(通用串行总线)、SATA(串行ATA)、以太网、声卡、并行端口等。
- 南桥通常包含了系统中较慢的外围设备接口,并负责处理外围设备的控制和管理。
- 南桥也负责处理一些低速设备的DMA(直接内存访问)、中断控制、电源管理等功能。
现在,传统的南北桥架构逐渐被更现代化的架构所取代,如集成在CPU芯片中的内存控制器和I/O控制器,以及更快速的PCIe总线等。
2. PCIe体系结构
PCIe架构主要由五个部分组成:Root Complex、PCIe Bus、Endpoint、Port and Bridge、Switch。
其整体架构呈现为一个树状结构,如下图所示:
3. Root Complex(RC)
Root Complex是整个PCIe设备树的根节点,CPU通过它与PCIe的总线相连,并最终连接到所有的PCIe设备上。
由于Root Complex是管理外部IO设备的,所以在早期的CPU上,Root Complex其实是放在了北桥(MCU)上 ,后来随着技术的发展,现在已经都集成进了CPU内部了。
如下图所示,System Agent就是PCIe Root Complex所在的位置。
随着PCIe Lane的增加,PCIe控制器和Root Complex的数量也随之增加。因此,系统里面可以存在不只一个Root Complex。
通过设备管理器来查看如下所示:
4. PCIe总线(Bus)
PCIe上的设备通过PCIe总线互相连接。
PCIe的总线并不是传统意义上共享线路的总线(Bus),而是一个点对点的网络,如果把PCI比喻成网络中的集线器(Hub),那么PCIe对应的就是交换机了。
换句话说,当Root Complex或者PCIe上的设备之间需要通信的时候,它们会与对方直接连接或者通过交换电路进行点对点的信号传输。
5. PCIe Device
PCIe上连接的设备可以分为两种类型:
Type 0
:它表示一个PCIe上最终端的设备,比如我们常见的显卡,声卡,网卡等等。Type 1
:它表示一个PCIe Switch
或者Root Port
。和终端设备不同,它的主要作用是用来连接其他的PCIe设备,其中PCIe的Switch和网络中的交换机类似。
5.1 BDF(Bus Number, Device Number, Function Number)
PCIe上所有的设备,无论是Type 0还是Type 1,在系统启动的时候,都会被分配一个唯一的地址,它有三个部分组成:
- Bus Number:8 bits,也就是最多256条总线;
- Device Number:5 bits,也就是最多32个设备;
- Function Number:3 bits,也就是最多8个功能。
这就是我们常说的BDF,它类似于网络中的IP地址,一般写作BB:DD.F的格式。
所有连接到PCIe总线上的Type 0设备(终端设备),都可以来实现PCIe的Endpoint,用来发起或者接收PCIe的请求和消息。每个设备可以实现一个或者多个Endpoint,每个Endpoint都对应着一个特定的功能。比如:
- 一块双网口的网卡,可以每个为每个网口实现一个单独的Endpoint;
- 一块显卡,其中实现了4个Endpoint:一个显卡本身的Endpoint,一个Audio Endpoint,一个USB Endpoint,一个UCSI Endpoint;
这些我们都可以通过lspci或者Windows上的设备管理器来查看:
$ lspci -t -v
-+-[0000:c0]-+-00.0 Advanced Micro Devices, Inc. [AMD] Starship/Matisse Root Complex
# A NIC card with 2 ports:
| +-01.1-[c1]--+-00.0 Mellanox Technologies MT2892 Family [ConnectX-6 Dx]
| | \-00.1 Mellanox Technologies MT2892 Family [ConnectX-6 Dx]
+-[0000:80]-+-00.0 Advanced Micro Devices, Inc. [AMD] Starship/Matisse Root Complex
# A graphic card with 4 endpoints:
| +-01.1-[81]--+-00.0 NVIDIA Corporation TU104 [GeForce RTX 2080]
| | +-00.1 NVIDIA Corporation TU104 HD Audio Controller
| | +-00.2 NVIDIA Corporation TU104 USB 3.1 Host Controller
| | \-00.3 NVIDIA Corporation TU104 USB Type-C UCSI Controller
5.2 RCIE(Root Complex Integrated Endpoint)
说到PCIe设备,脑海里面可能第一反应就是有一个PCIe的插槽,然后把显卡或者其他设备插在里面,就像我们上面看到的这样。但是其实系统中有大量的设备是主板上集成好了的,比如,内存控制器,集成显卡,Ethernet网卡,声卡,USB控制器等等。
这些设备在连接PCIe的时候,可以直接连接到Root Complex上面。这种设备就叫做RCIE(Root Complex Integrated Endpoint)
,如果我们去查看的话,他们的Bus Number都是0,代表Root Complex。
5.3 Port / Bridge
还有一类通过插槽连接的PCIe设备,这些设备则通过PCIe Port来连接。
本质上,所有这些连接其他设备用的部件都是由桥(Bridge)来实现的,这些桥的两端连接着两个不同的PCIe Bus(Bus Number不同)。
比如,一个Root Port其实是靠两个Bridge
来实现的:
- 一个(共享的)Host Bridge(上游连接着CPU,下游连接着Bus 0);
- 一个PCI Bridge用来连接下游设备(上游连着的是Bus 0(Root Complex),下游连着的PCIe的设备(Bus Number在启动过程中自动分配)) 。
因此,我理解一个Bridge就是一个硬件,它总是连接着2条总线:
- 因为Bridge是一个设备,所以第一个总线为Bridge所挂载的总线;
- 另一方面Bridge是为了与在不同的总线之间进行数据传输和通信,尤其是不同类型的总线,因此另一个通信的总线就是目标类型总线。
- 如果是PCI-PCI,那么目标下游总线就是PCI类型;
- 如果是PCI-PCIe,那么目标下游总线就是PCIe类型;
这里面目标下游总线
都是我方便自己理解而讲的,并没有真正对应的专业名词。
5.4 Switch
PCIe Switch是一种用于扩展PCIe总线连接能力的设备。它类似于网络中的交换机,允许多个PCIe设备连接到同一个PCIe总线,从而实现对多个设备之间的通信和数据传输的管理。 个人理解是一种PCIe转PCIe的桥。
PCIe Switch内部主要有三个部分:
- 一个Upstream Port和Bridge:用于连接到上游的Port,比如,Root Port或者上游Switch的Downstream Port;
- 一组Downstream Port和Bridge:用于连接下游的设备,比如,显卡,网卡,或者下游Switch的Upstream Port;
- 一根虚拟总线:用于将上游和下游的所有端口连接起来,这样,上游的Port就可以访问下游的设备了。
参考文章:
1. PCIe(一) 基础概念与设备树
2. 老男孩读PCIe之二:PCIe拓扑结构
3. PCIe基本概念
4. 计算机组成原理 — PCIe 总线