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

其中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一般需要以下三个步骤:

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。具体如下图所示:

例3.IO Address Space Request

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

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

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

pci配置基地址_PCIe扫盲——基地址寄存器(BAR)详解相关推荐

  1. moviepy音视频剪辑:视频剪辑基类VideoClip的属性及方法详解

    ☞ ░ 前往老猿Python博文目录 ░ 一.概述 在<moviepy音视频剪辑:moviepy中的剪辑基类Clip详解>和<moviepy音视频剪辑:moviepy中的剪辑基类Cl ...

  2. access h3c交换机光口_华为交换机如何配置?access、trunk、hybird端口详解

    原标题:华为交换机如何配置?access.trunk.hybird端口详解 很多人朋友多次问到华为交换机的配置,确实用的比较多,上次我们有单独提到h3c交换机的配置,今天我们来了解下华为交换机的配置, ...

  3. pcie握手机制_【博文连载】PCIe扫盲——Ack/Nak 机制详解(一)

    原标题:[博文连载]PCIe扫盲--Ack/Nak 机制详解(一) 前面在数据链路层入门的文章中简单地提到过Ack/Nak机制的原理和作用,接下来的几篇文章中将对Ack/Nak机制进行详细地介绍. A ...

  4. Oracle11g安装教程、配置实例、监听、客户端程序详解_Windows篇

    Oracle11g安装教程.配置实例.监听.客户端程序详解_Windows篇 文章目录 Oracle11g安装教程.配置实例.监听.客户端程序详解_Windows篇 前言 一.数据库的安装前准备,前提 ...

  5. ipv6简写还原_IPv6地址表示方法及其简化方法详解

    原标题:IPv6地址表示方法及其简化方法详解 对于一个完整的IPv6地址,需要写128位,已经被分成了8段,每段4个字符,也就是说完整地表示一个IPv6地址,需要写32个字母,这是相当长的,并且容易混 ...

  6. CENTOS7 高性能Linux集群 通过yum进行 haproxy配置 !安装 !使用!HAProxy配置文件详解

    Haproxy配置 永久修改名字:便于区分虚拟机! Haproxy:hostnamectl set-hostname haproxy Web1: hostnamectl set-hostname WE ...

  7. 交换机工作原理、MAC地址表、路由器工作原理详解

    一:MAC地址表详解 说到MAC地址表,就不得不说一下交换机的工作原理了,因为交换机是根据MAC地址表转发数据帧的.在交换机中有一张记录着局域网主机MAC地址与交换机接口的对应关系的表,交换机就是根据 ...

  8. dockerhub 拉取地址_DockerHub 镜像仓库的使用详解

    之前我们使用的镜像都是从 DockerHub 公共仓库拉取的,我们也学习了如何制作自己的镜像,但是通过 tar 包的方式实现镜像的备份恢复迁移对于团队协作开发并不是特别友好,我们也可以将镜像推送至 D ...

  9. IP地址,子网掩码,网段 概念详解

    文章目录 1. 子网掩码 1.1 子网掩码的概念及作用 1.2 子网掩码的组成 1.3 子网掩码的表示方法 1.4 为什么要使用子网掩码? 1.5 子网掩码的分类 2. 子网掩码和IP地址的关系 2. ...

最新文章

  1. 【TP3.2】路由匹配和规则
  2. UML 建模大佬养成记(Java版)
  3. Spring5源码 - 00 IOC容器创建_前期准备
  4. GDCM:dicom文件转储签证变更的测试程序
  5. JAVASCRIPT实现绚丽TAB选项卡
  6. Ubuntu中用gedit保存文件失败的解决办法
  7. springboot 后台模板_spring boot实战
  8. 80)PHP,扩展工具类
  9. logging模块(二十六)
  10. SAI v2.0小巧强大的板绘工具
  11. 《完全写作指南》随笔
  12. GIS空间分析 三维分析1 空间插值与三维可视化
  13. markDown 下载安装教程
  14. 水电站计算机监控作用,计算机监控系统在水电站中的应用
  15. android 车载安富蓝牙电话开发,Android平台BLE低功耗蓝牙开发
  16. 企业网络安全区域划分的原则和方法
  17. gabor 变换matlab,Gabor变换到底是什么鬼?
  18. 简单实现一个手持弹幕功能+文字抖动特效
  19. 多核cpu的缓存一致性
  20. 港科夜闻|罗康锦教授获委任为香港科大工学院院长

热门文章

  1. dotnetcore Http服务器研究(一)
  2. ajax初试,获取数据
  3. 六大技巧提升员工信息安全意识
  4. 关于Kingfisher--备用
  5. jetbrick-template 1.1.0 发布,支持 #tag, #macro, layout
  6. 用lucene实现在一个(或者多个)字段中查找多个关键字
  7. 工作流表单自定义功能的误区
  8. 自动安装 Java Access Bridge 2.0.2 的批处理脚本
  9. Flex与.NET互操作(三):基于WebService的数据访问(下)
  10. Struts 中的自定义异常