首页 > 其他分享 >PCIe扫盲:Memory & IO 地址空间/基地址寄存器详解/Base & Limit寄存器详解

PCIe扫盲:Memory & IO 地址空间/基地址寄存器详解/Base & Limit寄存器详解

时间:2024-08-15 10:37:37浏览次数:12  
标签:Base BAR MMIO 地址 详解 IO 寄存器

转载:PCIe扫盲:Memory & IO 地址空间/基地址寄存器详解/Base & Limit寄存器详解 - 极术社区 - 连接开发者与智能计算生态 (aijishu.com)

Memory & IO 地址空间

早期的PC中,所有的IO设备(除了存储设备之外的设备)的内部存储或者寄存器都只能通过IO地址空间进行访问。但是这种方式局限性很大,而且效率低,于是乎,软件开发者和硬件厂商都不能忍了……然后一种新的东西就出来了——MMIO。

MMIO,即Memory Mapped IO,也就是说把这些IO设备中的内部存储和寄存器都映射到统一的存储地址空间(Memory Address Space)中。

但是,为了兼容一些之前开发的软件,PCIe仍然支持IO地址空间,只是建议在新开发的软件中采用MMIO。

注:PCIe Spec中明确指出,IO地址空间只是为了兼容早期的PCI设备(Legacy Device),在新设计中都应当使用MMIO,因为IO地址空间可能会被新版本的PCI Spec所抛弃。

IO地址空间的大小是4GB(32bits),而MMIO则取决于处理器(和操作系统),并且由处理器进行统一分配管理。

如下图所示,PCIe总线中有两种MMIO:P-MMIO和NP-MMIO。
image.png
P-MMIO,即可预取的MMIO(Prefetchable MMIO);

NP-MMIO,即不可预取的MMIO(Non-Prefetchable MMIO)。其中P-MMIO读取数据并不会改变数据的值。

注:P-MMIO和NP-MMIO主要是为了兼容早期的PCI设备,因为PCIe请求中明确包含了每次的传输的大小(Transfer Size),而PCI并没有这些信息。

基地址寄存器(BAR)详解

基地址寄存器(BAR)在配置空间(Configuration Space)中的位置如下图所示:
image.png
其中Type0 Header最多有6个BAR,而Type1 Header最多有两个BAR。

这就意味着,对于Endpoint来说,最多可以拥有6个不同的地址空间。但是实际应用中基本上不会用到6个,通常1~3个BAR比较常见。

主要注意的是,如果某个设备的BAR没有被全部使用,则对应的BAR应被硬件全被设置为0,并且告知软件这些BAR是不可以操作的。

对于被使用的BAR来说,其部分低比特位是不可以被软件操作的,只有其高比特位才可以被软件操作。

而这些不可操作的低比特决定了当前BAR支持的操作类型和可申请的地址空间的大小。

一旦BAR的值确定了(Have been programmed),其指定范围内的当前设备中的内部寄存器(或内部存储空间)就可以被访问了。当该设备确认某一个请求(Request)中的地址在自己的BAR的范围内,便会接受这请求。

下面用几个简单的例子来熟悉BAR的机制:

例1. 32-bit Memory Address Space Request

如下图所示,请求一个4KB的NP-MMIO一般需要以下三个步骤:
image.png
Step1:如图中(1)所示,未初始化的BAR的低比特(11~4)都是0,高比特(31~12)都是不确定的值。

所谓初始化,就是系统(软件)向整个BAR都写1,来确定BAR的可操作的最低位是哪一位。

当前可操作的最低位为12,因此当前BAR可申请的(最小)地址空间大小为4KB(2^12)。如果可操作的最低位为20,则该BAR可申请的(最小)地址空间大小为1MB(2^20)。

Step2:完成初始化(写1操作)之后,软件便开始读取BAR的值,来确定每一个BAR对应的地址空间大小和类型。其中操作的类型一般由最低四位所决定,具体如上图右侧部分所示。

Step3:最后一步是,软件向BAR的高比特写入地址空间的起始地址(Start Address)。如图中所示,为0xF9000000。

例2. 64-bit Memory Address Space Request

下面是一个申请64MB P-MMIO地址空间的例子,由于采用的是64-bit的地址,因此需要两个BAR。具体如下图所示:
image.png
例3. IO Address Space Request

下面是一个申请IO地址空间的例子,如下图所示:
image.png
注:需要特别注意的是,软件对BAR的检测与操作(Evaluating)必须是顺序执行的,即先BAR0,然后BAR1,……,直到BAR5。当软件检测到那些被硬件设置为全0的BAR,则认为这个BAR没有被使用。

注:无论是PCI还是PCIe,都没有明确规定,第一个使用的BAR必须是BAR0。事实上,只要设计者原意,完全可以将BAR4作为第一个BAR,并将BAR0~BAR3都设置为不使用。

Base & Limit寄存器详解

上一篇文章介绍了Type0型配置空间Header中的BAR的作用和用法,但是PCIe中的桥设备(Switch和Root中的P2P)又是如何判断某一请求(Request)是否属于自己或者自己的分支下的设备的呢?这实际上是通过Type1型配置空间Header中的Base和Limit寄存器来实现的,这篇文章来进行简单地介绍一下。

Base和Limit寄存器在Type1 Header中的位置如下图所示:
image.png
Base和Limit寄存器分别确定了其所有分支下设备(The device that live beneath this bridge)的地址的起始和结束地址。根据请求类型的不同,分别对应不同的Limit&Base组合:

· Prefetchable Memory Space(P-MMIO)
· Non- Prefetchable Memory Space(NP-MMIO)
· IO Space(IO)

一旦该桥分支下面的任意设备的BAR发生改变,该桥的Base&Limit寄存器也需要做出对应的改变。

下面以一个简单的例子,来分析一下:
image.png
如上图所示,连接到Switch的PortB上的PCIe Endpoint分别配置了NP-MMIO、P-MMIO和IO空间。下面来简单地分析一下PortB的Header中的Base & Limit 寄存器。

P-MMIO Base & Limit
image.png
NP-MMIO Base & Limit
image.png
需要注意的是,Endpoint的需要的NP-MMIO的大小明明只有4KB,PortB的Header却给其1MB的空间(最小1MB),也就是说剩余的空间都将会被浪费掉,并且其他的Endpoint都将无法使用这一空间。

IO Base & Limit
image.png
注:IO空间可分配的最小值为4KB,最大值则取决于操作系统和BIOS。

Unused Base and Limit Registers

很多情况下,我们并不需要所有的地址空间类型,比如所在某一个Endpoint中没有使用IO Space。此时,其对应的桥的Header会把Base的地址设置为大于Limit的地址,也就是把地址范围设置为无效。

一个完整的例子如下图所示:
image.png

 

标签:Base,BAR,MMIO,地址,详解,IO,寄存器
From: https://www.cnblogs.com/zhiminyu/p/18360413

相关文章

  • 神经网络之卷积篇:详解三维卷积(Convolutions over volumes)
    详解三维卷积从一个例子开始,假如说不仅想检测灰度图像的特征,也想检测RGB彩色图像的特征。彩色图像如果是6×6×3,这里的3指的是三个颜色通道,可以把它想象成三个6×6图像的堆叠。为了检测图像的边缘或者其他的特征,不是把它跟原来的3×3的过滤器做卷积,而是跟一个三维的过滤器,它的维......
  • Spring Boot中的数据库事务管理详解
    SpringBoot中的数据库事务管理详解大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在企业级应用开发中,数据库事务管理是确保数据一致性和完整性的关键。SpringBoot作为Java开发中流行的框架之一,提供了对数据库事务的全面支持。本文将详细介绍Spring......
  • 计算机网络——HTTP协议详解(上)
    一、HTTP协议简单介绍1.1什么是HTTP协议HTTP(超文本传输协议)是一种用于在Web浏览器和Web服务器之间传输数据的应用层协议。它是一种无状态协议,即服务器不会保留与客户端的任何连接状态信息,每个请求都被视为一个独立的事务。假设你使用Web浏览器(例如Chrome)访问一个网页。当......
  • 【Material-UI】Floating Action Button (FAB) 详解:动画效果 (Animation)
    文章目录一、FAB按钮的动画概述1.默认动画效果2.多屏幕横向切换时的动画二、FAB动画效果的实现1.代码示例:跨标签页的FAB动画2.代码解析3.多个FAB的切换三、动画效果的最佳实践四、总结在现代网页设计中,动画不仅提升了用户界面的动态感,还增强了用户的交......
  • Python教程(十四):Requests模块详解
    目录专栏列表前言:安装Requests查看包安装情况:RESTful介绍RESTfulAPI设计原则示例基本用法1.查询ID为1的用户(GET)2.创建新用户(POST)3.更新ID为1的用户(PUT)4.删除ID为1的用户(DELETE)响应对象会话(Session)异常处理高级用法流式上传处理重定向使用代理请求超时总......
  • kubernetes 核心组件详解
    Kubernetes是什么?**Kubernetes集群(KubernetesCluster)是一个由多个节点组成的系统,用于自动化部署、管理、扩展和操作容器化应用程序。Kubernetes是一种开源的容器编排平台,它通过集群的形式来管理容器,使得应用的运行、管理和扩展变得更加高效和自动化。基础概念与组件docker......
  • Vulnhub JIS-CTF靶机详解
    项目地址https://www.vulnhub.com/entry/jis-ctf-vulnupload,228/https://www.vulnhub.com/entry/jis-ctf-vulnupload,228/修改靶机的网卡开机时长按shift,进入此页面选择root模式进入将只读模式改为读写模式mount-oremount,rw/查看本机的网卡名称ifconfig-a修......
  • java后端详解中
    1.日期时间yyyy表示当天所在的年YYYY代表是weekinwhichyear,表示当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,返回的YYYY就是下一年。表示日期和时间的格式:newSimpleDateFormat("yyyy-MM-dd:HH:mm:ss")1)表示月份是大写的M;2)表示分钟则是小写的m;3)24小......
  • 类之间的6种关系详解
    目录依赖关联(Association)聚合(Aggregation)组合(Composition)继承(Inheritance)实现(Implementation)在JAVA以及其他的面向对象设计模式中,类与类之间主要有6种关系,分别是:依赖、关联、聚合、组合、继承、实现,他们的耦合度依次增强。其中,关联、聚合和组合关系仅仅是在语义上有所区别,所谓......
  • 未来暴富都在看的高可用集群keepalived详解及常见实验
    目录一、高可用集群1.1集群类型1.2. 系统可用性1.3系统故障1.4实现高可用1.5VRRP(VirtualRouterRedundancyProtocol) 1.5.1VRRP相关术语1.5.2VRRP相关技术二、Keepalived部署 2.1keepalived简介2.2keepalived的优点三、实验详解实验环境3.1keepaliv......