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

摘要:
3.如何访问PCIE设备的配置空间?当CPU访问该内存空间时,它访问该设备的配置空间。PCIE设备的配置空间有多大?系统为每个PCI设备分配的内存仅为256字节。PCIE设备的配置空间扩展到4K字节。256M内存空间是为PCIE设备准备的空间。系统不可用。每个设备的配置空间的前256个字节是PCI空间。PCI/PCIE设备配置空间的访问方式为IO访问;

  对新手来说,第一步了解PCIE的相关基本概念,第二步了解PCIE配置空间,第三步深入研究PCIE设备枚举方式。本章主要总结第二步的PCIE配置空间

按照国际惯例,先提问题:

1. 什么是PCIE的配置空间?

2. PCIE设备的配置空间有多大?     PCI和PCIE的配置空间有何区别与联系?

3. 如何访问PCIE设备的配置空间?

4. 有几种类型,都包含什么内容?

带着上述问题,来进行该部分的总结:

什么是PCIE的配置空间?

  每个PCIE设备都有自己的独立的一段配置空间,该部分空间是这个设备的(可能是一段e2prom),系统会给这个设备分配一段内存空间,CPU访问这段内存空间即访问对此设备的配置空间。设备在出厂时,配置空间是有默认初始值的。

PCIE设备的配置空间有多大? PCI和PCIE的配置空间有何区别联系?

  早期的PCI时期,系统为每个PCI设备分配的内存大小仅有256个Bytes。到后来的PCIE时期,随着设备性能增强,PCIE设备的配置空间扩展至4K个Bytes。在这里需要注意:

  PCIE一共支持256条Bus,32个Dev,8个Fun。因此在满负载的情况下,共需内存大小 = 4k * 256 *32*8 = 256K Bytes = 256M,这个256M的内存空间是为PCIE设备准备的空间系统不可用,这也是你的内存条实际可用的总是会小于标称的主要原因之一。

  PCIE设备发展向前兼容PCI,每个设备的配置空间的前256个Byte是PCI空间,后(4k-256)个Byte的空间是PCIE扩展空间,这是二者的主要区别,另外一个区别就要引出下面的一个问题:

PCI/PCIE设备配置空间的访问方式----IO访问  &  内存访问

  X86系统中,对PCIE设备配置空间的地址映射一般有两种方式:内存映射和IO映射。因此开发者也可以通过内存访问或者IO访问来访问其配置空间

  PCIE设备的访问离不开其Bus,Dev,Fun的编号方式,如下图寄存器所示,Bit[23:16]用来存放Bus号,共8Bit,因此解释了上述表述为何一共有256条Bus,Bit[15:11]存放Dev,共5bit可存32个Dev,Bit[10:8]存放Bus,共3Bit可存8个Fun。这也就也是了为何上述PCIE设备数一共是256个Bus,32个Dev和8个Fun

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

   无论是采用IO还是内存的方式来访问配置空间,都离不开上面的图,下面具体介绍:  

1. IO访问

  IO应该是Intel X86架构的独有产物了,简单可理解为一段存储空间,用户通过IN/OUT指令来访问(内存的话,需要用MOVE指令来进行访问),部分设备可以映射到IO空间中,开发者通过IO端口访问这个设备,比如现在介绍的这个:通过CF8 / CFC端口。用户可通过这组端口来对PCIE的前256个Byte进行访问,一个指定地址,一个指定数据。代码如下:

1 /*Access PCI Config Space in IO method*/
2 Address = BIT31|((BUS & 0XFF)<< 16)|((DEV & 0x1F)<<11)|((Fun & 0x7) << 8);
3 IoWrite32(0xCF8, address); //将要读取的地址写入到CF8
4 Date32 = IoRead32(0xcfc); //从CFC端口读出address的数据

  注: IO访问仅能读取到前256个Byte,256Byte后的空间需要用内存访问

2. 内存访问

  这个其实与IO访问大同小异,配置空间全部映射到内存中,用户在确定设备地址后,即可通过内存读写的方式进行访问,如下代码:

1 /*Write date*/
2 MmioWrite32(PcieBaseAdd + Bus<<16 + Dev<<11 + Fun<<8 + offset, date); //PcieBaseAdd为PCIE在内存中的基地址
3 
4 /*Read date*/ 
5 Value = MmioRead32(PcieBaseAdd + Bus<<16 + Dev<<11 + Fun<<8 + offset);

PCIE配置空间集中类型,都包含什么内容

  配置空间主要有两种,开发者也是搞清楚这两种即可,一是Type0:设备空间     二是Type1: Bridge空间

  桥设备空间如下图所示:下面介绍其中主要内容以及作用:(端点设备空间布局与Bridge空间类似,会简单一些,没有一堆Bus Num设备寄存器,CPU一般通过判断Header确定该设备是什么设备)

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

  DID&VID:    设备及厂商ID,出场固定且每个设备都不应,枚举设备时通常判断此VID来判断设备是否存在。

  Class Code: 该寄存器是只读的,通常用来表示该设备类型。用法如下:

    ClassClde Register共3个byte,位于配置空间的[0A:08],分别表示BaseClass, Sub-Class, InterFace

    举个简单的例子--使用RW工具查看笔者自己笔记本的Pcie Memory设备的Config空间,如下图:

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

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

    可以看到该设备的ClassCode Register的值是0x058000,对照PCIE Spec查看,可以看到:

      Add[0A] = 05

      Add[09] = 80

      Add[08] = 00

    05表明该设备是一个Memory的Controller,具体内存子类是其他类型,不属于RAM&Flash,如下图:

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

     而Add[08]表示该设备不同的接口,含有多种接口的才会表示出来,如下显示设备的会含有不同的Interface:

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

  HeaderType: 标明Config空间的类型,同时也标明了Config空间的layout,共有三种:00H--普通端点设备,01H--Bridge设备,02H--CardBus bridges(此外,若该寄存器的Bit7为0.则表明该设备是一个单功能设备 )

  BAR0 & BAR1: 设备空间的基地址

  Subordinate Bus Number: 从属Bus号,即该Bus下最大的Bus号。

  Secondary Bus Number: 该Bridge下接的Bus号

  Primary Bus Number:     该Bridge上接的Bus号

  Memory Limit:   此设备所分配的内存大小?

  Memroy Base:  此设备在内从中分配的基地址?


  

  

免责声明:文章转载自《【PCIE-2】---PCIE配置空间及访问方式简介》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇冗余代码都走开——前端模块打包利器 Rollup.js 入门安全计算环境(三)Linux服务器2下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

SAP内存、ABAP内存

在编写程序的过程中不同的程序之间经常需要相互传值,SET / GET PAREMETER 和 IMPORT / EXPORT是SAP提供的两种方式。前者的值是放在SAP内存,后者是放在ABAP内存。这两种内存的主要的区别就是作用范围了,SAP内存是对当前登录所有会话都可以访问到的,除非用户退出系统不然在整个登录期间都有效。ABAP内存只是针对一个会话,你用...

蓝牙协议体系结构

蓝牙协议体系结构   整个蓝牙协议体系结构可分为底层硬件模块、中间协议层和高端应用层三大部分。   链路管理层(LMP,Link Management Protocol)、基带层(BB)和射频(RF)构成蓝牙的底层模块。RF通过2.4GHz无需授权的ISM频段,实现数据位流的过滤和传输,它主要定义了蓝牙收发器应该满足的要求。BB层负责跳频和蓝牙数据及信息帧...

NLog类库使用探索——详解配置

https://www.cnblogs.com/fuchongjundream/p/3936431.html 1 配置文件的位置(Configuration file locations)     通过在启动的时候对一些常用目录的扫描,NLog会尝试使用找到的配置信息进行自动的自我配置。 1.1 单独的*.exe客户端     单独的客户端,NLog将在以...

原创-K8S INGRESS配置分析 并总结一次配置事故

上周在调整K8S中某域名其中一段PATH的ingress白名单问题时,由于对ingress的白名单策略理解不充分导致错误配置,使白名单应用到全域名中造成整个域名403。 特此花时间研究一下整个ingress相关的配置。 参考文档:https://github.com/kubernetes/ingress-nginx/blob/master/docs/use...

Ubuntu虚拟机双网卡的配置(Uboot,tftp下载)(原创)

通过此文的设置,可以让Ubuntu虚拟机实现: 1.ubuntu虚拟机能上网查资料,下载软件等; 2.tftp服务器能给本地设备传输数据,不会和ubuntu网络冲突。 一,VMWare新建两个虚拟网络,如:Vmnet0、Vmnet1;   并将两个虚拟网络分别桥接到对应的物理网卡上,如: vmnet0   桥接到  电脑的有线网卡PCIe GBE上;...

【PCIE-1】---Pcie基本概念普及(扫盲篇--巨适合新手)

  PCIE由早期得PCI扩展衍生而来并且对兼容PCI,两者得主要区别在于并行到串行得切换,且速率更快。目前主板上越来越多得设备都挂载到PCI总线下面,甚至部分硬盘也会挂载PCI总线下面,可见PCIE得应用越来越广。PCIE设计的知识面比较广,无论是在BIOS下还是系统下都显得尤为重要。本章主要介绍PCIE的基本概念及基本知识扫盲,初次学习的同学必看。 知...