0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

PCIe是什么样的一个体系架构?

Q4MP_gh_c472c21 来源:人人都是极客 作者:人人都是极客 2021-01-12 16:50 次阅读

硬盘是大家都很熟悉的设备,一路走来,从HDD到SSD,从SATA到NVMe,作为NVMe SSD的前端接口,PCIe再次进入我们的视野。作为x86体系关键的一环,PCIe标准历经PCI,PCI-X和PCIe,走过近30年时光。其中Host发现与查找设备的方式却一脉沿袭,今天我们先来聊一聊PCIe设备在一个系统中是如何发现与访问的。

首先我们来看一下在x86系统中,PCIe是什么样的一个体系架构。下图是一个PCIe的拓扑结构示例,PCIe协议支持256个Bus, 每条Bus最多支持32个Device,每个Device最多支持8个Function,所以由BDF(Bus,device,function)构成了每个PCIe设备节点的身份证号。

04641218-528d-11eb-8b86-12bb97331649.jpg

PCIe体系架构一般由root complex,switch,endpoint等类型的PCIe设备组成,在root complex和switch中通常会有一些embeded endpoint(这种设备对外不出PCIe接口)。这么多的设备,CPU启动后要怎么去找到并认出它们呢? Host对PCIe设备扫描是采用了深度优先算法,其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。我们一般称这个过程为PCIe设备枚举。枚举过程中host通过配置读事物包来获取下游设备的信息,通过配置写事物包对下游设备进行设置。 第一步,PCI Host主桥扫描Bus 0上的设备(在一个处理器系统中,一般将Root complex中与Host Bridge相连接的PCI总线命名为PCI Bus 0),系统首先会忽略Bus 0上的embedded EP等不会挂接PCI桥的设备,主桥发现Bridge 1后,将Bridge1 下面的PCI Bus定为 Bus 1,系统将初始化Bridge 1的配置空间,并将该桥的Primary Bus Number 和 Secondary Bus Number寄存器分别设置成0和1,以表明Bridge1 的上游总线是0,下游总线是1,由于还无法确定Bridge1下挂载设备的具体情况,系统先暂时将Subordinate Bus Number设为0xFF。

0484df70-528d-11eb-8b86-12bb97331649.jpg

第二步,系统开始扫描Bus 1,将会发现Bridge 3,并发现这是一个switch设备。系统将Bridge 3下面的PCI Bus定为Bus 2,并将该桥的Primary Bus Number 和 Secondary Bus Number寄存器分别设置成1和2,和上一步一样暂时把Bridge 3 的Subordinate Bus Number设为0xFF。

04b89c52-528d-11eb-8b86-12bb97331649.jpg

第三步,系统继续扫描Bus 2,将会发现Bridge 4。继续扫描,系统会发现Bridge下面挂载的NVMe SSD设备,系统将Bridge 4下面的PCI Bus定为Bus 3,并将该桥的Primary Bus Number 和 Secondary Bus Number寄存器分别设置成2和3,因为Bus3下面挂的是端点设备(叶子节点),下面不会再有下游总线了,因此Bridge 4的Subordinate Bus Number的值可以确定为3。

04e2c1bc-528d-11eb-8b86-12bb97331649.jpg

第四步,完成Bus 3的扫描后,系统返回到Bus 2继续扫描,会发现Bridge 5。继续扫描,系统会发现下面挂载的NIC设备,系统将Bridge 5下面的PCI Bus设置为Bus 4,并将该桥的Primary Bus Number 和 Secondary Bus Number寄存器分别设置成2和4,因为NIC同样是端点设备,Bridge 5的Subordinate Bus Number的值可以确定为4。

05067904-528d-11eb-8b86-12bb97331649.jpg

第五步,除了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。

0546e20a-528d-11eb-8b86-12bb97331649.jpg

第六步,系统返回到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设备拓扑结构。

05942f9c-528d-11eb-8b86-12bb97331649.jpg

系统上电以后,host会自动完成上述的设备枚举过程。除一些专有系统外,普通系统只会在开机阶段进行进行设备的扫描,启动成功后(枚举过程结束),即使插入一个PCIe设备,系统也不会再去识别它。 在linux操作系统中,我们可以通过lspci –v -t命令来查询系统上电阶段扫描到的PCIe设备,执行结果会以一个树的形式列出系统中所有的pcie设备。如下图所示,其中黄色方框中的PCIe设备是北京忆芯科技公司(Bejing Starblaze Technology Co., LTD.)推出的STAR1000系列NVMe SSD主控芯片,图中显示的9d32是Starblaze在PCI-SIG组织的注册码,1000是设备系列号。

05d2894a-528d-11eb-8b86-12bb97331649.png

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)。

05f95cc8-528d-11eb-8b86-12bb97331649.png

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

064affd8-528d-11eb-8b86-12bb97331649.jpg

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设备。

06816942-528d-11eb-8b86-12bb97331649.jpg

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

06a85944-528d-11eb-8b86-12bb97331649.jpg

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

原文标题:原来PCIe这么简单,一定要看!

文章出处:【微信公众号:嵌入式ARM】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 硬盘
    +关注

    关注

    3

    文章

    1308

    浏览量

    57284
  • PCIe
    +关注

    关注

    15

    文章

    1235

    浏览量

    82590

原文标题:原来PCIe这么简单,一定要看!

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    想做一个采集设备,请问选用什么样的ADC和DAC合适?

    想做一个采集设备,采集信号为4-20mA,1到5V DC ,0-10VDC ,三种信号,要求精度不低于0.1%,刷新率为 25ms。在做一个输出 4-20mA,1到5V DC ,0-10VDC ,请问选用什么样的ADC 和DA
    发表于 12-17 08:16

    什么样的电阻柜用于风电光伏项目

    什么样的电阻柜用于风电光伏项目?在风电光伏项目中,电阻柜作为重要组成部分,直接影响着整个系统的效率和稳定性。那么,我们应该选择什么样的电阻柜呢? 高效的电阻柜应具备较高的功率因数。在风电光伏项目
    的头像 发表于 11-18 09:40 149次阅读

    PCIE数据链路层架构解析

    PCIe的数据链路层在事务层和物理层之间,用来负责链路管理,其主要功能是保证来自事务层的TLP在PCIe链路中的正确传输,为此数据链路层定义了系列的DLLP报文,数据链路层使用了容错和重传机制保证
    的头像 发表于 11-05 17:06 328次阅读
    <b class='flag-5'>PCIE</b>数据链路层<b class='flag-5'>架构</b>解析

    想设计10Hz~10MHz的峰值检波电路,请问这个架构可以达到我频率范围的要求吗?

    我想设计10Hz~10MHz的峰值检波电路,请问这个架构可以达到我频率范围的要求吗?如果可以,器件的选型应该是怎样的,如果不可以,什么样
    发表于 09-19 06:44

    代码整洁之道-大师眼中的整洁代码是什么样

    几个月前写了篇文章“如何写出难以维护的代码”,从中能大概了解到不好维护的代码是什么样,有哪些坏味道,那肯定有人会反问,难以维护的代码见的太多了,也知道长什么样,但是对于好维护的代码是什么样
    的头像 发表于 09-09 16:30 331次阅读
    代码整洁之道-大师眼中的整洁代码是<b class='flag-5'>什么样</b>

    发干货,篇文章教会你如何利用PCIe扩展SSD硬盘存储

    在当今高性能计算机体系架构中,PCIe(PeripheralComponentInterconnectExpress)通道扮演着数据高速传输的核心角色,以其卓越的传输速度、极低的延迟特性以及强大的可
    的头像 发表于 08-02 16:02 730次阅读
    来<b class='flag-5'>一</b>发干货,<b class='flag-5'>一</b>篇文章教会你如何利用<b class='flag-5'>PCIe</b>扩展SSD硬盘存储

    pcie4.0插在3.0的主板上会怎么

    到现在的 PCIe 4.0。随着新PCIe 4.0 插槽的推出,许多用户可能会面临问题:如果将
    的头像 发表于 07-10 10:16 3342次阅读

    pcie4.0和pcie3.0接口兼容吗

    PCIe 4.0和PCIe 3.0接口在多个方面实现了兼容性,PCIe 4.0和PCIe 3.0接口兼容性问题是
    的头像 发表于 07-10 10:12 7014次阅读

    STM32H743ZIT6想要实现千兆网口,需要外挂什么样的PHY芯片?

    各位大佬,我想咨询问题,关于STM32H743ZIT6想要实现千兆网口,需要外挂什么样的PHY芯片,谢谢
    发表于 05-31 07:59

    FPGA的PCIE接口应用需要注意哪些问题

    FPGA上的PCIe接口应用是复杂的任务,需要考虑多个方面的问题以确保系统的稳定性和性能。以下是在FPGA的PCIe接口应用中需要注意的关键问题: 硬件资源和内部
    发表于 05-27 16:17

    FPGA能实现什么样的算法?

    FPGA功能如此强大,请问用FPGA能实现或者比较适合实现什么样的算法?
    发表于 05-26 20:18

    什么样的PLC可以直接驱动接触器?什么样的PLC不可以直接驱动?

    什么样的PLC可以直接驱动接触器?什么样的PLC不可以直接驱动? PLC(可编程逻辑控制器)是种用于自动化控制系统的电子设备,用于监控和控制多种工业过程。其中
    的头像 发表于 02-18 14:11 1282次阅读

    【RISC-V开放架构设计之道|阅读体验】本别出心裁的RISC-V架构之书(第章)

    的内容,虽然简单的两页指令汇总表格,但是其严谨的内容告诉我们,这是用来介绍RISC-V体系架构相关的专业书籍。 翻开书中的第章,为
    发表于 01-24 19:06

    【RISC-V开放架构设计之道|阅读体验】学习处理器体系架构本好书

    感谢电子发烧友论坛和电子工业出版社提供的试读机会。 《RISC-V开放架构设计之道》由RISC-V架构的作者、著名的计算机体系架构专家David Patterson亲自主笔撰写。Dav
    发表于 01-23 20:08

    ADIS16375的陀螺仪输出角度是什么样的角度?

    想知道ADIS16375这款IMU的输出角度是什么样的角度?是不是姿态角?其参考坐标系是什么?输出角的实时精度是多少?ADIS16365、ADIS16334、ADIS16445、ADIS16485这四款IMU能够输出角度吗?若果能,分别是
    发表于 12-29 06:17