PCI、PCIE配置空间的访问(MCFG,Bus,Device,Funtion)

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

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

访问时借助in/out指令。请注意,这种方式有别于一般的in/out指令访问PCI的IO空间,它引入了地址端口和数据端口。

配置机制2#只在某些特定的主板上被使用。 新的设计应使用配置机制1#来产生配置空间的物理操作。这种机制使用了两个特定的32位I/O空间,即CF8h和CFCh。这两个空间对应于PCI桥路的两个寄存器,当桥路看到CPU在局部总线对这两个I/O空间进行双字操作时,就将该I/O操作转变为PCI总线的配置操作。寄存器CF8h用于产生配置空间的地址(CONFIG-ADDRESS),寄存器CFCh用于保存配置空间的读写数据(CONFIG-DATA)。 将要访问配置空间寄存器的总线号、设备号、功能号和寄存器号以一个双字的格式写到配置地址端口
(CF8H-CFBH),接着执行配置数据端口 (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中的数据可以对应上。

时间: 2024-11-05 19:43:02

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

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

对新手来说,第一步了解PCIE的相关基本概念,第二步了解PCIE配置空间,第三步深入研究PCIE设备枚举方式.本章主要总结第二步的PCIE配置空间 按照国际惯例,先提问题: 1. 什么是PCIE的配置空间? 2. PCIE设备的配置空间有多大?     PCI和PCIE的配置空间有何区别与联系? 3. 如何访问PCIE设备的配置空间? 4. 有几种类型,都包含什么内容? 带着上述问题,来进行该部分的总结: 什么是PCIE的配置空间? 每个PCIE设备都有自己的独立的一段配置空间,该部分空间是这个

PCI、PCIE配置空间的訪问(MCFG,Bus,Device,Funtion)

一般来说,在x86平台上,有两大类方式能够訪问这一区间的寄存器, 1,配置机制1#或者配置机制2# 訪问时借助in/out指令.请注意,这样的方式有别于一般的in/out指令訪问PCI的IO空间,它引入了地址port和数据port. 配置机制2#仅仅在某些特定的主板上被使用. 新的设计应使用配置机制1#来产生配置空间的物理操作.这样的机制使用了两个特定的32位I/O空间,即CF8h和CFCh.这两个空间相应于PCI桥路的两个寄存器,当桥路看到CPU在局部总线对这两个I/O空间进行双字操作时,就将

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

PCI总线推出以来,以其独有的特性受到众多厂商的青睐,已经成为计算机扩展总线的主流.目前,国内的许多技术人员已经具备开发PCI总线接口设备的能 力.但是PCI总线的编程技术,也就是对PCI总线设备的操作技术,一直是一件让技术人员感到头疼的事情.PCI总线编程的核心技术是对相应板卡配置空间 的理解和访问.一般软件编程人员基于对硬件设备原理的生疏,很难理解并操作配置空间,希望硬件开发人员直接告诉他们怎样操作:而PCI总线硬件开发人员虽 深刻地理解了其意义,在没有太多编程经验地前提下,也难于轻易地操作

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

目前用于访问PCIe配置空间寄存器的方法需要追溯到原始的PCI规范.为了发起PCI总线配置周期,Intel实现的PCI规范使用IO空间的CF8h和CFCh来分别作为索引和数据寄存器,这种方法可以访问所有PCI设备的255 bytes配置寄存器.Intel Chipsets目前仍然支持这种访问PCI配置空间的方法. PCIe规范在PCI规范的基础上,将配置空间扩展到4K bytes,至于为什么扩展到4K,具体可以参考PCIe规范,这些功能都需要配置空间.原来的CF8/CFC方法仍然可以访问所有PC

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

眼下用于訪问PCIe配置空间寄存器的方法须要追溯到原始的PCI规范. 为了发起PCI总线配置周期,Intel实现的PCI规范使用IO空间的CF8h和CFCh来分别作为索引和数据寄存器,这样的方法能够訪问全部PCI设备的255 bytes配置寄存器.Intel Chipsets眼下仍然支持这样的訪问PCI配置空间的方法. PCIe规范在PCI规范的基础上,将配置空间扩展到4K bytes,至于为什么扩展到4K,详细能够參考PCIe规范,这些功能都须要配置空间.原来的CF8/CFC方法仍然能够訪问全

汇编读取PCI配置空间

学习PCI:http://blog.sina.com.cn/s/articlelist_1685243084_3_1.html 1 ;------------------------------------------------ 2 ; 3 ;程序功能: 读取PCI 配置信息,存入文件zpci_config.txt 4 ; 通过端口CF8h / CFCh 来读取 5 ;运行环境: DOS + MASM5 6 ;时间: 2015/08/25 7 ; 8 ;--------------------

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

本科毕业设计是这方面的工作,所以想开几篇博客来介绍使用WDF开发PCI/PCIe接口卡的驱动程序方法. 这个系列的博客将首先用一个篇幅为不懂Windows 下PCI/PCIe驱动开发的介绍WDF和开发环境搭建,接下来几篇将直接讲述程序编写, 看完这几篇后,希望能够帮助读者了解如何通过500行左右的代码实现一个标准的PCIe接口卡驱动程序. 毕设题目的PCIe板卡是BAR0下映射两个5K的内存,偏移地址为0x20000和0x22000,源代码在: https://github.com/luluji

PCIe 基础(一)操作配置空间

PCI配置空间 PCI有三种地址空间:I/O空间,内存地址空间,PCI配置空间.在启动时bootloader 或者内核会遍历PCI总线并分配资源,如中断和内存,设备驱动程序通过PCI配置空间 找到资源分配.大小为256字节. 配置空间图: (1) Device ID和Vendor ID寄存器 这两个寄存器的值由PCISIG分配,只读.其中Vendor ID代表PCI设备的生产厂商, 而Device ID代表这个厂商所生产的具体设备.如Intel公司的基于82571EB芯片的 系列网卡,其Vend

wdmWin10下遍历PCI配置空间

图右边是引用驱动开发技术详解书中的代码:3环只增加了个死循环 驱动没变 #include <windows.h> #include <stdio.h> //使用CTL_CODE必须加入winioctl.h #include <winioctl.h> #include "Ioctls.h" DWORD In_32(HANDLE hDevice, USHORT port) { DWORD dwOutput; DWORD inputBuffer[2] =