https://www.cnblogs.com/zszmhd/archive/2012/05/08/2490105.html

PCI设备(PCI device)都有一个配置空间,大小为256字节,实际上是一组连续的寄存器,位于设备上。其中头部64字节是PCI标准规定的,格式如下:

剩余的部分是PCI设备自定义的。

PCI配置空间头部有6个BAR(Base Address Registers),BAR记录了设备所需要的地址空间的类型(memory space或者I/O space),基址以及其他属性。BAR的格式如下:

可以看出,设备可以申请两类地址空间,memory space和I/O space,它们用BAR的最后一位区别开来。

说到地址空间,计算机系统中,除了我们常说的memory address(包括逻辑地址、虚拟地址(线性地址)、CPU地址(物理地址)),还有I/O address,这是为了访问I/O设备(主要是设备中的寄存器)而设立的,大部分体系结构中,memory address和I/O address都是分别编址的,且使用不同的寻址指令,构成了两套地址空间,也有少数体系结构将memory address和I/O address统一编址(如ARM)。

有两套地址空间并不意味着计算机系统中需要两套地址总线,实际上,memory address和I/O address是共用一套地址总线,但通过控制总线上的信号区别当前地址总线上的地址是memory address还是I/O address。北桥芯片(Northbridge,Intel称其Memory Controller Hub,MCH)负责地址的路由工作,它内部有一张address map,记录了memory address,I/O address的映射信息,一个典型的address map如图:

我们来看北桥是如何进行地址路由的。根据控制总线上的信号,北桥首先可以识别地址属于memory space还是I/O space,然后分别做处理。

比如若是memory space,则根据address map找出目标设备(DRAM或Memory Mapped I/O),若是DRAM或VGA,则转换地址然后发送给内存控制器或VGA控制器,若是其它I/O设备,则发送给南桥。

若是I/O space,则发送给南桥(Southbridge,Intel称其I/O Controller Hub,ICH),南桥负责解析出目标设备的bus, device, function号,并发送信息给它。

PCI设备会向计算机系统申请很多资源,比如memory space, I/O space, 中断请求号等,相当于在计算机系统中占位,使得计算机系统认识自己。

PCI设备可以通过两种方式将自己的I/O存储器(Registers/RAM/ROM)暴露给CPU:

在memory space申请地址空间,或者在I/O space申请地址空间。

这样,PCI设备的I/O存储器就分别被映射到CPU-relative memory space和CPU-relative I/O space,使得驱动以及操作系统得以正常访问PCI设备。对于没有独立I/O space的体系结构(如ARM),memory space和I/O space是统一编址的,也就是说memory space与I/O space等价了,这时,即使PCI设备在BAR表明了要申请I/O space,实际上也是分配在memory space的,所以驱动无法使用I/O端口指令访问I/O,只能使用访存指令。在Windows驱动开发中,PCM_PARTIAL_RESOURCE_DESCRIPTOR记录了为PCI设备分配的硬件资源,可能有CmResourceTypePort, CmResourceTypeMemory等,后者表示一段memory地址空间,顾名思义,是通过memory space访问的,前者表示一段I/O地址空间,但其flag有CM_RESOURCE_PORT_MEMORY和CM_RESOURCE_PORT_IO两种,分别表示通过memory space访问以及通过I/O space访问,这就是PCI请求与实际分配的差异,在x86下,CmResourceTypePort的flag都是CM_RESOURCE_PORT_IO,即表明PCI设备请求的是I/O地址空间,分配的也是I/O地址空间,而在ARM或Alpha等下,flag是CM_RESOURCE_PORT_MEMORY,表明即使PCI请求的I/O地址空间,但分配在了memory space,我们需要通过memory space访问I/O设备(通过MmMapIoSpace映射物理地址空间到虚拟地址空间,当然,是内核的虚拟地址空间,这样驱动就可以正常访问设备了)。

为了为PCI设备分配CPU-relative space,计算机系统需要知道其所申请的地址空间的类型、基址等,这些信息记录在设备的BAR中,每个PCI配置空间拥有6个BAR,因此每个PCI设备最多能映射6段地址空间(实际很多设备用不了这么多)。PCI配置空间的初始值是由厂商预设在设备中的,于是设备需要哪些地址空间都是其自己定的,可能造成不同的PCI设备所映射的地址空间冲突,因此在PCI设备枚举(也叫总线枚举,由BIOS或者OS在启动时完成)的过程中,会重新为其分配地址空间,然后写入PCI配置空间中。

通过memory space访问设备I/O的方式称为memory mapped I/O,即MMIO,这种情况下,CPU直接使用普通访存指令即可访问设备I/O。

通过I/O space访问设备I/O的方式称为port I/O,或者port mapped I/O,这种情况下CPU需要使用专门的I/O指令如IN/OUT访问I/O端口。

常见的MMIO例子有,VGA card将framebuffer映射到memory space,NIC将自己的片上缓冲映射到memory space,实际上,最典型的MMIO应该是DRAM,它将自己的存储空间映射到memory space,是占用CPU地址空间最多的“设备”。

PCI配置空间(PCI Configuration Space)相关推荐

  1. [转]PCI配置空间简介

    PCI配置空间简介  作者:敏行 PCI有三个相互独立的物理地址空间: 设备存储器地址空间. I/O地址空间和 配置空间. 配置空间是PCI所特有的一个物理空间.由于PCI支持设备即插即用,所以PCI ...

  2. linux 写pci配置空间,[转载]应用程序中pci配置空间读写

    应用程序中pci配置空间读写 ~~~~~~~~~~~~~~~~~~~~~~~ 1. 概述 主要讲述在linux操作系统中应用程序如何读写pci配置空间. 2. 基本原理 对于pci设备,由cpu通过一 ...

  3. 构型空间(Configuration Space)(下)

    第三章 Configuration Space(下) 由于格式问题,文章内容以图片形式上传:如果喜欢本文的朋友可以去github上下载PDF版本. 第3章 Configuration Space(下) ...

  4. pci配置基地址_PCI配置空间简介

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

  5. 初学 PCIe System (一) - PCIe介绍及其配置空间

    第二部分在:初学 PCIe System (二) - 如何访问PCIe设备的配置空间 PCI Express 介绍 PCI Express (PCIe) 属于第三代的高效能 I/O 汇流排,PCIe ...

  6. PCI设备与PCI桥的配置空间

    PCI配置空间 HOST主桥通过配置读写事务报文访问设备的配置空间,PCI总线规定了三种类型的PCI配置空间.配置空间中出现的地址都是PCI总线域的地址. (1)Agent设备配置空间 (2)Brid ...

  7. PCIe配置空间和PCI设备中的寄存器

    1.访问PCI配置空间,PCI基本配置空间的读写使用下列函数: 原型定义在<linux/pci.h> int pci_read_config_byte(struct pci_dev *pd ...

  8. pci配置基地址_PCI/PCIe基础——配置空间

    简介 PCI/PCIe设备有自己的独立地址空间,这部分空间会映射到整个系统的地址空间. 映射地址在BIOS/UEFI下指定(如果有的话,对于使用非BIOS启动的OS,不清楚),它有两种类型,一种是MM ...

  9. PowerPC下PCI、PCI-E设备的配置空间

    PCI总线规定访问配置空间的总线事务,称为配置读写事务.不同于存储访问事务使用存储地址访问,而是使用ID号来寻址访问PCI配置空间. PCI设备的ID号由总线号(BUS NUMBER).设备号(DEV ...

最新文章

  1. java内存块_JVM上的并发和Java内存模型之同步块笔记
  2. ASP.NET MVC Model绑定(四)
  3. nginx全部下载地址
  4. 【CCL】连通区域提取
  5. first level cache check - User parameter /UI2/CACHE_DISABLE
  6. Eclipse Web开发出现莫名其妙错误
  7. 1. DFT 入门篇-scan chain
  8. bzoj 2216: [Poi2011]Lightning Conductor(DP决策单调性)
  9. Python-计量经济学案例
  10. 如何使用IIS发布网站?
  11. 让你的工作变轻松的一套免费的 iPhone 手势图标
  12. 计算机函数公式发生额总计,Excel使用SUMIF函数统计各部门的奖金总额
  13. 【echarts高级用法】在地理坐标系中镶嵌柱状图,在加上时间轴让图动起来
  14. 第三章 CSS 选择器的命名
  15. Redis 互联网开发必看
  16. 【集成学习系列教程5】LightGBM
  17. 【电脑使用】美化你的Windows
  18. sql 查询 like '%_1%' 的坑
  19. 带MPPT的同步降压电路的设计-开题报告
  20. 四种常见的浏览器内核简介----JS城市选择控件

热门文章

  1. 1 个月吐血准备,我吃透了300道Java大厂面试题,这次绝对稳了!
  2. 基于手机支付方式的电子商务网站
  3. mybatis内用大于号小于号
  4. Latex入门教程用法笔记(结尾附完整示例)
  5. UnityRectTranform属性设置方法
  6. 双击桌面上的IE图标却提示找不到文件iexplore.com的解决办法
  7. 软件质量与测试--第二周作业 WordCount
  8. CentOS系统中如何搭建NTP时间服务器(时间同步)
  9. Eureka集群启动报错It seems to be a socket read timeout exception
  10. 【PCB开源分享】STC32G12K128/STC8H8K64U开发板