2024-07-08

https://r12f.com/posts/pcie-1-basics/


Overview

1. PCIe总体框图

2. Root Complex(RC)

3. PCIe总线(Bus)

4. PCIe Device

4.1. BDF(Bus Number, Device Number, Function Number)

4.2. Type 0 Device和Endpoint

4.3. RCIE(Root Complex Integrated Endpoint)

4.4. Port / Bridge

4.5. Switch

5. 小结

6. 参考资料

 Links

青藤木鸟

民国文艺少女Muqi

无痕的碎碎念

victoryang

小明

PCIe(一) —— 基础概念与设备树

 Posted on 2023-05-22  In 01 Binary Life  Views: 6154  Disqus: 0 Comments

PCIe的全称是Peripheral Component Interconnect Express,是一种用于连接外设的总线。它于2003年提出来,作为替代PCI和PCI-X的方案,现在已经成了现代CPU和其他几乎所有外设交互的标准或者基石,比如,我们马上能想到的GPU,网卡,USB控制器,声卡,网卡等等,这些都是通过PCIe总线进行连接的,然后现在非常常见的基于m.2接口的SSD,也是使用NVMe协议,通过PCIe总线进行连接的,除此以外,Thunderbolt 3 [2],USB4 [3],甚至最新的CXL互联协议 [4],都是基于PCIe的!

所以一旦开始往设备相关的开发上面走了之后,PCIe可以算是一个绕不过的坎。这几天看了一些和PCIe相关的资料,这里简单的总结一下,也希望对大家有所帮助。这篇文章主要会聚焦在硬件的部分,和操作系统本身没有什么太大的关系,无论是Windows还是Linux,底层的部分都是非常类似的,文章中也会提到调试的方法,不过会主要以Linux为主。

那我们就开始吧!

1. PCIe总体框图

首先,我们先从PCIe的基本概念开始。PCIe的架构主要由五个部分组成:Root Complex,PCIe Bus,Endpoint,Port and Bridge,Switch。其整体架构呈现一个树状结构,如下图所示:

2. Root Complex(RC)

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

由于Root Complex是管理外部IO设备的,所以在早期的CPU上,Root Complex其实是放在了北桥(MCU)上 [5],后来随着技术的发展,现在已经都集成进了CPU内部了 [8]。(注意下图的System Agent的部分,他就是PCIe Root Complex所在的位置。)

另外,虽然是根节点,但是系统里面可以存在不只一个Root Complex。随着PCIe Lane的增加,PCIe控制器和Root Complex的数量也随之增加。比如,我的台式机的CPU是i9-10980xe,上面就有4个Root Complex,而我的笔记本是i7-9750H,上面就只有一个Root Complex。我们在Windows上可以通过设备管理器来查看:

i9-11900Ki7-9750H

Linux上也类似。下图是从我的服务器的主板说明书上截出来的框图,用的CPU是EPYC 7742,可以很明显的看到PEG P0-3,对应着4个PCIe Controller和Root Complex:[6]

而我们可以通过lspci命令来查看所有的Root Complex:

1

2

3

4

5

$ 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总线(Bus)

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

PCIe的总线并不是我们传统意义上共享线路的总线(Bus),而是一个点对点的网络,我们如果把PCI比喻成网络中的集线器(Hub),那么PCIe对应的就是交换机了。换句话说,当Root Complex或者PCIe上的设备之间需要通信的时候,它们会与对方直接连接或者通过交换电路进行点对点的信号传输。[7]

PCI BusPCIe Bus

老式的PCI使用的是单端并行信号进行连接,但是由于干扰过大导致频率无法提升,所以后来就演变成PCIe之后就开始使用了高速串行信号。这也导致了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:

1

2

3

4

5

$ 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之后,我们就可以通过它查看到这个设备的详细信息了,如下:

1

2

3

4

5

6

7

8

$ 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 driverinuse: 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,但是它是可选的,需要通过设备配置启用 [1]

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上的设备管理器来查看:

1

2

3

4

5

6

7

8

9

10

11

$ 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在启动过程中自动分配)) [1]

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

+-[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 driverinuse: pcieport

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

1

2

3

4

5

6

$ 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中间的这个总线只是一个逻辑上的虚拟的总线,其实并不存在,里面真正的结构是一套用于转发的交换电路 [9]

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

5. 小结

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

好的,为了避免文章过长,我们这一篇就先到这里,后面有时间再继续总结和PCIe相关的其他知识,比如配置空间和域,消息和消息路由等等。

6. 参考资料

[1]: PCI Express Base Specification

[2]: Thunderbolt™ 3 Technology Brief

[3]: USB4™ Specification

[4]: Compute Express Link™ (CXL™) Specification

[5]: Intel® 3000 and 3010 Chipset Memory Controller Hub (MCH) datasheet

[6]: H12DSi-NT6 motherboard manual

[7]: fpga4fun - PCI Express 2 - Topology

[8]: White Paper: Introduction to Intel® Architecture

[9]: Crossbar Switch

[10]: Mindshare - An Introduction to PCI Express

同系列文章:

PCIe(四)—— 物理层

PCIe(三)—— PCIe协议栈,事务层和数据链路层

PCIe(二) —— 配置空间

PCIe(一) —— 基础概念与设备树

原创文章,转载请标明出处:Soul Orbit

本文链接地址:PCIe(一) —— 基础概念与设备树

# pcie # hardware # bus

 在Hexo中使用MathJax

PCIe(二) —— 配置空间 

© 2011 – 2024  r12f

Powered by Hexo & NexT.Pisces

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容