基地址寄存器(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都设置为不使用。

注:原文最早发表于本人的ChinaAET博客(http://blog.chinaaet.com/justlxy/)

PCIe扫盲——基地址寄存器(BAR)详解相关推荐

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

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

  2. PCIe扫盲——128/130b编码详解

    前面的文章介绍过PCIe的Gen1和Gen2模式下,物理层使用的是8b/10b的编码.这种编码方式能够实现直流均衡,并且能将数据流中的连0连1控制在5个以内(最多5个连续的1或者0),从而可以降低物理 ...

  3. pci配置基地址_PCIe扫盲——基地址寄存器(BAR)详解

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

  4. qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7851 ...

  5. Java记录 -22- Java的基类Object详解

    Java的基类Object详解 Java的JDK文档要经常查阅使用,最好查看英文的文档. Oracle官方在线 Java API Specifications http://www.oracle.co ...

  6. moviepy音视频剪辑:视频剪辑基类VideoClip详解

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

  7. pcie读写ddr_一文详解PCIe内存空间到AXI内存空间的转换

    UltraScale系列芯片包含PCIe的Gen3 Integrated Block IP核在内的多种不同功能的IP核都会有一页设置为PCIe:BARs,设置IP核的Base address regi ...

  8. 深度学习 --- 径向基神经网络RBF详解

    上一节我们基本上打开了深度学习的大门,其实下一步应该是卷积神经网络即CNN了,但是呢卷积神经网络的最后一层采用的是径向基神经网络,为了以后到CNN不用再费力气将RBF和保持CNN的整体性和连贯性,因此 ...

  9. Android Action Bar 详解篇

    作为Android 3.0之后引入的新的对象,ActionBar可以说是一个方便快捷的导航神器.它可以作为活动的标题,突出活动的一些关键操作(如"搜索"."创建" ...

最新文章

  1. 七天学会NodeJS
  2. 【NLP】FedNLP: 首个联邦学习赋能NLP的开源框架,NLP迈向分布式新时代
  3. Linux:常用命令大全
  4. 【蓝桥杯】基础练习 数列排序
  5. shell脚本初体验
  6. SAP UI5 sap.viz.ui5.controls.VizFrame 的 aggregation 之一:dataset
  7. python3设置编码_python3 中文乱码与默认编码格式设定方法
  8. 小米MIX 4内部代号曝光:“众神之王”三季度降临
  9. linux下lsof命令,Linux lsof命令使用详解
  10. 【Deep Learning 四】课程一(Neural Networks and Deep Learning),第三周(Shallow neural networks)答案
  11. C#开发高亮语法编辑器(一)——TextBox ,RichTextBox的局限性
  12. cat 监控 java,分布式监控CAT客户端的SpringBoot集成
  13. 【老生谈算法】matlab实现模糊数学模型源码——模糊数学模型
  14. MT2601智能穿戴芯片处理器参数介绍
  15. 《大侦探皮卡丘》天龙八部在路上
  16. 来聊一聊广告主“又爱又恨”的EDM营销那档子事儿!
  17. 如何在CAD中进行修剪命令操作?
  18. 《MS17-010(永恒之蓝)—漏洞复现及防范》
  19. el-checkbox点击后面的内容不选中复选框
  20. 网络安全学习记录-13

热门文章

  1. 达州铭仁园2021年高考成绩查询,持续更新!达州各县市区中学2019年高考成绩报喜了...
  2. 猫(modem) 路由器 交换机 中继器 集线器 网桥 wifi协议和以太网协议 WAN(wide area network) LAN(local area network)
  3. Flutter版本玩Android客户端(1)——搭建主页面
  4. “中银杯”辽宁省第十九届职业院校技能大赛软件测试赛项
  5. PHP 抽象类的简单测试与总结
  6. tomcat的webapps下资源访问404
  7. 第十四周项目二成绩姓名排名
  8. 虚拟机中Linux怎么与宿主机、外网通信
  9. Coinbase为热门电子商务平台推出加密货币插件
  10. 低级格式化和高级格式化的区别是什么?