最近因为工作需要用到pci设备的BAR内容,之前看了没深刻印象,这里整理一下。

PCI设备有很好的可配置型和易操作性,这很大方面要归功于其地址空间的可动态分配的特性。而动态分配地址空间就是依赖于BAR(base address register)实现的。

BAR是PCI配置空间中从0x10 到 0x24的6个register,用来定义PCI需要的配置空间大小以及配置PCI设备占用的地址空间。

每个PCI设备在BAR中描述自己需要占用多少地址空间,bios通过所有设备的这些信息构建一张address map,描述系统中资源的分配情况,然后在合理的将地址空间配置给每个PCI设备。这里主要分为几个部分描述:

1. PCI设备占用的地址空间大小:

这个是根据PCI设备的需求而不同的,这个映射空间不同于配置空间,一般想网卡等设备占用较大的地址空间,而一些串口等设备占用较少的地址空间,而我们知道X86中地址空间又MEM和IO两类,因此PCI 的BAR在bit0来表示该设备是映射到memory还是IO,bar的bit0是readonly的,也就是说,设备寄存器是映射到memory还是IO是由设备制造商决定的,其他人无法修改。

下图是BAR寄存器的结构:


bit0:表示设备寄存器是映射到memory(0)还是IO(1)空间。

bit1:  reserved 0

bit2: 在base adress register for Memory 中0表示32位地址空间,1表示64位地址空间。

bit3:在memory BAR中用来表示该设备是否允许prefetch,1表示可以预取,0表示不可以预区。

其余的bit用来表示设备需要占用的地址空间大小。

BAR通过将某些位设置为只读,且0来表示需要的地址空间大小,比如一个PCI设备需要占用1MB的地址空间,那么这个BAR就需要实现高12bit是可读写的,而20-4bit是只读且位0。地址空间大小的计算方法如下:

a.向BAR寄存器写全1

b.读回寄存器里面的值,然后clear 上图中特殊编码的值,(IO 中bit0,bit1, memory中bit0-3)。

c.对读回来的值去反,加一就得到了该设备需要占用的地址内存空间。

BIOS将系统中所有的PCI设备需要的地址空间大小读出来,然后计算得到一张address map。

bios可以为设备预留大于BAR要求的地址空间,而PCI规范中建议为需要的地址空间少于4KB的设备分配4KB的地址空间。

映射到IO空间的设备每个BAR不能占用大于256byte,在X86系统中IO编址是16位的,此时BAR中的高16bit需要hardware to zero。

2. memory address map构造完成以后需要为设备分配地址空间,此时就是把分配给设备的起始地址写入BAR寄存器即可。

比如上面位一个设备分配1MB的空间,在0xff000000(4GB-16MB)的位置,那么就把0xff000000写入BAR即可。

我们发现PCI这种地址自然地要求位设备分配的地址空间要跟BAR定义的大小对齐,因此PCI设备的映射空间始终是跟BAR的大小对齐的。

PCI BAR设置过程相关推荐

  1. 记一次由PCI BAR配置不正确引发的硬盘IO调度io_schedule阻塞的经历

    五一前,接到一个bug,大意是说设备接固态硬盘时跑新内核会出现卡死导致WDT复位,使用旧内核没问题.新内核是去年年底别人编译的,旧内核是3年前现在已离职2年的人编译的,现在安排我解决这个问题.但其时正 ...

  2. PCI总线---PCI设备扫描过程

    8.2 PCI设备扫描过程 Linux内核具备多种PCI的扫描方式,它们之间大同小异. 本节使用传统的扫描方式 执行 pci_legacy_init函数,定义在legacy.c 文件中 : stati ...

  3. 火狐、chrome浏览器过滤网页广告设置过程

    火狐.chrome浏览器过滤百度广告设置 一.火狐浏览器设置过程(推荐) 1.火狐浏览器访问about:addons,即附加组件页: 2.左侧点击"获取附加组件",变换到获取组件页 ...

  4. 硕士论文格式设置过程

    格式设置过程: 1. 写论文结构,章节分好:封面,目录,摘要,正文顺序放好,分好节,字体,行距,段前段后设置: 2. 添加页眉页脚,正文页眉页脚都取消链接到前一条页眉: 3. 设置奇偶页不同,正文此时 ...

  5. Linux源码阅读——PCI总线驱动代码(三)PCI设备枚举过程

    目录 前言 1.枚举过程 1.1 acpi_pci_root_add 1.2 pci_acpi_scan_root(枚举开始) 1.3 acpi_pci_root_create 1.4 pci_sca ...

  6. DM368开发 --IPNC 设置过程

    参看:Appro DM36x IPNC 4.0 开发环境配置 第一步: IPNC 安装: 安装软件包,解压后包含以下组件: 1. IPNC_RDK_DM36x_Version3.1.0.tar.gz: ...

  7. python连接oracle超时设置,Python连接Oracle设置过程记录

    环境: Python 3 64位 Oracle 12c 64位 Oracle Instant Client 64位 Windows 10 64位 过程: 1.下载安装Oracle instant cl ...

  8. 如何关闭rsyslog服务?_Linux日志服务器设置过程

    我们知道,使用"@IP:端口"或"@@IP:端口"的格式可以把日志发送到远程主机上,那么这么做有什么意义吗?假设我需要管理几十台服务器,那么我每天的重要工作就是 ...

  9. 联想小新+Windows10+Ubuntu18.04双系统安装+引导设置过程全记录

    写在前面 双系统安装 配置 主要过程 引导设置 主要参考 Ubuntu卸载 需要的工具 具体步骤 情况一 情况二 主要参考 后记 2020.5.29更新 关于卸载 关于主题的配置 写在前面 又是折腾的 ...

最新文章

  1. 将调用密集型的 COM 组件迁移到托管代码
  2. 小程序获取用户的操作轨迹日志
  3. Science:又一明星菌群可以调控肠道免疫?
  4. 使用Helm 在容器服务k8s集群一键部署wordpress
  5. STM32如何从串口接收数据,取出数据中的密码段再保存到flash中。
  6. lower_bound和upper_bound算法
  7. asp.net ViewState详解
  8. android layout(l, t, r, b);,服务器里的a,t,l,r,b是什么意思? Android编程中关于layout(l,t,r,b)函数的问题...
  9. 贪心——今年暑假不AC(hdu2037)
  10. 孩子们的游戏(圆圈中最后剩下的数)
  11. snort简介以及在Ubuntu下的安装
  12. 系统简单的UIImagePickerController
  13. Java Bitwise Operators
  14. paip.python错误解决19
  15. python 清华镜像_树莓派raspberry4B入坑指南 part-1 virtualenv安装python
  16. C盘爆满原来是腾讯电脑管家惹的祸
  17. 怎样使用 iOS 7 的 AVSpeechSynthesizer 制作有声书(1)
  18. 游戏音效制作初学者的福音—入门级软件介绍
  19. 03 【Nginx虚拟主机和域名解析】
  20. 电脑微信语音通话听不到对方声音或无法播放消息语音

热门文章

  1. 智能车百度赛道培训第一弹-基础篇
  2. 直播预告 | 全国大学生智能汽车竞赛全向行进组——基础培训
  3. python有哪些软件包用来考察变量之间的相关性_Python计算数据相关系数(person、Kendall、spearman)...
  4. php iis mysql windows2003,Windows Server 2003 IIS6.0+PHP5(FastCGI)+MySQL5环境搭建教程 | 系统运维...
  5. matlab单元刚度矩阵整合成整刚,求结构总刚矩阵Matlab源代码
  6. 青岛大学计算机专硕和学硕,【2020】【青岛大学】【学硕646】复习经验
  7. Verilog中的逻辑运算符与按位运算符的区分
  8. 【 Verilog HDL 】循环语句总结
  9. 矩阵的三角分解(LU)法(高斯消去法的矩阵形式分析)
  10. 语音网关上AA的配置解析