首页 > 编程知识 正文

nvme和pcie哪个速度快(pcie2.0最好的显卡)

时间:2023-05-03 05:05:25 阅读:83628 作者:4243

硬盘是人人都熟悉的设备,从硬盘到固态硬盘,从SATA到NVMe,作为NVMe固态硬盘的前端接口,PCIe再次进入我们的视野。 作为x86系统的重要一环,PCIe标准经过了PCI、PCI-X和PCIe,经过了近30年的时间。 其中,主机发现和搜索设备的方法是一致的。 今天,我们先来谈谈PCIe设备在一个系统中是如何发现和访问的。

首先,让我们看看x86系统中的PCIe是一种什么样的体系结构。 下图是PCIe拓扑的示例,PCIe协议支持256个Bus,每个Bus最多支持32个设备,每个设备最多支持8个函数,因此BDF(bus,Device,

PCIe体系结构通常由root complex、switch和endpoint等类型的PCIe设备组成,root complex和switch通常有几个嵌入式端点。 CPU启动后,如何找到和识别这么多设备呢? 主机在PCIe设备扫描中采用了深度优先算法。 简单来说,该过程无法深入到每个可能的分支路径,每个节点只能访问一次。 这个过程一般称为PCIe设备枚举。 在列举中,主机构成读取包,获取下游设备的信息,构成写包,设定下游设备。

首先,PCI Host在主桥上扫描Bus 0上的设备。 在一个处理器系统中,Root complex中连接到主机桥的PCI总线被命名为PCI Bus 0。 系统首先忽略Bus 0上的嵌入式EP等不与PCI网桥连接的设备。 主桥发现Bridge 1后,如果将Bridge 1下的PCI Bus设为Bus 1,则系统将Bridge 1的配置空间初始化,并将桥的主总线号和次总线号寄存器分别设定为0和1 因为无法确定Bridge1之下

然后,当系统开始扫描Bus 1时,将找到Bridge 3,并注意到这是一个交换机设备。 系统将Bridge 3下的PCI Bus设为Bus 2,将网桥的主总线号和次总线号寄存器分别设为1和2,与上一步一样,暂时设为Bridge 3的次总线号

在步骤3中,如果系统继续扫描Bus 2,则会检测到Bridge 4。 继续扫描将检测安装在Bridge下的NVMe SSD设备。 Bridge 4下的PCI总线设置为总线3,桥的主总线号和次总线号寄存器分别设置为2和3。 由于在Bus 3的下方悬挂着端点设备(叶节点),因此不会设置在下方

第4步,Bus 3扫描结束后,系统返回Bus 2继续扫描,发现Bridge 5。 如果继续扫描,将检测到下面安装的网卡设备。 Bridge 5下的PCI总线设置为总线4,桥的主总线号和次总线号寄存器分别设置为2和4。 因为网卡也是端点设备,所以Bridg

e 5的Subordinate Bus Number的值可以确定为4。

第五步,除了Bridge 4和Bridge 5以外,Bus2下面没有其他设备了,因此返回到Bridge 3,Bus 4是找到的挂载在这个Bridge下的最后一个bus号,因此将Bridge 3的Subordinate Bus Number设置为4。Bridge 3的下游设备都已经扫描完毕,继续向上返回到Bridge 1,同样将Bridge 1的Subordinate Bus Number设置为4。

第六步,系统返回到Bus0继续扫描,会发现Bridge 2,系统将Bridge 2下面的PCI Bus定为Bus 5。并将Bridge 2的Primary Bus Number 和 Secondary Bus Number寄存器分别设置成0和5, Graphics card也是端点设备,因此Bridge 2 的Subordinate Bus Number的值可以确定为5。

至此,挂在PCIe总线上的所有设备都被扫描到,枚举过程结束,Host通过这一过程获得了一个完整的PCIe设备拓扑结构。

系统上电以后,host会自动完成上述的设备枚举过程。除一些专有系统外,普通系统只会在开机阶段进行进行设备的扫描,启动成功后(枚举过程结束),即使插入一个PCIe设备,系统也不会再去识别它。

在linux操作系统中,我们可以通过lspci –v -t命令来查询系统上电阶段扫描到的PCIe设备,执行结果会以一个树的形式列出系统中所有的pcie设备。如下图所示,其中黄色方框中的PCIe设备是北京忆芯科技公司(Bejing Starblaze Technology Co., LTD.)推出的STAR1000系列NVMe SSD主控芯片,图中显示的9d32是Starblaze在PCI-SIG组织的注册码,1000是设备系列号。

STAR1000设备的BDF也可以从上图中找出,其中bus是0x3C,device是0x00,function是0x0,BDF表示为3C:00.0,与之对应的上游端口是00:1d.0。

我们可以通过“lspci –xxx –s 3C:00.0”命令来列出该设备的PCIe详细信息(技术发烧友或数字控请关注该部分)。这些内容存储在PCIe配置空间,它们描述的是PCIe本身的特性。如下图所示(低位地址0x00在最左边),可以看到这是一个非易失性存储控制器,0x00起始地址是PCIe的Vendor ID和Device ID。Class code 0x010802表示这是一个NVMe存储设备。0x40是第一组capability的指针,如果你需要查看PCIe的特性,就需要从这个位置开始去查询,在每组特征的头字段都会给出下一组特性的起始地址。从0x40地址开始依次是power management,MSI中断,链路控制与状态,MSI-X中断等特性组。这儿特别列出了链路特征中的一个0x43字段,表示STAR1000设备是一个x4lane的链接,支持PCIe Gen3速率(8Gbps)。

当然也可以使用lspci –vvv –s 3C:00.0命令来查看设备特性,初学者看到下面的列表也就一目了然了。

Host在枚举设备的同时也会对设备进行配置,每个PCIe设备都会指定一段CPU memory访问空间,从上面的图中我们可以看到这个设备支持两段访问空间,一段的大小是1M byte,另一段的大小是256K byte,系统会分别指定它们的基地址。基地址配置完成以后,Host就可以通过地址来对PCIe memory空间进行访问了。

PCIe memory空间关联的是PCIe设备物理功能,对于STAR1000系列芯片而言,物理功能是NVMe,memory中存放的是NMVe的控制与状态信息,对于NMVe的控制以及工作状态的获取,都需要通过memory访问来实现。

下面以NVMe命令下发为例简单描述PCIe设备的memory访问。NVMe命令下发的基本操作是1)Host写doorbell寄存器,此时使用PCIe memory写请求。如下图所示,host发出一个memory write(MWr)请求,该请求经过switch到达要访问的NVMe SSD设备。

这个请求会被端点设备接收并执行2)NVMe读取命令操作。如下图所示,此时NVMe SSD作为请求者,发出一个memory read(MRd)请求,该请求经过Switch到达Host,Host作为完成者会返回一个完成事物包(CplD),将访问结果返回给NVMe SSD。

这样,一个NVMe的命令下发过程就完成了。同样,NVMe的其他操作比如各种队列操作,命令与完成,数据传输都是通过PCIe memory访问的方式进行的,此处不再详述。

通过上面的描述,相信能够帮助大家了解PCIe的设备枚举和memory空间访问。以后会继续与大家探讨PCIe的其他内容,比如PCIe的协议分层,链路建立,功耗管理等等。目前PCIe协议还正在不断的快速演进中,2017年发布的PCIe Gen4标准,每条Serdes支持的速率已经达到16Gbps,Gen5也在加速制定中,其速率会再翻一倍达到32Gbps。Starblaze会紧跟技术的发展趋势,提供速率更高,性能更好更稳定的NVMe SSD系列产品。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。