NVMe开发——PCIe基础

1. PCI简介

PCI(Peripheral Component Interconnect),外设组件互连。PCI是一种并口总线标准,对比其之前的其他总线,PCI因其速度快、支持即插即用,中断共享等特性,占领计算机总线标准近20年。随着CPU以及外设的速度要求越来越高,PCI总线愈发显得有心无力。PCI因为是并口,在高速信号传输中,因为信号质量问题,以及信号同步问题,并口解决这些问题的成本高,难以为继。在这个时候,PCI的替代者PCIe出现了。

2. PCIe简介

PCIe(Peripheral Component Interconnect Express)是一种高速串行计算机扩展总线标准,因为其是串行的,并且数据线都是差分线组成,这样就可以解决在高速下的信息质量和同步问题。PCIe最高由Intel在2001年提出,后交由PCI-SIG组织维护,2002年正式发布,命名为PCI Express,缩写PCI-E或PCIe。2003年发布了PCIe 1.0版本,至今已经发展到PCIe 6.0版。

PCI Express

版本

推出

编码

原始

传输率

带宽(每个方向)

×1

×2

×4

×8

×16

1.0

2003

8b/10b

2.5 GT/s

250 MB/s

0.50 GB/s

1.0 GB/s

2.0 GB/s

4.0 GB/s

2.0

2007

8b/10b

5.0 GT/s

500 MB/s

1.0 GB/s

2.0 GB/s

4.0 GB/s

8.0 GB/s

3.0

2010

128b/130b

8.0 GT/s

984.6 MB/s

1.97 GB/s

3.94 GB/s

7.88 GB/s

15.8 GB/s

4.0

2017

128b/130b

16.0 GT/s

1969 MB/s

3.94 GB/s

7.88 GB/s

15.75 GB/s

31.5 GB/s

5.0

2019

NRZ 128b/130b

32.0 GT/s

3938 MB/s

7.88 GB/s

15.75 GB/s

31.51 GB/s

63.0 GB/s

6.0

2022

PAM4 & FEC FLIT 242b/256b

64.0 GT/s

7877 MB/s

15.75 GB/s

31.51 GB/s

63.02 GB/s

126.03 GB/s

(以PCIe 2.0为例,每秒5GT(Gigatransfer)原始数据传输率,编码方式为8b/10b(每10个比特只有8个有效数据),即有效带宽为4Gb/s = 500MByte/s)

PCIe 1.0, PCIe 2.0,PCIe 3.0, PCIe 4.0,PCIe 5.0,PCIe 6.0也被称为PCIe Gen1,PCIe Gen2,PCIe Gen3,PCIe Gen4,PCIe Gen5,PCIe Gen6。

过高的频率导致过高的温度,目前基于MOS的半导体的限制频率无法超过10GHz。PCIe 5.0的传输频率已经到极限,再想提升传输速度就得想其他办法。PCIe 5.0中有定义x32,但是并没有推广使用,猜测x32太大了,推广实现都不容易。传统的信号传输,都是传递0和1,这也就是传统的NRZ编码,这种编码简单可靠。PCIe 6.0改进了编码方法,从传递的NRA编码转换为了PAM4编码,相当于从2进制转换为4进制,对信号质量要求更高。未来可能更进一步8进制,16进制。

3. PCIe接口形式

PCIe是总线标准,总线上可以接入不同的从设备。针对不同的应用场景,如要求轻便的笔记本对PCIe接口要求轻便,要求性能的服务器则要求有良好的散热以支持性能。所以,PCIe制作了不同的接口形式规范。

PCIe接口为了适配不同的设备,其定义了多种外形规格的接口,如下图是标准的PCIe插槽,支持不同的通道。为了进一步提升速度,PCIe规范每一个版本都配有几种不同规格接口,x1, x4, x8, x16,其对应不同的通道(Lane)。

传输通道数

脚Pin总数

主接口区Pin数

总长 度

主接口区长度

x1

36

14

25 mm

7.65 mm

x4

64

42

39 mm

21.65 mm

x8

98

76

56 mm

38.65 mm

x16

164

142

89 mm

71.65 mm

对就的外形如:

4. PCIe终端设备

PCIe是一套总线标准,并不限定接入PCIe接口的设备类型。PCIe就相当于高速公路,只要遵守高速公路的要求,大卡车、小汽车都可以通行。所以PCIe总线上可以接入显卡、网卡、NVMe SSD等终端设备,也可以接入一些转换器设备等。接入PCIe接口的设备,可以被称为PCIe终端设备或转换器设备。下图是一台计算机的基本硬件构成

下图为x16的显卡和x1的网卡,都可以直接接入PCIe插槽中。

下图为Intel早期推出的PCIe插槽的NVMe SSD。

这种PCIe插槽式的NVMe SSD,非常笨重,配有大量的散热片。在NVMe SSD的持续发展下,消费级的已经不需要配备额外的散热片。此时急需要更小巧的PCIe接口,M.2和U.2接口应运而生。M.2接口非常小巧,非常适合电脑,尤其是笔记本型电脑。M.2因为外形限制,最多只支持4通道。

U.2接口完全兼容SATA接口,所以其和普通的SATA SSD尺寸是相同的,相比M.2接口,其设计空间更大,可以承载更多存储介质,以及更多的散热空间。所以U.2的NVMe SSD更多用于企业级市场。

5. PCIe总线拓扑结构

PCIe系统中,1个Host Device下可以接入多级Slave Device,形成一个拓扑结构。

根复杂设备(Root Complex)通常被称为PCIe主机(PCIe Host)或PCIe控制器(PCIe Controller)。它是PCIe架构中的关键组件,充当了主机系统和PCIe总线之间的桥梁。

作为PCIe主机,根复杂设备起着重要的角色。它与处理器、系统内存、其他I/O总线(如PCI、USB等)以及外部设备连接,负责管理和协调PCIe总线上的所有通信。根复杂设备会初始化并分配总线号给连接到PCIe总线上的设备,并通过配置请求和响应来实现设备的配置和初始化。它还负责路由数据传输、处理错误检测和纠正、提供电源管理等功能。

因此,Root Complex可以看作是PCIe系统的主控制器,负责整个PCIe架构的运行和管理。它是支持PCIe协议的主机系统必需的组成部分。

BDF(Bus/Device/Function),如0f:00.0就可以标识唯一的功能设备,一个真实的设备可以上报多个Function。PCIe最多支持256个Bus,每个Bus最多32个Device,每个Device最多8个Fucntion。

一个物理设备在系统中可以表现为多个Function,如一个PCIe Device在系统中表现为网卡的同时,还表现为一个SSD存储设备。这样就是2个Function。

PCIe Bus: 配置软件可以分配最多256个总线号。初始总线号Bus 0通常由硬件分配给根复杂设备(Root Complex)。Bus 0包含一个虚拟PCI总线,其中集成了端点和虚拟PCI到PCI桥接器(P2P),这些桥接器的设备号和功能号是硬编码的。每个P2P桥接器创建一个新的总线,可以连接额外的PCIe设备。每个总线必须被分配一个唯一的总线号。配置软件通过从Bus 0,Device 0,Function 0开始搜索桥接器来开始分配总线号的过程。当找到一个桥接器时,软件会为新的总线分配一个唯一的、大于所在桥接器总线号的总线号。一旦新的总线被分配了一个总线号,软件就开始在新的总线上寻找桥接器,然后继续在当前总线上扫描更多的桥接器。这被称为“深度优先搜索”,详细描述在“枚举 - 发现拓扑结构”中的第104页。

PCIe Device: PCIe允许在单个PCI总线上连接最多32个设备,但是由于PCIe的点对点特性,只能直接连接一个设备到一个PCIe链路上,并且该设备始终成为设备0。根复杂设备和交换机具有允许多个设备“连接”到总线上的虚拟PCI总线。每个设备必须实现Function 0,并可以包含多达八个功能的集合。当实现两个或更多的功能时,该设备被称为多功能设备。

PCIe Function: 正如前面讨论的,每个设备都设计了功能。这些功能可能包括硬盘接口、显示控制器、以太网控制器、USB控制器等。具有多个功能的设备不需要按顺序实现。例如,一个设备可以实现功能0、2和7。因此,当配置软件检测到多功能设备时,必须检查每个可能的功能,以确定哪些功能是存在的。每个功能还有自己的配置地址空间,用于设置与该功能相关的资源。

6. PCIe与NVMe

PCIe作为计算机总线标准,用于连接计算机内部的各种设备,包括图形卡、网卡和存储设备等。NVMe(Non-Volatile Memory Express)则是一种基于PCIe总线的高性能存储接口协议。PCIE提供了高带宽和低延迟的数据传输通道,可以满足现代存储设备的需求。NVMe利用PCIe的高速通道,提供了更高的性能和更低的延迟,特别适用于固态硬盘(SSD)等快速非易失性存储器设备。

PCIe的串行总线接口,速度非常快。NVMe是一种串行总线的调整存储设备。所以两者非常契合,彼此成就。PCIe是高速公路,NVMe是高速汽车。CPU与NVMe SSD经过PCIe总线来传输数据。PCIe是路,只要求路上跑的车满足PCIe的要求即可,不管车里装的是什么内容。无论是网络数据、GPU数据还是NVMe数据,都可以。到了CPU那里,驱动从PCIe那里取得数据,再解析出来真实的数据内容供CPU操作系统使用。

PCIe P2P通信是指在PCIe总线上直接从一个设备传输数据到另一个设备,而不需要通过系统内存。这种通信方式可以提高数据传输效率,并减轻CPU和系统内存的负担。 以下是PCIe P2P通信的过程: 1. 配置Endpoint和Root Complex(RC):在PCIe P2P通信之前,需要确保每个Endpoint和RC都已经进行了配置。Endpoint是指PCIe上的终端设备,RC是指PCIe总线上的根复杂器。 2. 分配DMA地址空间:每个设备需要分配一块DMA(Direct Memory Access)地址空间,用于直接访问设备的物理内存,而不需要通过系统内存。 3. 配置DMA引擎:每个设备需要配置自己的DMA引擎,以便能够正确地处理DMA传输请求。DMA引擎需要知道数据传输的起始地址、目标地址、传输大小和传输方向等信息。 4. 发起DMA传输:在PCIe P2P通信中,数据传输由源设备发起。源设备将数据写入到自己的DMA地址空间中,并发起DMA传输请求。 5. DMA传输:DMA引擎接收到DMA传输请求后,从源设备的DMA地址空间中读取数据,并将数据写入到目标设备的DMA地址空间中。 6. 完成DMA传输:DMA引擎在完成DMA传输后,向源设备发送DMA完成中断,通知源设备数据已经成功传输到目标设备。 以上是PCIe P2P通信的基本过程,需要注意的是,数据传输过程中需要保证数据的完整性和安全性,因此需要进行相应的校验和加密操作,以确保数据传输的可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值