PCIE研究-2

2023-09-18 11:54:46

PCIe是一种高速串行总线,用于连接计算机内部的各种设备。在PCIe中,有四种不同的设备类型:Switch、Bridge、Root Complex和EndPoint。本篇文章将介绍这四种设备类型的基础知识。

1. Switch

Switch是PCIe中最常见的设备类型之一,它可以将一个PCIe总线分成多个子总线。Switch可以将数据从一个端点设备传输到另一个端点设备,同时还可以控制数据的流向和速度。Switch通常用于连接多个设备,以便它们可以共享PCIe总线的带宽。

2. Bridge

Bridge是另一种常见的PCIe设备类型,它可以连接两个不同的PCIe总线。Bridge可以将数据从一个PCIe总线传输到另一个PCIe总线,同时还可以控制数据的流向和速度。Bridge通常用于连接不同类型的设备,例如将PCIe总线连接到PCI总线或其他类型的总线。

3. Root Complex

Root Complex是PCIe总线的起点,它通常是计算机主板上的芯片组。Root Complex负责控制PCIe总线上的所有设备,包括Switch和EndPoint。Root Complex还负责初始化PCIe总线上的所有设备,并为它们分配资源,例如内存地址和中断。

4. EndPoint

EndPoint是PCIe总线上的最终设备,它通常是计算机内部的各种设备,例如显卡、网卡、声卡等。EndPoint负责接收和发送数据,并将数据传输到其他设备或主机内存中。EndPoint还可以向Root Complex请求资源,例如内存地址和中断。

总之,Switch、Bridge、Root Complex和EndPoint是PCIe总线中的四种不同设备类型,它们各自扮演着不同的角色,共同构成了PCIe总线的基础架构。了解这些设备类型的基础知识,有助于我们更好地理解PCIe总线的工作原理和应用场景。

link & lane:

lane:指pcie设备物理层传输线的一对差分线(差分对),是一个纯粹的、准确的物理实现(Physical);

link:指pcie设备的传输通道,是一个概括的概念(比如AXI总线可以指整个AXI传输通道),pcie设备间的link可以包含多个lane;

Link初始化以及link建立过程(或者称之为链路训练,Link Training)是在设备上电或者链路重新建立链接是发生的。

Region:

在PCIe控制器中,把PCIe的地址等分成32块regions (Regions 0 to 31),cpu以及外部DMA可以通过region映射向PCIE link发出写请求,可用配置(conguration space),以及数据传输(memory space)

PCI总线规定访问配置空间总线事务,使用ID号进行寻址。PCI设备ID号由总线号(Bus Number)、设备号(Device Number)和功能号(Function Number)。其中总线号在HOST主桥遍历PCI总线树时确定,在一颗PCI总线树上,总线号由系统软件决定,通常与HOST主桥直接相连接的PCI总线编号为0,系统软件使用DFS(Depth-First Search)算法扫描PCI总线树上的所有PCI总线,并依次编号。一条PCI总线的设备号由PCI设备的IDSEL信号与PCI总线地址线的连接关系确定,功能号与PCI设备的具体设计有关。一个PCIe系统最多有256条Bus,每条Bus上最多可以挂在32个设备,每个PCIe设备最多有8个功能设备。

从cpu角度理解PCIe-云社区-华为云

在XX处理器中的HOST主桥中,与PCIE设备配置相关的寄存器由CFG_ADDR、CFG_DATA等组成。系统软件使用CFG_ADDR(CFG_ADDR寄存器结构如图 2所示)和CFG_DATA寄存器访问PCIe设备的配置空间,这些寄存器都是采取同一编址(所有内存寄存器都使用存储器映射方式进行寻址)。当处理器访问PCIe配置空间时,首先需要在CFG_ADD寄存器中设置这个PCIe设备对应的总线号、设备号、功能号和寄存器偏移,然后使能Enable位,之后当处理器对CFG_DATA读写访问时,HOST主桥将这个存储器读写访问转换成PCIe配置读写请求,并且发送到PCIe总线上。如果Enable位没有使能,那么CPU对寄存器的访问也就是一个普通IO的访问,而不能让HOST转换成总线请求访问,访问PCIe配置空间时按照PCIe总线标准配置TLP请求,CFG_DATA是读取的数据或者待写入的数据。

既然CPU能够直接通过寄存器访问配置空间,为啥还会出现配置空间在存储域地址的映射这一说法呢?下面给出详细解答。

Intel(Intel是PCIe龙头老大,最新的PCIe的规范总是它最先尝试的)实现的PCI规范使用IO空间的CF8h和CFCh来分别作为索引和数据寄存器,这种方法可以访问所有PCI设备的255 bytes配置寄存器。Intel Chipsets目前仍然支持这种访PCI配置空间的方法。

        PCIe规范在PCI规范的基础上,将配置空间扩展到4K bytes,至于为什么扩展到4K,具体可以参考PCIe规范,这些配置CFG_ADDR和CFG_DATA寄存器方法仍然可以访问所有PCIe设备配置空间的头255 bytes,但是该方法访问不了剩下的(255B~4K)配置空间。

        Intel Chipset通过将配置空间映射到内存地址空间,PCIe配置空间可以像对映射范围内的内存进行read/write来访问了。这种映射是由北桥芯片来完成的,但是不同芯片的映射方式也是不同的。目前我查看了ARM芯片的datasheet,确实是这样的方式。

PCIe规范为每个PCIe设备添加了更多的配置寄存器,空间为4K,尽管CFG_ADDR和CFG_DATA寄存器方法仍然能够访问lower 255 bytes,但是必须提供另外一种方法来访问剩下的(255B~4K)range寄存器。Intel的解决方案是使用了预留256MB内存地址空间,对这段内存的任何访问都会发起PCIe 配置cycle。由于4K的配置空间是directly mapped to memory的,那么PCIe规范必须保证所有的PCIe设备的配置空间占用不同的内存地址,按照PCIe规范,支持最多256个bus,每个Bus支持最多32个PCIe devices,每个device支持最多8个function,也就是说:占用内存的最大值为:256 * 32 * 8 * 4K = 256MB。图 3是ARM Cortex-A9 datasheet内存地址分配局部图。被PCIe配置空间占用的256M内存空间会屏蔽掉DRAM使用该段内存区,这些地址都由CPU出厂时已经固化好了。

有些CPU没有直接指定PCIe配置空间的地址范围,需要读取某个寄存器的值BaseAddr,这个值就说PCIe配置寄存器在内存区域映射的基地址。访问PCIe设备配置空间时候需要手动计算访问PCIe配置空间的地址。计算发放如下:

SIZE_PER_FUNC = 4K = 1000h

SIZE_PER_DEVICE = 4K * 8 = 8000h

SIZE_PER_BUS = 4K *8* 32 = 100000h

访问总线号为busNo,设备号为DevNo,功能号为funcNo的offset寄存器的计算公式是:

Memory Address = BaseAddr+ busNo * SIZE_PER_BUS+ devNo * SIZE_PER_DEVICE+ funcNo * SIZE_PER_FUNC+ offset

访问PCIe配置空间就需要通过总线号、设备号、功能号、寄存器偏移进行转换成内存地址。转换函数如图 2所示。

4.JPG

前256Bytes可以通过寄存器方式访问,后面的256B~4k必须通过映射才能访问,映射无非就是把配置空间映射到存储地址空间,或者把PCIe设备空间映射到存储地址空间。下面开始讨论映射关系。

地址映射关系

PCIe在存储域地址空间分为三部分,PCIe控制器本身的寄存器、PCIe设备的配置空间、PCIe设备空间。寄存器和配置空间由处理器本身决定存储地址范围,本款处理器地址范围如图5所示,配置空间地址、寄存器地址、内存地址都已经确定。PCIe设备空间需要编程人员去配置Outbound和Inbound寄存器组,确定映射关系

Outbound在PCIe控制器中扮演的角色是将存储地址翻译到PCIe域的PCIe地址,Inbound是将PCIe地址翻译成存储地址,图6是一个完整的RC和EP模型地址翻译模型,图中的地址数字仅仅代表一种形态,具体地址应该是什么在后文中讲解。当cpu需要访问EP的内存空间时,首先应该将存储地址转换成PCIe地址,在根据TLP到达指定的EP,进而将PCIe地址转换成EP端的存储地址。

PCIe地址到存储地址之间的映射关系由三个寄存器决定(有两个寄存器组应该是32个寄存器)OB_SIZE、OB_OFFSET_INDEXn、OB_OFFSETn_HI,n的范围是0~31。在PCIe控制器中是把PCIe地址等分成32块regions (Regions 0 to 31),每个regions的大小是可以通过编程设置OB_SIZE寄存器确定大小,大小有1, 2, 4, or 8 MB,那么通过Outbound能够翻译的地址最大为8M*32=256M。存储域地址中有5位作为识别32个regions的index,OB_SIZE的大小决定这5位在32位地址上的位置。当OB_SIZE等于0,1,2,3时,index在存储地址中对应的位置是Bits[24:20], bits[25:21], bits[26:22], and bits[27:23],每个regions翻倍,是不是对应的地址应该按翻倍对齐呢,翻倍就是左移一位数据。

     扫描PCIe

扫描树的流程如下:

1)         建立存储地址到PCIe地址映射 (映射方式上面段落已经讲解了,固定的PCIe配置空间映射)

2)         分配PCIe总线号

3)         分配设备号

4)         访问配置空间 (这里有一个原则读者需要注意,对PCIe设备配置空间访问时,一定要确定总线号、设备号、功能号、寄存器,不然无法找到设备)

5)         读写BAR0确定PCIe设备1空间大小

6)         分配PCIe地址

PCIE典型结构拓扑

更多推荐

《深入PostgreSQL的存储引擎:原理与性能》

🌷🍁博主猫头虎(🐅🐾)带您GotoNewWorld✨🍁🐅🐾猫头虎建议程序员必备技术栈一览表📖:🛠️全栈技术FullStack:📚MERN/MEAN/MEVNStack|🌐Jamstack|🌍GraphQL|🔁RESTfulAPI|⚡WebSockets|🔄CI/CD|🌐Git&Versio

calibre和cpolar搭建一个私有的网络书库

Kindle中国电子书店停运不要慌,十分钟搭建自己的在线书库随时随地看小说!文章目录Kindle中国电子书店停运不要慌,十分钟搭建自己的在线书库随时随地看小说!1.网络书库软件下载安装2.网络书库服务器设置3.内网穿透工具设置4.公网使用kindle访问内网私人书库6月底,亚马逊公司旗下Kindle中国电子书店停止运营

使用QLoRA对Llama 2进行微调的详细笔记

使用QLoRA对Llama2进行微调是我们常用的一个方法,但是在微调时会遇到各种各样的问题,所以在本文中,将尝试以详细注释的方式给出一些常见问题的答案。这些问题是特定于代码的,大多数注释都是针对所涉及的开源库以及所使用的方法和类的问题。导入库对于大模型,第一件事是又多了一些不熟悉的Python库。!pipinstall

docker network create命令

dockernetworkcreate命令用于创建一个新的网络连接。DRIVER接受内置网络驱动程序的桥接或覆盖。如果安装了第三方或自己的自定义网络驱动程序,则可以在此处指定DRIVER。如果不指定--driver选项,该命令将为您自动创建一个桥接网络。当安装DockerEngine时,会自动创建桥接网络。该网络对应于

Docker基础学习

Docker学习目标:掌握Docker基础知识,能够理解Docker镜像与容器的概念完成Docker安装与启动掌握Docker镜像与容器相关命令掌握TomcatNginx等软件的常用应用的安装掌握docker迁移与备份相关命令能够运用Dockerfile编写创建容器的脚本能够搭建与使用docker私有仓库​1Docke

Say0l的安全开发-代理扫描工具-Sayo-proxyscan【红队工具】

写在前面终于终于,安全开发也练习一年半了,有时间完善一下项目,写写中间踩过的坑。安全开发的系列全部都会上传至github,欢迎使用和star。工具链接地址https://github.com/SAY0l/Sayo-proxyscan工具简介SOCKS4/SOCKS4a/SOCKS5/HTTP/HTTPS快速代理扫描。后

【SpringCloud微服务全家桶学习笔记-服务注册zookeeper/consul】

SpringCloud微服务全家桶学习笔记Eureka服务注册gitee码云仓库9.其他服务注册框架(1)zookeeper安装与使用zookeeper需安装在虚拟机上,建议使用CentOS,安装地址如下:zookeeper镜像源选择第一个进入后下载tar包(第二个为源码文件,想研究源码可下载第二个)下载完成后使用xf

如果模块请求http改为了https,测试方案应该如何制定和修改?

当模块从HTTP切换到HTTPS时,需要制定相应的测试方案来验证系统的功能和安全性。以下是一些建议的测试内容和步骤:功能测试:a.确保模块能够正确地重定向到HTTPS端口。b.验证通过HTTPS访问模块时,是否能够正常加载和展示页面内容。c.检查模块的各种功能和业务逻辑是否能够正常工作。安全性测试:a.验证HTTPS证

小试GraphQL

之前做的需求,基本都是REST风格,以github提供的api为例,比较二者差异。试用GraphQL,找寻其独到之处RESTREST[1]一个URI代表一种资源通过HTTP动词对资源进行操作以创建一个仓库[2]为例GET[3],PATCH[4]和DELETE[5]类似GraphQLGraphQL的endpoint只有一

【ZLM】花屏现象记录

目录事后小结现象tcpdump看下包的情况移了两个摄像头到10.60.100.196事后小结花屏的现象,主要看链路时延的稳定性。如果ping-s2000ip,>2ms已经带宽2000*8*2/0.002s=16Mbps,说明带宽不够,应该接近100Mbps左右。你可以用5000的报文再测试一次。同时你可以试下与自己电脑

【数据结构复习之路】线性表(严蔚敏版)万字详解&主打基础

专栏:数据结构复习之路数据结构的三要数:逻辑结构、数据的运算、存储结构(物理结构)。我接下来要介绍的线性表,顾名思义也将从这三个大方向进行阐述:一、线性表的定义——逻辑结构线性表是具有相同数据类型的n(n>=0)个数据元素的有限序列,其中n为表长,当n=0时,线性表是一个空表。若用L命名线性表,则其一般表示为:⚠️线性

热文推荐