PCI BAR设置过程
最近因为工作需要用到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设置过程相关推荐
- 记一次由PCI BAR配置不正确引发的硬盘IO调度io_schedule阻塞的经历
五一前,接到一个bug,大意是说设备接固态硬盘时跑新内核会出现卡死导致WDT复位,使用旧内核没问题.新内核是去年年底别人编译的,旧内核是3年前现在已离职2年的人编译的,现在安排我解决这个问题.但其时正 ...
- PCI总线---PCI设备扫描过程
8.2 PCI设备扫描过程 Linux内核具备多种PCI的扫描方式,它们之间大同小异. 本节使用传统的扫描方式 执行 pci_legacy_init函数,定义在legacy.c 文件中 : stati ...
- 火狐、chrome浏览器过滤网页广告设置过程
火狐.chrome浏览器过滤百度广告设置 一.火狐浏览器设置过程(推荐) 1.火狐浏览器访问about:addons,即附加组件页: 2.左侧点击"获取附加组件",变换到获取组件页 ...
- 硕士论文格式设置过程
格式设置过程: 1. 写论文结构,章节分好:封面,目录,摘要,正文顺序放好,分好节,字体,行距,段前段后设置: 2. 添加页眉页脚,正文页眉页脚都取消链接到前一条页眉: 3. 设置奇偶页不同,正文此时 ...
- 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 ...
- DM368开发 --IPNC 设置过程
参看:Appro DM36x IPNC 4.0 开发环境配置 第一步: IPNC 安装: 安装软件包,解压后包含以下组件: 1. IPNC_RDK_DM36x_Version3.1.0.tar.gz: ...
- python连接oracle超时设置,Python连接Oracle设置过程记录
环境: Python 3 64位 Oracle 12c 64位 Oracle Instant Client 64位 Windows 10 64位 过程: 1.下载安装Oracle instant cl ...
- 如何关闭rsyslog服务?_Linux日志服务器设置过程
我们知道,使用"@IP:端口"或"@@IP:端口"的格式可以把日志发送到远程主机上,那么这么做有什么意义吗?假设我需要管理几十台服务器,那么我每天的重要工作就是 ...
- 联想小新+Windows10+Ubuntu18.04双系统安装+引导设置过程全记录
写在前面 双系统安装 配置 主要过程 引导设置 主要参考 Ubuntu卸载 需要的工具 具体步骤 情况一 情况二 主要参考 后记 2020.5.29更新 关于卸载 关于主题的配置 写在前面 又是折腾的 ...
最新文章
- 将调用密集型的 COM 组件迁移到托管代码
- 小程序获取用户的操作轨迹日志
- Science:又一明星菌群可以调控肠道免疫?
- 使用Helm 在容器服务k8s集群一键部署wordpress
- STM32如何从串口接收数据,取出数据中的密码段再保存到flash中。
- lower_bound和upper_bound算法
- asp.net ViewState详解
- android layout(l, t, r, b);,服务器里的a,t,l,r,b是什么意思? Android编程中关于layout(l,t,r,b)函数的问题...
- 贪心——今年暑假不AC(hdu2037)
- 孩子们的游戏(圆圈中最后剩下的数)
- snort简介以及在Ubuntu下的安装
- 系统简单的UIImagePickerController
- Java Bitwise Operators
- paip.python错误解决19
- python 清华镜像_树莓派raspberry4B入坑指南 part-1 virtualenv安装python
- C盘爆满原来是腾讯电脑管家惹的祸
- 怎样使用 iOS 7 的 AVSpeechSynthesizer 制作有声书(1)
- 游戏音效制作初学者的福音—入门级软件介绍
- 03 【Nginx虚拟主机和域名解析】
- 电脑微信语音通话听不到对方声音或无法播放消息语音
热门文章
- 智能车百度赛道培训第一弹-基础篇
- 直播预告 | 全国大学生智能汽车竞赛全向行进组——基础培训
- python有哪些软件包用来考察变量之间的相关性_Python计算数据相关系数(person、Kendall、spearman)...
- php iis mysql windows2003,Windows Server 2003 IIS6.0+PHP5(FastCGI)+MySQL5环境搭建教程 | 系统运维...
- matlab单元刚度矩阵整合成整刚,求结构总刚矩阵Matlab源代码
- 青岛大学计算机专硕和学硕,【2020】【青岛大学】【学硕646】复习经验
- Verilog中的逻辑运算符与按位运算符的区分
- 【 Verilog HDL 】循环语句总结
- 矩阵的三角分解(LU)法(高斯消去法的矩阵形式分析)
- 语音网关上AA的配置解析