PCIe简介-部件简介

1. PCIe总体框图

PCIe的架构主要由五个部分组成:Root Complex,PCIe Bus,Endpoint,Port and Bridge,Switch。其整体架构呈现一个树状结构,如下图所示:

2. Root Complex(RC) 

Root Complex是整个PCIe设备树的根节点,CPU通过它与PCIe的总线相连,并最终连接到所有的PCIe设备。

Root Complex是用来管理外部I/O设备的,所以最初的Root Complex是放在北桥上(MCU)的,如今已经全部集成进了CPU。

北桥的概念:早期处理器集成度较低,必须由主板芯片组承担大量的功能,因此芯片组被分为南桥芯片组和北桥芯片组。北桥负责CPU与内存的数据交互啊、图形处理、CPU与PCIe数据交换,南桥负责系统的输入输出功能。

 下图的System Agent的部分,他就是PCIe Root Complex所在的位置。

 随着PCIe Lane的增加,系统中可能存在着不止一个Root Complex。下图为我的笔记本CPU i9-12900H中Root Complex的数量。在Windows可以通过设备管理器查看

对于台式机可能存在多个Root Complex

对于服务器来说,存在的Root Complex的数量更多。可以很明显的看到PEG P0-3,对应着4个PCIe Controller和Root Complex。

在Linux上,可以通过lspci命令来查看所有的Root Complex。

$ lspci -t -v
-+-[0000:c0]-+-00.0  Advanced Micro Devices, Inc. [AMD] Starship/Matisse Root Complex
 +-[0000:80]-+-00.0  Advanced Micro Devices, Inc. [AMD] Starship/Matisse Root Complex
 +-[0000:40]-+-00.0  Advanced Micro Devices, Inc. [AMD] Starship/Matisse Root Complex
 \-[0000:00]-+-00.0  Advanced Micro Devices, Inc. [AMD] Starship/Matisse Root Complex

3. PCIe总线

PCIe上的设备通过PCIe总线互相连接。虽然PCIe是从PCI发展而来的,并且甚至有很多地方是兼容的,但是它与老式的PCI和PCI-X有两点特别重要的不同:

  1. PCIe的总线并不是我们传统意义上共享线路的总线(Bus),而是一个点对点的网络,我们如果把PCI比喻成网络中的集线器(Hub),那么PCIe对应的就是交换机了。换句话说,当Root Complex或者PCIe上的设备之间需要通信的时候,它们会与对方直接连接或者通过交换电路进行点对点的信号传输。
  2. PCI使用的是单端并行信号进行连接,由于线与线之间的干扰导致频率无法提升。所以后来就演变成PCIe之后就开始使用了高速串行信号。这也导致了PCI设备和PCIe设备无法兼容,只能通过PCI-PCIe桥接器来进行连接。

4. PCIe Device

PCIe上连接的设备可以分为两种类型:

  • Type 0:它表示一个PCIe上最终端的设备,比如我们常见的显卡,声卡,网卡等等。
  • Type 1:它表示一个PCIe Switch或者Root Port。和终端设备不同,它的主要作用是用来连接其他的PCIe设备,其中PCIe的Switch和网络中的交换机类似。

4.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的格式。在Linux上,我们可以通过lspci命令来查看每个设备的BDF,比如,下面这个FCH SMBus Controller就是00:14.0

$ lspci -t -v
 # [Domain:Bus]
 \-[0000:00]-+-00.0  Advanced Micro Devices, Inc. [AMD] Starship/Matisse Root Complex
         # Device.Function
             +-14.0  Advanced Micro Devices, Inc. [AMD] FCH SMBus Controller

在我们知道了任何一个设备的BDF之后,我们就可以通过它查看到这个设备的详细信息了,如下:

$ lspci -s 00:14.0 -vv 
00:14.0 SMBus: Advanced Micro Devices, Inc. [AMD] FCH SMBus Controller (rev 61)
        Subsystem: Super Micro Computer Inc H12SSL-i
        Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
        Status: Cap- 66MHz+ UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
        IOMMU group: 39
        Kernel driver in use: piix4_smbus
        Kernel modules: i2c_piix4, sp5100_tco

 另外,由于默认BDF的方式最多只支持8个Function,可能不够用,所以PCIe还支持另一种解析方式,叫做ARI(Alternative Routing-ID Interpretation),它将Device Number和Function Number合并为一个8bit的字段,只用于表示Function,所以最多可以支持256个Function,但是它是可选的,需要通过设备配置启用 。

4.2. Type 0 Device和Endpoint

所有连接到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

4.3. RCIE(Root Complex Integrated Endpoint)

说到PCIe设备,脑海里面可能第一反应就是有一个PCIe的插槽,然后把显卡或者其他设备插在里面,就像我们上面看到的这样。但是其实系统中有大量的设备是主板上集成好了的,比如,内存控制器,集成显卡,Ethernet网卡,声卡,USB控制器等等。这些设备在连接PCIe的时候,可以直接连接到Root Complex上面。这种设备就叫做RCIE(Root Complex Integrated Endpoint),如果我们去查看的话,他们的Bus Number都是0,代表Root Complex。如下图。

4.4. Port / Bridge

那么其他的需要通过插槽连接的设备呢?这些设备就需要通过PCIe Port来连接了。

在Root Complex上,有很多的Root Port,这些Port每一个都可以连接一个PCIe设备(Type 0或者Type 1)。

本质上,所有这些连接其他设备用的部件都是由桥(Bridge)来实现的,这些桥的两端连接着两个不同的PCIe Bus(Bus Number不同)。比如,一个Root Port其实是靠两个Bridge来实现的:一个(共享的)Host Bridge(上游连接着CPU,下游连接着Bus 0)和一个PCI Bridge用来连接下游设备(上游连着的是Bus 0(Root Complex),下游连着的PCIe的设备(Bus Number在启动过程中自动分配))。

PCIe桥的作用:

• 将PCIe总线转换为PCI总线,以连接PCI设备。在一个没有提供PCI总线接口的处理器中,需要使用这类桥片连接PCI总线的外设。许多PowerPC处理器在提供PCIe总线的同时,也提供了PCI总线,因此PCIe-to-PCI桥片对基于PowerPC处理器系统并不是必须的。

• 将PCI总线转换为PCIe总线(这也被称为Reverse Bridge),连接PCIe设备。一些低端的处理器并没有提供PCIe总线,此时需要使用PCIe桥将PCI总线转换为PCIe总线,才能与其他PCIe设备互连。

PCIe桥的一端与PCIe总线相连,而另一端可以与一条或者多条PCI总线连接。其中可以连接多个PCI总线的PCIe桥也被称为多端口PCIe桥。PCIe总线规范提供了两种多端口PCIe桥片的扩展方法。多端口PCIe桥片指具有一个上游端口和多个下游端口的桥片。其中上游端口连接PCIe链路,而下游端口推出PCI总线,连接PCI设备

我们通过lspci命令可以看到这些桥的存在(注意设备详情中的Kernel driver in use: pcieport):

 +-[0000:80]-+-00.0  Advanced Micro Devices, Inc. [AMD] Starship/Matisse Root Complex
             # This is the Host bridge that connects to the root port and CPU:
 |           +-01.0  Advanced Micro Devices, Inc. [AMD] Starship/Matisse PCIe Dummy Host Bridge
             # This is the PCI bridge that connects to the root port and device with a new bus - 0x81:
 |           +-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

# Host bridge
$ sudo lspci -s 80:01.0 -v
80:01.0 Host bridge: Advanced Micro Devices, Inc. [AMD] Starship/Matisse PCIe Dummy Host Bridge
        Flags: fast devsel, IOMMU group 13

# PCI bridge
$ sudo lspci -s 80:01.1 -v
80:01.1 PCI bridge: Advanced Micro Devices, Inc. [AMD] Starship/Matisse GPP Bridge (prog-if 00 [Normal decode])
        Flags: bus master, fast devsel, latency 0, IRQ 35, IOMMU group 13
        Bus: primary=80, secondary=81, subordinate=81, sec-latency=0
        I/O behind bridge: 0000b000-0000bfff [size=4K]
        Memory behind bridge: f0000000-f10fffff [size=17M]
        Prefetchable memory behind bridge: 0000020030000000-00000200420fffff [size=289M]
        ....
        Kernel driver in use: pcieport

 注意:是否使用PCIe Bridge和是否通过插槽连接不能直接划等号,这取决于你系统的硬件实现,比如,从上面RCIE的截图中我们可以看到USB Controller作为RCIE存在,而下面EPYC的CPU则不同,USB控制器是通过Root Port连接的,但是它在主板上并没有插槽。

$ lspci -t -v
 +-[0000:40]-+-00.0  Advanced Micro Devices, Inc. [AMD] Starship/Matisse Root Complex
             +-03.0  Advanced Micro Devices, Inc. [AMD] Starship/Matisse PCIe Dummy Host Bridge
 |           +-03.3-[42]----00.0  ASMedia Technology Inc. ASM1042A USB 3.0 Host Controller
             # ^====== 40:03.3 here is a Bridge. And USB controller is connected
             #         to this Bridge with a new Bus Number 42.

4.5. Switch

如果我们需要连接不止一个设备怎么办呢?这时候就需要用到PCIe Switch了。

PCIe Switch内部主要有三个部分:

  • 一个Upstream Port和Bridge:用于连接到上游的Port,比如,Root Port或者上游Switch的Downstream Port
  • 一组Downstream Port和Bridge:用于连接下游的设备,比如,显卡,网卡,或者下游Switch的Upstream Port
  • 一根虚拟总线:用于将上游和下游的所有端口连接起来,这样,上游的Port就可以访问下游的设备了

另外,这里再说明一次 —— 由于PCIe的信号传输是点对点的,所以Switch中间的这个总线只是一个逻辑上的虚拟的总线,其实并不存在,里面真正的结构是一套用于转发的交换电路。

最后,看到这里也许你会突然想到Root Complex是不是也可以看成是一个Switch呢?我觉得这两个概念最好还是分开,虽然从很多框图上看着确实很像,只不过Root Complex没有Upstream Port,连接上游的Host Bridge是连接到CPU上,不过Root Complex内部的功能要远比Switch复杂的多,里面不仅仅是简单的包转发,比如,后面会说到的PCIe请求的生成和转换等等。

5. 小结

好了,到这里我们已经将PCIe设备树中的主要部件都介绍完毕了。如果我们把所有这些部件连接在一起,那么其整体的结构就是这样的。

6、引自

本篇文章引自Soul Orbit

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值