目录

1. PCIe 总线概述

2. PCIe 拓扑结构

3. PCIe 分层结构

4. PCIe 事务层类型

5. PCIe 配置和地址空间


1. PCIe 总线概述

PCIe(Peripheral Component Interconnect Express)是一种用于连接计算机内部硬件设备的高速串行总线。它是在PCI(Peripheral Component Interconnect)总线的基础上发展而来的。PCI总线是在1992年由Intel推出的,以取代ISA(Industry Standard Architecture)总线。PCI总线使用并行传输,速度相对较慢,最高只能达到133MB/s。

为了满足高速数据传输的需求,PCIe总线于2003年问世。PCIe总线采用串行传输技术,通过使用多个信道并行发送数据来提高传输速度。它最初的速度为2.5GB/s,后来发展到8GB/s、16GB/s、32GB/s等多种速度级别。

链接速度 X 1 X 2 X 4 X 8
Gen1带宽(GB/s) 0.5 1 2 4
Gen2带宽(GB/s) 1 2 4 8
Gen3带宽(GB/s) 2 4 8 16
Gen4带宽(GB/s) 4 8 16 32

当用较多的数据位对原始数据进行编码时,有效数据传输量低于实际传输的数据位数。例如:PCIe串行总线采用10位数据对8位数据进行编码(附加位可能用于时钟编码、误码检测等冗余位)。数据速率通常用每秒传输的数据位,具体指的是编码后的串行比特率,每秒吉比特(GT/s)和每秒兆比特(MT/s)。例如,2.5 GT/s指的是2.5 Gbit/s串行数据速率。

吞吐量表示未编码的带宽(没有8b/10b、128b/130b或242B/256B编码的开销)。PCIe 1.0每通道2.5 GT/s的传输速率意味着2.5 Gbit/s的串行比特率。在8b/10b编码之前,对应的吞吐量为2.5Gbit/s x 8/10 = 2.0 Gbit/s。

PCIe版本 推出年份 Line code Transfe rate per lane 单向Throughput per lane(X1 lane)
1.0 2003 NRZ 8b/10b 2.5 GT/s 2.5GT/s × 8/10 ÷ 8= 0.250 GB/s
2.0 2007 NRZ 8b/10b 5.0 GT/s 5.0 GT/s × 8/10 ÷ 8= 0.500 GB/s
3.0 2010 NRZ 128b/130b 8.0 GT/s 8.0 GT/s × 128/130 ÷ 8= 0.985 GB/s
4.0 2017 NRZ 128b/130b 16.0 GT/s 16.0 GT/s × 128/130 ÷ 8= 1.969 GB/s
5.0 2019 NRZ 128b/130b 32.0 GT/s 32.0 GT/s × 128/130 ÷ 8= 3.938 GB/s

PCIe链路表示两个组件之间的双单工连接通道。基本的PCIe链路由两对低电压差分信号对组成:一对用于发送,另一对用于接收。

2. PCIe 拓扑结构

PCIe采用的树形拓扑结构,RC(Root Complex)是树的根或主干;PCI采用的是总线型拓扑结构,一条PCI总线上挂着若干个PCI终端设备或PCI桥设备。

PCIe Endpoint,就是PCIe终端设备,比如PCIe SSD、PCIe网卡等。

PCIe Switch,用于扩展链路提供更多的端口连接Endpoint。Switch扩展了PCIe端口,靠近RC的那个端口,称为上游端口(Upstream Poat),而分出来的其他端口,称为下游端口(Downstream Port)。

注:RC是指PCI Express Root Complex,作为PCIe架构的核心组件,其作用是控制每个PCIe设备之间的通信。PCIe RC是一个设备,其主要任务是管理PCIe总线上的所有端点设备。它负责生成和分发PCIe事务,以及传输和接收数据包。此外,PCIe RC还能进行地址转换和流量控制,确保各个设备能够高效地进行数据传输。

3. PCIe 分层结构

PCIe定义了三层结构:事务层、数据链路层、物理层。每层职责各不相同,但下层总是为上层服务的。

事务层(Transaction Layer):负责创建或解析TLP包、流量控制、QoS、事务排序等。

数据链路层(Data Link Layer):负责创建或解析DLLP包、Ack/Nak协议(链路层检错和纠错)、流控、电源管理等。

物理层(Physical Layer):负责处理所有的Packet数据物理传输,发送端数据分发到各个Lane传输(Stripe),接收端把各个Lane上的数据汇总起来(De-stripe),每个Lane上加扰(Scramble,目的是让0和1分布均匀,去除信道的电磁干扰EMI)和去扰(De-scramble),以及8/10或者128/130编码解码等。

PCIe各层功能细节图。

4. PCIe 事务层类型

PCIe事务层分为四种不同的类型(Memory、IO、Configuration、Message),分别用于访问内存空间、IO空间、配置空间,这三种请求在PCI或者PCI-X时代就有了,Message请求是PCIe新加的。

PCI或者PCI-X时代,像中断、错误以及电源管理相关信息,都是通过边带信号进行传输的,但PCIe干掉了这些边带信号线,所有的通信都是走带内信号,即通过Packet传输相应的Message信息。

设备的物理空间,可以通过内存映射的方式到主机的主存。新的PCIe设备(区别于Legacy PCIe设备)只支持内存映射,之所以还存在访问IO空间的TLP,完全是为了兼容老设备。

这四种事务层请求,还可分为两种类型的TLP,分别为Posted TLP和Non-Posted TLP。如果发送的TLP不需要对方回应答包,称之为Posted TLP;如果发送的TLP需要对方回应答包,称之为Non-Posted TLP。

5. PCIe 配置和地址空间

PCIe配置空间是PCI Express(PCIe)设备的寄存器集合,用于管理设备的配置和初始化。这些寄存器包含设备的ID、设备状态、中断号、资源分配和其他配置信息。

PCIe设备在启动后会被系统BIOS扫描,BIOS会读取设备的ID和配置空间来确定设备的类型、属性和资源需求。系统BIOS会将这些信息存储在系统内存中,以便操作系统加载设备驱动程序并分配资源。设备驱动程序可以通过访问PCIe配置空间来初始化设备、配置传输特性和通知系统中断信息。

每个PCIe设备都有这样一段空间,主机软件可以通过读取它获得该设备的信息,也可以通过它来配置该设备,这段空间称为PCIe的配置空间。PCIe设备的配置空间是协议规定好的,每一个字段放什么内容,都是有定义的。

配置空间就是一系列寄存器的集合,从PCI时代开始,就有的64Byte的Header和192Byte的Capability数据结构。由于PCIe功能比较强大,配置空间由PCI时代的256Byte扩展成了4KB。为了兼容PCI设备,前256Byte内容和结构保持不变。

配置空间中有个比较重要的BAR(Base Address Register) ,对Endpoint Cfg(Type0)提供最多6个BAR,而对Switch(Type1)来说只有2个。

CPU只能直接访问主机内存(Memory)空间(或者IO空间),不能直接对PCIe等外设进行操作。CPU如果想访问某个设备的空间,由于它不能亲自跟那些PCIe外设打交道,因此叫RC去办。比如,如果CPU想读取PCIe外设的数据,先叫RC通过TLP把数据从PCIe外设读到主机内存,然后CPU从主机内存读数据;如果CPU要往外设写数据,则先把数据在内存中准备好,然后叫RC通过TLP写入到PCIe设备。

具体实现就是上电的时候,系统把PCIe设备开放的空间(系统软件可见)映射到内存地址空间,CPU要访问该PCIe设备空间,只需访问对应的内存地址空间。一个PCIe设备,可能有若干个内部空间需要映射到内存空间,设备出厂时这些空间的大小和属性都写在Configuration BAR寄存器里面,上电后系统软件读取这些BAR,分别为其分配对应的系统内存地址空间,并把相应的内存基地址写回到BAR(BAR的地址其实就是PCI总线域的地址,CPU访问的是存储器域的地址,CPU访问PCIe设备时,需要把PCI总线域地址转换成存储器域的地址)。

6. PCIe 设备内存空间映射

PCIe设备可以通过在系统内存空间中分配一段地址范围,实现内存映射。下面是具体步骤:

  • 设备向系统发送请求,申请一段连续的内存空间。
  • 系统为设备分配一段合适的内存空间,并返回这段内存空间的物理地址。
  • 设备通过MMIO(Memory-Mapped I/O)方式将自己的寄存器映射到这段内存空间中,这样设备的寄存器就可以通过对这段内存空间的访问来进行控制。
  • 设备可以通过DMA(Direct Memory Access)方式,将数据传输到这段内存空间中,或者从这段内存空间中读取数据。

需要注意的是,设备需要遵守一定的规范,如PCIe规范中定义的BAR(Base Address Register)寄存器,来描述设备所需的内存空间大小和内存映射的起始地址等信息。同时,系统也需要对设备进行相应的配置,来确保内存映射正常工作。

概念补充:

1. 系统是如何检测PCIe设备的存在?

当PCIe设备被插入主板上的PCIe插槽时,主板的BIOS会扫描系统中的硬件,并通过PCIe总线来探测新插入的设备。BIOS会向设备发送一系列的命令,例如读取设备的ID号、配置信息等。如果设备能够正确地响应这些命令并返回正确的信息,则说明设备已成功连接到系统中。

2. non-prefetchable和prefetchable的区别?

Non-prefetchable和Prefetchable是PCI总线的术语。PCI总线包括多个设备和主机之间的通信。以下是它们的区别:

  1. Non-prefetchable: 指的是设备可以访问的存储区域,但是不能预取数据。这种存储区域的访问速度通常比Prefetchable存储区域稍慢。

  2. Prefetchable: 指的是设备可以访问和预取数据的存储区域。这种存储区域的访问速度通常比Non-prefetchable存储区域稍快。

总的来说,Prefetchable存储区域比Non-prefetchable存储区域更适合用于大数据传输。而且,如果设备能够预取,它可以在主机需要数据之前将数据缓存起来,提高系统性能。

对于PCIe设备,系统软件分配映射空间的步骤如下:

  1. 上电时,系统软件首先会读取PCIe设备的BAR0,得到数据BAR0初始化出厂数据;
  2. 然后系统软件往该BAR0写入全1,BAR寄存器有些bit是只读的,是PCIe设备出厂前就固化好的bit,写全1进去,如果值保持不变,就说明这些bit是厂家固化好的,这些固化好的bit提供了这块内部空间的一些信息;
  3. 如果低12位没变,表明该设备空间大小是4KB(2的12次方字节),其中低4bit表明了该存储空间的属性(IO映射还是内存映射?32bit地址还是64bit地址?能否预取?);
  4. 系统根据这些信息,在系统内存空间找到这样一块地方来映射这4KB空间,并把分配的基地址写入到BAR0中。
  5. PCIe设备至少有一个配置空间,系统软件依次读取BAR1...BAR5,完成所有内部空间的映射,第2步往BAR寄存器写入全1,如果读回来的BAR寄存器值还是全为1,则这块空间无效。

PCIe MMIO(Memory-Mapped I/O)指的是PCI Express(PCIe)总线上的内存映射I/O(MMIO),用于在计算机系统中进行高速数据传输的接口。PCIe MMIO是一种虚拟内存空间,用于映射I/O设备内部的寄存器,使其可以通过内存地址直接访问。

7. PCIe 设备内存空间映射 Trace分析

PCI Express架构概述相关推荐

  1. PCI Express 基础规范修订版6.0【编辑中】

    1. 介绍 本章介绍了PCI Express架构和关键概念的概况.PCI Express是一种高性能.通用的I/O互连,为各种未来的计算和通信平台而定义.关键属性,如使用模式.负载存储架构和软件接口, ...

  2. [PCIE733]基于PCI Express总线架构的2路160MSPS AD采集、12路LVDS图像数据采集卡

    板卡概述         PCIE733是一款基于PCI Express总线架构的,实现2路16-bit.160MSPS ADC采集功能.12路LVDS数据采集板卡.该板卡遵循PCI Express ...

  3. PCI Express解析——系列文章【1】:基本概述PCI、PCI-X与PCIe的最大区别

    PCI Express解析--系列文章[1]:基本概述PCI.PCI-X与PCIe的最大区别 1 PCIe概述 1 .1 基本简介 1.2 PCI.PCI-X和PCIe 1.3 PCIe发展版本 1. ...

  4. NVMe Over Fabrics架构概述

    NVMe Over Fabrics使用RDMA或光纤通道(FC)架构等Fabric技术取代PCIe传输.如图所示,除了基于RDMA架构的传输包括以太网(ROCE),InfiniBand和iWARP,当 ...

  5. 浅谈PCI Express体系结构(二)

    PCI总线的信号定义 PCI总线是一条共享总线,在一条PCI总线上可以挂接多个PCI设备.这些PCI设备通过一系列信号与PCI总线相连,这些信号由地址/数据信号.控制信号.仲裁信号.中断信号等多种信号 ...

  6. 浅谈PCI Express体系结构(一)

    PCI(Peripheral Component Interconnect)总线的诞生与PC(Personal Computer)的蓬勃发展密切相关.在处理器体系结构中,PCI总线属于局部总线(Loc ...

  7. 浅谈PCI Express体系结构(三)

    PCI总线的存储器读写总线事务 总线的基本任务是实现数据传送,将一组数据从一个设备传送到另一个设备,当然总线也可以将一个设备的数据广播到多个设备.在处理器系统中,这些数据传送都要依赖一定的规则,PCI ...

  8. 浅谈PCI Express体系结构(四)

    PCI总线的中断机制 PCI总线使用INTA#.INTB#.INTC#和INTD#信号向处理器发出中断请求.这些中断请求信号为低电平有效,并与处理器的中断控制器连接.在PCI体系结构中,这些中断信号属 ...

  9. 【扫盲】硬盘接口『 SATA 、 mSATA 、 m.2 ( NGFF )、PCI-E ( PICe 、 PCI Express ) 』及其协议 『 NVMe 、 AHCI 』

    参考: What is the IDE interface and what does it consist of? - https://itigic.com/ide-ata-pata-and-ata ...

最新文章

  1. 今晚20:00 | 港科大郑光廷院士详解人工视觉技术发展及应用
  2. 如何自动检查内存泄漏和句柄耗尽
  3. tcp的无延时发送_高并发架构的TCP知识介绍
  4. Shortest Prefixes
  5. Python 网络爬虫与信息获取(一)—— requests 库的网络爬虫
  6. numpy 辨异(四)—— np.repeat 与 np.tile
  7. 使用System.Drawing.Printing 画报表。
  8. VMware虚拟机安装Windows 10 详细教程
  9. 触摸屏学习:利用状态机编程
  10. LabVIEW编程LabVIEW开发研华PCI-1710 数据采集卡例程与相关资料
  11. Java必须要掌握的基本问题
  12. React基础之事件机制
  13. 什么是网易企业邮箱客户端专有协议?
  14. 王道计算机组成原理课代表 - 考研计算机 第四章 指令系统 究极精华总结笔记
  15. 在计算机网络中 带宽是什么,在计算机网络中,“带宽”用____表示。
  16. IntelliJ IDEA文件名颜色分别表示的意思
  17. 【NLP】文本分类TorchText实战-AG_NEWS 新闻主题分类任务(PyTorch版)
  18. Android加密算法
  19. [C51]STC89C51最小板接线与烧录程序
  20. 关于Linux 网络抓包的一些笔记整理

热门文章

  1. 关于彻底获得管理员权限的方法。(解决PYTHON PS 等报错问题)
  2. ue4怎么用虚幻商城场景_【更新】UE4虚幻引擎野外场景制作零基础入门教程
  3. MySQL —— 8、数据的增删改
  4. Python 将 mp3 导出为 ogg 格式
  5. iPhone王者找不到以前服务器,王者荣耀怎么找以前的区
  6. 使用Typora+PicGo配置Gitee图床
  7. git commit -m 提交忽略代码校验
  8. 【保姆级教程】彻底卸载Anaconda
  9. LeetCode #69 x的平方根 二分查找
  10. python电路仿真001