首页 > 其他分享 >PCIe扫盲——基地址寄存器(BAR)详解

PCIe扫盲——基地址寄存器(BAR)详解

时间:2025-01-03 16:17:00浏览次数:1  
标签:BAR 比特 PCIe 地址 寄存器 所示 操作 软件

基地址寄存器(BAR)在配置空间(Configuration Space)中的位置如下图所示:

image

其中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

Step1:如图中(1)所示,未初始化的BAR的低比特(114)都是0,高比特(3112)都是不确定的值。所谓初始化,就是系统(软件)向整个BAR都写1,来确定BAR的可操作的最低位是哪一位。当前可操作的最低位为12,因此当前BAR可申请的(最小)地址空间大小为4KB(212)。如果可操作的最低位为20,则该BAR可申请的(最小)地址空间大小为1MB(220)。

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

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

例2. 64-bit Memory Address Space Request

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

image

例3. IO Address Space Request

下面是一个申请IO地址空间的例子,如下图所示:

image

注:需要特别注意的是,软件对BAR的检测与操作(Evaluating)必须是顺序执行的,即先BAR0,然后BAR1,……,直到BAR5。当软件检测到那些被硬件设置为全0的BAR,则认为这个BAR没有被使用。

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

标签:BAR,比特,PCIe,地址,寄存器,所示,操作,软件
From: https://www.cnblogs.com/linhaostudy/p/18650295

相关文章

  • obstacle vs barrier coca
     left4WORD1:OBSTACLE WORDW1W2 BIGGEST46086ThebiggestobstacleIfaceis我面临的最大障碍是Thebiggestobstacleforuswasthat对我们来说最大的障碍是 MAIN13932themainobstacle主要障碍 AN1914475 SERIOUS8122isaseriousobst......
  • wx.setTopBarText
    wx.setTopBarText(Objectobject)从基础库1.9.9开始,本接口停止维护基础库1.4.3开始支持,低版本需做兼容处理。以Promise风格调用:支持需要页面权限:当前是插件页面时,宿主小程序不能调用该接口,反之亦然小程序插件:不支持功能描述动态设置置顶栏文字内容。只有当前小......
  • wx.hideNavigationBarLoading
    wx.hideNavigationBarLoading(Objectobject)以Promise风格调用:支持需要页面权限:当前是插件页面时,宿主小程序不能调用该接口,反之亦然小程序插件:支持,需要小程序基础库版本不低于2.1.0在小程序插件中使用时,只能在当前插件的页面中调用微信Windows版:支持微信Mac版:支持......
  • wx.setNavigationBarColor
    wx.setNavigationBarColor(Objectobject)基础库1.4.0开始支持,低版本需做兼容处理。以Promise风格调用:支持需要页面权限:当前是插件页面时,宿主小程序不能调用该接口,反之亦然小程序插件:支持,需要小程序基础库版本不低于2.1.0在小程序插件中使用时,只能在当前插件的页面......
  • wx.setNavigationBarTitle
    wx.setNavigationBarTitle(Objectobject)以Promise风格调用:支持需要页面权限:当前是插件页面时,宿主小程序不能调用该接口,反之亦然小程序插件:支持,需要小程序基础库版本不低于2.1.0在小程序插件中使用时,只能在当前插件的页面中调用微信Windows版:支持微信Mac版:支持微......
  • wx.showNavigationBarLoading
    wx.showNavigationBarLoading(Objectobject)以Promise风格调用:支持需要页面权限:当前是插件页面时,宿主小程序不能调用该接口,反之亦然小程序插件:支持,需要小程序基础库版本不低于2.1.0在小程序插件中使用时,只能在当前插件的页面中调用微信Windows版:支持微信Mac版:支持......
  • 8086汇编(16位汇编)学习笔记10.寄存器总结
    8086汇编(16位汇编)学习笔记10.寄存器总结-C/C++基础-断点社区-专业的老牌游戏安全技术交流社区-BpSend.net寄存器8086CPU有14个寄存器它们的名称为:AX、BX、CX、DX、SI、DI、SP、BP、 IP**、CS、DS、ES、**SS、PSW。8086CPU所有的寄存器都是16位的,可以存放两个字节。AX、......
  • 寄存器2
    Z标志位,运算结果为0,则Z标志位置1.1.1有符号数为负1.1.2按f8,单步步过,0xffffffff+0x1等于0,Z标志位置1.S符号标志位,运算结果为负数,则标志位为1.2.1EAX值为0XFFFFFFFE(-2),加1等于负1,再加等于0,看S标志位.2.2跳转EIP,按f8,再加.C进位标志位,运算结果超过无符号整数最......
  • 寄存器1
    EIPEIP永远指向下一个将要执行的指令,指向的地方在od中,是灰色底色,黑色字体。ESP永远指向栈顶的位置,指向的地方在od中,是灰色底色,黑色字体。EAX,EBX,ECX,EDX存储方式如下,都是16进制存储数。3.1EAX=12345678,AX=5678,AH=56,AL=78.3.2EBX=23452389,BX=2389,B......
  • PCIe扫盲——Type0 & Type1 型配置请求
    前面的文章中介绍过有两种类型的配置空间,Type0和Type1,分别对应非桥设备(Endpoint)和桥设备(Root和Switch端口中的P2P桥)。Type0还是Type1是由事务层包(TLP)包头中的TypeField所决定的,而读还是写则是由TLP包头中的FormatField所决定的。分别以下两张图所示:之前的文章中强调过,PCIe中......