必看: 原来PCIe技术原理这么简单!

2023-05-16

640?wx_fmt=jpeg

640?wx_fmt=gif&wxfrom=5&wx_lazy=1

硬盘是大家都很熟悉的设备,一路走来,从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设备节点的身份证号。

640?wx_fmt=png

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。

640?wx_fmt=png

第二步,系统开始扫描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。

640?wx_fmt=png

第三步,系统继续扫描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。

640?wx_fmt=png

第四步,完成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。

640?wx_fmt=png


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


640?wx_fmt=png


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


640?wx_fmt=png

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


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

640?wx_fmt=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)。


640?wx_fmt=png


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


640?wx_fmt=png


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


640?wx_fmt=png

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


640?wx_fmt=png

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


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


来源:SSDFans公众号


推荐阅读:

  • 公司转型微服务,真的有必要吗?


温馨提示:

请识别二维码关注公众号,点击原文链接获取更多SSD技术资料总结

640?wx_fmt=jpeg

640?wx_fmt=gif&wxfrom=5&wx_lazy=1

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

必看: 原来PCIe技术原理这么简单! 的相关文章

  • pcie标准_PCIe 5.0 标准

    PCIe规范由PCISIG组织进行发布的 xff0c PCISIG其英文全称为 xff1a Peripheral Component Interconnect Special Interest Group 外围部件互连专业组 xff0c 简
  • 7.PCIE配置空间读写软件

    软件 7 PCIE配置空间读写 软件 7 PCIE配置空间读写 软件 7 PCIE配置空间读写 软件读写配置空间 驱动层接口原理分析 驱动层代码接口驱动层接口与原理 相关参考基础知识raw pci ops 得初始化raw pci ext o
  • 深入PCI与PCIe

    转载于老狼 xff1a https zhuanlan zhihu com p 26172972 https zhuanlan zhihu com p 26244141 PCI总线和设备树是X86硬件体系内很重要的组成部分 xff0c 几乎所
  • PCIe扫盲系列博文连载目录篇

    PCIe扫盲系列博文连载目录篇 xff08 第一阶段 xff09 Felix 电子技术应用 AET 中国科技核心期刊 最丰富的电子设计资源平台 chinaaet com 1 前言篇 xff1a PCIe扫盲 PCIe简介 xff1a htt
  • spi,iic,uart,pcie区别

    一 spi SPI 是英语Serial Peripheral interface的缩写 xff0c 顾名思义就是串行外围设备接口 xff0c 是同步传输协议 xff0c 特征是 xff1a 设备有主机 xff08 master xff09
  • PCI-E

    PCI E 1 简介 PCI E PCI Express的所写 是最新的总线和接口标准 它原来的名称为 3GIO 是由英特尔提出的 很明显英特尔的意思是它代表着下一代I O接口标准 交由PCI SIG PCI特殊兴趣组织 认证发布后才改名为
  • Linux PCIe驱动框架分析(第三章)

    目录 项目背景 1 概述 2 流程分析 2 1 Device Tree 2 2 probe流程 2 3 中断处理 2 4 总结 项目背景 Kernel版本 4 14 ARM64处理器 使用工具 Source Insight 3 5 Visi
  • #PCIE# PCIE基础知识篇(3)

    写在前面 本文章转载自老狼知乎 感谢分享 随着AMD新一代CPU的发布 PCIe 4 0 Gen4 也进入了人们的视线 然而Intel随后宣传PCIe 4 0对消费市场用处不大 AMD则反讽Intel吃不到葡萄说葡萄酸 正在吃瓜群众搬板凳看
  • 【PCIe】5: PCIe DBI (Date Bus Interface)

    目录 1 DBI 2 CDM 3 ELBI 3 1 EP 的排布 3 2 RC对应空间排布 1 DBI DBI Data Bus Interface You can use this interface to locally access
  • 大带宽、高速率接口对比---USB、PCIE、SATA、HDMI和以太网等接口

    一 PCIE接口 二 USB接口 三 SATA接口 SATA 编码方式 原始频宽 传输速率 有效速率 排线最长长度 SATA1 0 SATA2 0 8bit 10bit 3Gb s 300MB s 275MB s 1M SATA3 0 8b
  • PCIe热插拔:通知试热插拔&暴力热插拔

    PCIE热插拔 某些特殊的应用场合可能要求PCIe设备能够以高可靠性持续不间断运行 为此 PCIe总线采用热插拔 Hot Plug 和热切换 Hot Swap 技术 来实现不关闭系统电源的情况下更换PCIe卡设备 热切换和热插拔的主要区别是
  • [PCIe]LTSSM与电源管理

    1 LTSSM LTSSM全称是Link Training and Status State Machine 有以下11个状态 Detect Polling Configuration Recovery L0 L0s L1 L2 Hot R
  • PCIe专题学习——5.0(总线电源管理)

    之前我们讲了对PCIe的一些基础概念作了一个宏观的介绍 了解了PCIe是一种封装分层协议 packet based layered protocol 主要包括事务层 Transaction layer 数据链路层 Data link lay
  • PCIe专题学习——4.0(物理层结构解析)

    之前我们讲了对PCIe的一些基础概念作了一个宏观的介绍 了解了PCIe是一种封装分层协议 packet based layered protocol 主要包括事务层 Transaction layer 数据链路层 Data link lay
  • SATA M.2 NGFF PCIE AHCI NVME SSD固态硬盘的接口、总线和协议区分

    总线 协议 说接口之前先说总线 民用产品的硬盘总线多为 SATA 和 PCIe SATA 总线只能使用 AHCI 协议 NVME 对比 AHCI 的优势在于 低延时 低功耗 更适合固态硬盘 PCIe总线 可以使用 AHCI 也可以使用更高效
  • PCIe专题学习——3.2(数据链路层Ack/Nak机制解析)

    之前我们讲了对PCIe的一些基础概念作了一个宏观的介绍 了解了PCIe是一种封装分层协议 packet based layered protocol 主要包括事务层 Transaction layer 数据链路层 Data link lay
  • 确定哪些(如果有)PCI 设备插入主板 PCI(e) 插槽

    我正在用 C 编写一个程序来在许多 Windows XP 工作站上执行硬件审核 我需要确定哪些 PCI 设备是通过主板插槽连接的实际卡 而不是也使用 PCI 总线 内置于主板中 的板载设备 我可以使用各种 WMI 类成功列出使用所有 PCI
  • 从 x86 CPU 生成 64 字节读取 PCIe TLP

    将数据写入 PCIe 设备时 可以使用写入组合映射来提示 CPU 应生成针对该设备的 64 字节 TLP 是否可以对读取做类似的事情 以某种方式提示 CPU 读取整个缓存行或更大的缓冲区 而不是一次读取一个字 英特尔有关于从视频 RAM 复
  • 映射 MMIO 区域写回不起作用

    我希望对 PCIe 设备的所有读写请求都由 CPU 缓存进行缓存 然而 它并没有像我预期的那样工作 这些是我对回写 MMIO 区域的假设 对 PCIe 设备的写入仅在缓存回写时发生 TLP 有效负载的大小是缓存块大小 64B 然而 捕获的
  • 我们可以使用 x86_64 CPU 原子在 PCI Express 上生成复合原子操作吗?

    如您所知 从2 0版本开始 PCI Express支持复合原子操作 FetchAdd Swap CAS https pcisig com sites default files specification documents ECN Ato

随机推荐