PCI/PCIe基础——配置空间
来源:互联网 发布:黔都云商微盘看盘软件 编辑:程序博客网 时间:2024/05/22 02:26
PCI/PCIe设备有自己的独立地址空间,这部分空间会映射到整个系统的地址空间。
映射地址在BIOS/UEFI下指定(如果有的话,对于使用非BIOS启动的OS,不清楚),它有两种类型,一种是MMIO,一种是IO。对于MMIO的访问,跟访问内存的方式一样,它从称为PCIEXBAR的基地址开始,有很大的一段空间,这个PCIEXBAR的值根据不同的平台可能不同,大致可能值有0xC0000000、0xE0000000等,关于这个值是怎么使用的后面的章节会讲到;对于IO,它是一种比较老的访问PCI/PCIe设备的方式,而且占有的空间相比MMIO非常小,好像只有64K的空间。
PCI/PCIe设备使用的空间也有两个部分,一部分称为配置空间(通过MMIO);另一部分通过配置空间的BAR寄存器指定,是设备实现功能所需要用到的地址空间(有MMIO也有IO, 不过IO用的比较少了)。
PCI/PCIe配置空间的访问方式
PCI/PCIe设备的配置空间通过PCIEXBAR加上设备的Bus、Device、Fun号的转换来得到,BDF到地址的转换关系如下:
其中的Register是具体要访问的寄存器。
这是最常用的一种方式,通过将B/D/F转换成MMIO的地址,之后就可以通过MMIO的方式来访问,下面是一个例子:不过这里有个问题,通过PCI_LIB_ADDRESS得到的并不是实际的系统地址空间,它算是一个偏移,还需要加上一个基地址(就是这个通过函数GetPciExpressBaseAddress()得到的)。在UEFI中这个基地址被设置成一个PCD变量:PcdPciExpressBaseAddress。它的值根据不同平台可能会不同。不过重点不是它的值,重点是如何设置这个值,因为只有设置了这个值才能使用上面说的方式来读写PCI/PCIe配置空间。
而PCIEXBAR也是要写到PCI设备的配置空间中的,它会被写到B0/D0/F0/R060h这个寄存器(不同平台可能不同)。
这里就遇到了一个问题,该通过什么方式来写这个值呢?
实际上,需要注意几点:
1. 上述提供的访问PCI/PCIe配置空间的方式是PCIe的方式;
2. 早期在没有PCIe的时候,要访问配置空间时,使用的是两个IO端口,CFCh和CF8h,通过往一个端口指定寄存器,另一个端口写值的方式为指定寄存器赋值。
所以我们要注意,有两个配置空间的方式:
1. 传统方式,写IO端口CFCh和CF8h。只能访问PCI/PCIe设备的开始256个字节(因为PCI设备的配置空间本来就只有256个字节);
2. PCIe的方式,就是上面提到的方式,它可以方位4K个字节的配置空间。
PCI配置空间
由于PCI/PCIe设备分为Bridge和Agent两种,所以配置空间也有两种类型:
其中Agent的配置空间类型称为Type 00h:
简单介绍其中的几个寄存器的意义:
Vendor ID,Device ID:标记了一个设备的生产厂商和具体的设备,比如Intel的设备Vendor ID通常是0x8086,Device ID就需要厂家自定义了,总之能够识别到具体是哪个设备就可以了。
Status:设备状态字,具体每个BIT的意义见下图:
Command:设备状态字:
Base Address Registers:决定PCI/PCIe设备空间映射到系统空间具体位置的寄存器,映射方式有两种,分别是IO和Memory映射:
处理器系统资源分为IO资源和MMIO资源两种,因此PCI/PCIe空间地址对应也有两种。
下面是Bridge的配置空间,它的类型被称为Type 01h:
Type 01h中也有Vendor ID,Device ID,Status,Command等寄存器。
另外需要注意的是这里的BAR计算得到的系统空间是该桥下挂的所有设备的系统空间的总和。
另外Subordinate Bus Number、Secondary Bus Number和Primary Bus Number,这些寄存器共同确定了该桥上行和下行的所有Bus号。
PCIe配置空间
PCIe是在PCI基础上发展的协议,PCIe也有上述的PCI配置空间,并且在此基础之上进行了扩展,其扩展形式是通过一种称为Capability的寄存器块来完成的。
PCI配置空间的大小是256个字节,即0x00~0xFF,而PCIe的配置空间扩大到了0x00~0xFFF,下图是具体的布局。
在原来的配置空间中,有一个寄存器指定了第一个Capability的位置,而第一个Capability又指定下一个Capability,构成了一串Capability,具体如下图所示:
各个不同的Capability的作用不同,且不同的设备有不同的Capability,在这里不一一介绍了。
其它说明
处理器系统中会为所有的PCI/PCIe设备留足足够的空间,但是几乎没有系统会满配,所以很多的配置空间实际上是空的,此时如果去访问,就会得到全FF,表示设备不存在。
下面是linux下访问PCI/PCIe配置空间的一个例子:
注:以上是一个Intel网卡的PCI/PCIe配置空间,这是虚拟机下的结果,真实机器上可能有所不同。
- PCI/PCIe基础——配置空间
- PCI/PCIe基础——配置空间
- PCI/PCIe基础——配置空间
- 读取PCI/PCIE配置空间
- PCI/PCIE 配置空间导读(1)
- PCI/PCIe基础
- PCIe配置空间和PCI设备中的寄存器
- PCIe配置空间和PCI设备中的寄存器
- PCIe 基础(一)操作配置空间
- PCI Express设备驱动 (4,PCIe配置空间和PCI设备中的寄存器)
- PCI、PCIE配置空间的访问(MCFG,Bus,Device,Funtion)
- PCI/PCIe 的那些事(2)- 配置空间(Configuration Space)
- pcie的配置空间
- 计算机的组成 —— PCI(PCIE)
- PCI、PCIE
- 1.1 PCI&PCIE 配置寄存器访问
- PCIE 1: PCIE 配置空间的存取
- PCI配置空间
- 创建用户故事地图的步骤
- CSS中的圣杯布局与双飞翼布局
- 如何使用appium desktop 获取Android APP 控件的id
- 2017-10-31C#引申的一个例题——不重复抽取元素的组合
- IOS项目新手引导页图片适配方案
- PCI/PCIe基础——配置空间
- SpringBoot和PostGIS环境搭建(Hibernate4)
- InnosetUp打包配置多语言
- RSA+SHA256+BASE64对数据进行加密解密及校验
- IOS 自定义tabBar的按钮添加点击放大缩小的动画
- div之“可编辑”属性,按下“回车键”之后出现的兼容性问题的处理办法
- Apache ActiveMQ
- Android内核开发:系统启动速度优化
- Java项目打包JAR文件并运行