PCIE应用程序编程,首先就要理清PCIE BAR空间到底说的是什么。在PCIE配置空间里,0x10开始后面有6个32位的BAR寄存器,BAR寄存器中存储的数据是表示PCIE设备在PCIE地址空间中的基地址,注意这里不是表示PCIE设备内存在CPU内存中的映射地址,关于这两者的关系以及两者如何转换后面会有介绍。

1,BAR寄存器的数据格式,BAR寄存器表示的设备存储类型有memory space BAR和IO space BAR两种,

对于memory space BAR,数组格式如下面所示

31-----------------------------------4 |        3           |     2-1     |       0

16-Byte aligned Base Adress   prefetchable    Type   always 0

对于IO space BAR,数组格式如下所示

31-----------------------------------2 |      1      |     0

4-Byte Aligned Base Address    reserve   always 0

对于memory space BAR的16-Byte aligned Base Address 这里的Base Address代表的是16个byte数据的地址

对于IO space BAR的4-Byte aligned Base Address这里的BaseAddress代表的是4个byte数据的地址

2,BAR寄存器数据的初始化

BAR寄存器的数据是怎么初始化,由谁进行初始化的?因为初始化的数据是PCIE设备所在的总线域的地址空间,所以肯定不会是EP自己进行初始化,因为如果这样EP是不知道其他PCIE设备对应的总线地址空间的,所以可能会引起总线地址空间的冲突,所以BAR寄存器的初始化是由内核进行初始化的,在系统开机时,内核会遍历查找哥哥PCIE设备,然后为PCIE设备分配对应的总线地址空间。

3,BAR寄存器存储的总线地址和应用程序内存地址的关系

BAR寄存器存储的总线地址,应用程序是不能直接利用的,应用程序首先要做的就是读出BAR寄存器的值,然后用mmap函数建立应用程序内存空间和总线地址空间的映射关系。这样应用程序往PCIE设备内存读写数据的时候,直接利用PCIE设备映射到应用程序中的内存地址即可。但是应用程序的内存地址该由谁解析到PCIE设备对应的总线空间给EP呢,这个工作是由北桥或者是RC(root complex)来完成的,解析到总线地址空间之后,EP会把总线的地址空间解析成PCIE设备对应的设备内存地址。

转载:http://blog.csdn.net/buyi_shizi/article/details/51068609

最新文章

  1. vue.js的一些知识点
  2. eclipse构建maven的web项目
  3. Qt 学习笔记 TreeWidget 增删改
  4. Java基础-数据类型int,short,char,long,float,double,boolean,byte
  5. 将Nagios监控信息存入Mysql
  6. 【转】java获取当前路径的几种方法
  7. python 中对list做减法操作
  8. eclipse php 开发环境配置
  9. Jps介绍以及解决jps无法查看某个已经启动的java进程问题【盗用】
  10. android 上传文件
  11. 读书笔记-《Maven实战》-2018/4/16
  12. lucene创建索引
  13. vue学习之template标签
  14. Ruby语法基础(一)
  15. Thrift-0.10.0 CenOS 7 编译错误 error: expected ')' before 'PRIu32'
  16. hbase记录-修改压缩格式
  17. Docker 以 docker 方式运行 jenkins
  18. awk的基本使用方法
  19. 理解域名插槽:slot-scope
  20. windows 下git 的配置安装与使用

热门文章

  1. HDU 1199 && ZOJ 2301 线段树离散化
  2. jansson的使用
  3. Appium Python 六:管理应用和Activity
  4. 谷歌地图api訪问失败
  5. 算法笔记_185:历届试题 格子刷油漆(Java)
  6. 解决 jquery.form.js和springMVC上传 MultipartFile取不到信息
  7. SIT与UAT的分别
  8. HDU 5402 Travelling Salesman Problem(棋盘染色 构造 多校啊)
  9. SET GLOBAL FOREIGN_KEY_CHECKS取消外键约束
  10. Linux RAID5+备份盘测试