一般来说,在x86平台上,有两大类方式能够訪问这一区间的寄存器,
 

1,配置机制1#或者配置机制2#

 
訪问时借助in/out指令。请注意,这样的方式有别于一般的in/out指令訪问PCI的IO空间,它引入了地址port和数据port。
 
配置机制2#仅仅在某些特定的主板上被使用。 新的设计应使用配置机制1#来产生配置空间的物理操作。这样的机制使用了两个特定的32位I/O空间,即CF8h和CFCh。这两个空间相应于PCI桥路的两个寄存器,当桥路看到CPU在局部总线对这两个I/O空间进行双字操作时,就将该I/O操作转变为PCI总线的配置操作。寄存器CF8h用于产生配置空间的地址(CONFIG-ADDRESS),寄存器CFCh用于保存配置空间的读写数据(CONFIG-DATA)。 将要訪问配置空间寄存器的总线号、设备号、功能号和寄存器号以一个双字的格式写到配置地址port
(CF8H-CFBH),接着运行配置数据port (CFCH)的读和写,向配置数据口写数据即向配置空间写数据,从配置数据口读数据即从配置空间读数据。
 

2, 内存映射

 
訪问时借助mov指令,就如訪问常规的物理内存一样。
 
PCI配置空间的寄存器被编址到系统的物理内存空间,在支持ACPI规范x86系统上,操作系统通过读MCFG表获得系统中全部设备PCI配置空间的基地址。操作系统在引导时,枚举PCI设备,从而知道每一个PCI设备的Bus,
Device, Function号。有了BDF这三个编号,加上从MCFG中得到的基地址,就能够计算出给定设备的PCI配置空间在物理内存空间的地址。
那么,x86上,这两种訪问方式的用途和差别在哪里呢?
  • 首先,配置机制#1仅仅能訪问[0-255]偏移之间的寄存器,也就是标准的PCI配置空间的寄存器。对于扩展PCI配置空间的寄存器[256-4095],仅仅能使用内存映射方式訪问。
  • 其次,配置机制#1一般用于操作系统引导时枚举PCI设备阶段,此时系统尝试在BDF的编址空间内对每一个可能的BDF来读取PCI配置空间的寄存器,当能成功读取,则觉得设备存在,当返回全1的错误码,则觉得改设备不存在。显然,内存映射方式是无法在此阶段使用的,由于你能够用配置机制#1来訪问不正确应实际物理设备的BDF,由于这时最坏情况是得到全1的错误码。但用内存映射方式这样做时,訪问不存在的物理地址会产生一个异常。
  • 最后,某些legacy的PCI设备或者桥片本身就不支持内存映射方式,所以此时配置机制#1是訪问PCI配置空间的唯一选择。
通过RW软件能够读取MCFG的基地址:

图1

同一时候我们也能够看到B0D2F0的寄存器的值:

图2
然后,通过基地址F8000000和B0D2F0,依照PCIE cofigration space地址规范,能够得到地址为F8010000,我们能够通过Dumphys软件读出来改物理地址的值:


图3
读取的值为07 04 90 00,跟图2中的数据能够相应上。

PCI、PCIE配置空间的訪问(MCFG,Bus,Device,Funtion)的更多相关文章

  1. Linux PCI/PCI-E设备配置空间读取与修改

    Linux PCI/PCI-E设备配置空间读取与修改 1 前言 PCI和PCI Express,是计算机常使用的一种高速总线.操作系统中的PCI/PCI-E设备驱动以及操作系统内核,都需要访问PCI及 ...

  2. 【PCIE-2】---PCIE配置空间及访问方式简介

    对新手来说,第一步了解PCIE的相关基本概念,第二步了解PCIE配置空间,第三步深入研究PCIE设备枚举方式.本章主要总结第二步的PCIE配置空间 按照国际惯例,先提问题: 1. 什么是PCIE的配置 ...

  3. [转载]PCI/PCIe基础——配置空间

    转载地址:http://blog.csdn.net/jiangwei0512/article/details/51603525 PCI/PCIe设备有自己的独立地址空间,这部分空间会映射到整个系统的地 ...

  4. 怎样訪问pcie整个4k的配置空间

    眼下用于訪问PCIe配置空间寄存器的方法须要追溯到原始的PCI规范. 为了发起PCI总线配置周期,Intel实现的PCI规范使用IO空间的CF8h和CFCh来分别作为索引和数据寄存器,这样的方法能够訪 ...

  5. 2.3 PCI桥与PCI设备的配置空间

    PCI设备都有独立的配置空间,HOST主桥通过配置读写总线事务访问这段空间.PCI总线规定了三种类型的PCI配置空间,分别是PCI Agent设备使用的配置空间,PCI桥使用的配置空间和Cardbus ...

  6. PCIe设备的配置空间

    关于PCI设备的配置空间网上已经有很多资料了,如下图就是PCI设备必须支持的64个字节的配置空间,范围为0x00-0x3f. 很多PCI设备仅仅支持者64字节的配置空间.PCI和PCIe配置空间的区别 ...

  7. 如何访问pcie整个4k的配置空间

    目前用于访问PCIe配置空间寄存器的方法需要追溯到原始的PCI规范.为了发起PCI总线配置周期,Intel实现的PCI规范使用IO空间的CF8h和CFCh来分别作为索引和数据寄存器,这种方法可以访问所 ...

  8. 基于WDF的PCI/PCIe接口卡Windows驱动程序(1)-WDF概述及开发环境搭建

    原文出处:http://www.cnblogs.com/jacklu/p/4619110.html 本科毕业设计是这方面的工作,所以想开几篇博客来介绍使用WDF开发PCI/PCIe接口卡的驱动程序方法 ...

  9. linux驱动---用I/O命令访问PCI总线设备配置空间

    PCI总线推出以来,以其独有的特性受到众多厂商的青睐,已经成为计算机扩展总线的主流.目前,国内的许多技术人员已经具备开发PCI总线接口设备的能 力.但是PCI总线的编程技术,也就是对PCI总线设备的操 ...

随机推荐

  1. IOS消息推送情况总结

      App没有启动的时候,接受到了消息通知.这个时候操作系统会按默认方式来展示一个alert,在App Icon上标记一个数字 .当程序处于关闭状态收到推送消息时,点击图标或消息栏会调用 - (BOO ...

  2. 【Struts2】新建一个Struts2工程,初步体验MVC

    实现目标 地址栏输入http://localhost:88/Struts2HelloWorld/helloworld.jsp 输入用户名,交由http://localhost:88/Struts2He ...

  3. freemarker书写select组件错误摘要(七)

    1.错误叙述性说明 六月 26, 2014 11:26:27 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严重: Template p ...

  4. Android应用程序内部启动Activity过程(startActivity)的源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6703247 上文介绍了Android应用程序的 ...

  5. codevs1009

    题目地址:http://codevs.cn/problem/1009/ 分析: [TAG]FLOYD,乘法原理,高精度 [构思] 求可变换数的个数,那么就是组合数学的内容,四个原理的应用: 假如能知道 ...

  6. 引用System.Runtime.Serialization.Json

    vs2012下,重新添加一次System.Runtime.Serialization的引用

  7. dtree基础

    最近用到了dtree来建立树,纠结过好久后,终于有了些门道,下面的总结希望对咪咪们有些帮助: dtree用来建立静态树或者动态树都是很方便的,老外给提供了整个的JS,然后我们只是操心这个树中存放的元素 ...

  8. asp.net UpdatePanel 不能局部刷新问题汇总

    1.web.config 配置问题.   关于web.config的配置方面网上有很多资料参考,按照其方法做即可实现. 2.网站 Framework 版本变化造成不能局部刷新问题    版本更新时,会 ...

  9. @synthesize

    @synthesize 相当于把属性当成成员变量来用,不用再写self.属性@synthesize myButton; 这样写了之后,那么编译器会自动生成myButton的实例变量,以及相应的gett ...

  10. iOS之本地推送(前台模式与后台模式)

    #import "AppDelegate.h" #import "GlobalDefine.h" @interface AppDelegate () @end ...