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

  对新手来说,第一步了解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。

  

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

1. IO访问

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

1 /*Writer date to cf8*/2 Address = BIT31|((BUS & 0XFF)<< 16)|((DEV & 0x1F)<<11)|((Fun & 0x7) << 8);3 IoWrite32(0xCF8, address);                 //将要读取的地址写入到CF84 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空间

  设备空间如上图所示:下面介绍其中主要内容以及作用:

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

  Class Code:

  HeaderType:

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

  Subordinate Bus Number: 从属Bus号即该Bus这颗树下最大的Bus号。

  Secondary Bus Number: 该Bridge下接的Bus号

  Primary Bus Number:     该Bridge上接的Bus号

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

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

  

  

原文地址:https://www.cnblogs.com/szhb-5251/p/11620019.html

时间: 2024-10-30 07:23:25

【PCIE-2】---PCIE配置空间及访问方式简介的相关文章

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操作转

如何访问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方法仍然能够訪问全

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

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

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空间进行双字操作时,就将

System.Web.Http.Cors配置跨域访问的两种方式

System.Web.Http.Cors配置跨域访问的两种方式 使用System.Web.Http.Cors配置跨域访问,众多大神已经发布了很多文章,我就不在详细描述了,作为小白我只说一下自己的使用心得.在webapi中使用System.Web.Http.Cors配置跨域信息可以有两种方式.  一种是在App_Start.WebApiConfig.cs的Register中配置如下代码,这种方式将在所有的webapi Controller里面起作用. using System; using Sys

Yii优化路由Apache配置(在APACHE服务器上的访问方式上去除index.php)

在APACHE服务器上的访问方式上去除index.php 下面我说下 apache 下 ,如何 去掉URL 里面的 index.php 例如: 你原来的路径是: localhost/index.php/index 改变后的路径是: localhost/index 1.httpd.conf配置文件中加载了mod_rewrite.so模块 //在APACHE里面去配置 #LoadModule rewrite_module modules/mod_rewrite.so把前面的警号去掉 2.httpd.

HDFS副本机制&amp;负载均衡&amp;机架感知&amp;访问方式&amp;健壮性&amp;删除恢复机制&amp;HDFS缺点

副本机制 1.副本摆放策略 第一副本:放置在上传文件的DataNode上:如果是集群外提交,则随机挑选一台磁盘不太慢.CPU不太忙的节点上:第二副本:放置在于第一个副本不同的机架的节点上:第三副本:与第二个副本相同机架的不同节点上:如果还有更多的副本:随机放在节点中: 2.副本系数 1)对于上传文件到HDFS时,当时hadoop的副本系数是几,那么这个文件的块副本数就有几份,无论以后怎么更改系统副本系数,这个文件的副本数都不会改变,也就是说上传到HDFS系统的文件副本数是由当时的系统副本数决定的

Appserv配置多站点访问(转)

这两天一直在弄着微信开发,但是贪便宜租用了两个坑爹的空间,唉,一个是版本太低,一个是没有创建权限,实在是无语 没办法之下只好租用过台空间,但是天意玩人,我搭建环境花费了两天的时间才搭建上环境,第一次大家wamp发现wamp在里面居然不好使,没办法,那只好下载个appserv 但是在里面发现apache的修改方法和wamp里面的修改方法居然不同,纠结得要命 无奈之下我只好来来找度娘,结果那些方法几乎都没多少个是可以使用的,把我好一顿恶心 废话不多说开干 Appserv配置多站点教程 第一步:下载A