
PCI概述//主要看配置空间和枚举寄存器的类型 IO寄存器 PCI寄存器 Memory寄存器存放的位置。//PCI体系结构导读看1234567章对照RW看PCIE标准部分PCI 总线作为处理器系统的局部总线主要目的是为了连接外部设备而不是作为处理器的系统总线连接Cache 和主存储器。但是 PCI 总线、系统总线和处理器体系结构之间依然存在着紧密的联系。PCI 设备具有独立的地址空间该空间与储存器地址空间通过HOST桥分割即 PCI 总线地址空间处理器访问 PCI 设备时必须通过 HOST 主桥进行地址转换而 PCI 设备访问主存储器时也需要通过 HOST主桥进行地址转换。在 HOST 主桥中含有许多缓冲这些缓冲使得处理器总线与 PCI 总线工作在各自的时钟频率中彼此互不干扰。HOST主桥作用HOST 主桥的一个重要作用就是将处理器访问的存储器地址转换为 PCI 总线地址。PCI 设备使用的地址空间是属于 PCI 总线域的而与存储器地址空间不同。PCI的扩展性在 PCI 总线中HOST 主桥可以直接引出一条 PCI 总线该总线还可以通过 PCI 桥扩展出一系列 PCI 总线并以 HOST 主桥为根节点形成 1 颗 PCI 总线树。这些 PCI 总线都可以连接 PCI 设备但是在1 颗 PCI 总线树上最多只能挂接256 个 PCI设备。PCI桥的两端分别连接两条总线靠近CPU的是上游总线原理的是下游总线。在同一条 PCI 总线上的设备间可以直接通信并不会影响其他 PCI 总线上设备间的数据通信。隶属于同一颗 PCI 总线树上的 PCI 设备也可以直接通信但是需要通过 PCI 桥进行数据转发。 HOST桥相当于一个总的PCI桥。动态匹配机制PCI 设备使用的地址可以根据需要由系统软件动态分配。PCI 总线使用这种方式合理地解决了设备间的地址冲突从而实现了“即插即用”功能。每一个 PCI 设备都有独立的配置空间在配置空间中含有该设备在 PCI 总线中使用的基地址系统软件可以动态配置这个基地址从而保证每一个 PCI 设备使用的物理地址并不相同。PCI 桥的配置空间中含有其下 PCI子树所能使用的地址范围。共享总线PCI 设备使用共享总线方式进行数据传递在同一条总线上所有 PCI 设备共享同一总线带宽这将极大地影响 PCI 总线的利用率通过仲裁获取PCI总线使用权之后才能进行数据传输。PCI并行总线通过提高总线频率和位宽来增加传输带宽中断机制PCI总线上的设备可以通过四根中断请求信号INTA~D向处理器提交中断请求PCI总线上的设备共享中断请求信号PCI设备配置空间里记录四根中断请求信号的信息。PCI总线结构基本架构PCI 总线由 HOST 主桥和 PCI 桥推出HOST 主桥与主存储器控制器在同一级总线上PCI 设备可以方便地通过 HOST 主桥访问主存储器即进行 DMA(直接存储器访问)操作HOST主桥其主要功能是隔离处理器系统的存储器域与处理器系统的 PCI 总线域管理 PCI 总线域并完成处理器与 PCI 设备间的数据交换。HOST 主桥是联系处理器与 PCI 设备的桥梁。在一个处理器系统中每一个 HOST 主桥都管理了一颗 PCI 总线树在同一颗 PCI 总线树上的所有 PCI 设备属于同一个 PCI 总线域。PCI总线和PCI总线树在一颗PCI总线树上可能会有多个PCI总线多个具有血缘关系的PCI总线组成一个PCI树PCI总线树的数目、PCI总线域与HOST桥的数目应该一致。与 HOST 主桥直接连接的 PCI 总线通常被命名为 PCI 总线 0PCI设备主要可分为PCI 主设备、PCI 从设备和桥设备三类PCI 从设备只能被动地接收来自 HOST主桥或者其他 PCI 设备的读写请求PCI 主设备可以通过总线仲裁获得 PCI 总线的使用权主动地向其他PCI 设备或者主存储器发起存储器读写请求桥设备的主要作用是管理下游的 PCI 总线并转发上下游总线之间的总线事务一个 PCI 设备可以即是主设备也是从设备但是在同一个时刻这个 PCI 设备只能为从设备或主设备。PCI 总线规范将 PCI 主从设备统称为 PCI Agent 设备。在处理器系统中常见的 PCI 网卡、显卡、声卡等设备都属于 PCI Agent 设备。在 PCI 总线中HOST 主桥是一个特殊的 PCI 设备该设备可以获取 PCI 总线的控制权访问 PCI 设备也可以被 PCI 设备访问。但是 HOST 主桥并不是 PCI 设备。PCI桥设备PCI 桥的存在使 PCI 总线极具扩展性处理器系统可以使用 PCI 桥进一步扩展 PCI 总线PCI桥PCI 桥可以连接两条 PCI 总线上游 PCI 总线和下游 PCI 总线这两个 PCI 总线属于同一个 PCI 总线域使用 PCI 桥扩展的所有 PCI 总线都同属于一个 PCI 总线域。HOST处理器相当于小处理器PCI 总线规定在同一时刻内在一颗 PCI 总线树上有且只有一个 HOST 处理器。这个 HOST 处理器可以通过HOST 主桥发起 PCI 总线的配置请求总线事务并对 PCI 总线上的设备和桥片进行配置。在 HOST 主桥中有许多BAR寄存器每一个BAR寄存器都与PCI设备使用的一组PCI总线地址空间相对应BAR寄存器记录这组地址空间的基地址HOST 处理器通过操作这些寄存器管理 PCI 设备。PCI总线负载PCI 总线的所能挂接的负载与总线频率相关其中总线频率越高所能挂接的负载越少但是整条总线所提供的带宽越大。在 PCI 总线中一个插槽相当于两个负载接插件和插卡各算为一个负载。PCI总线数据传输方式Posted总线事务Posted 总线事务指 PCI 主设备向 PCI 目标设备进行数据传递时当数据到达 PCI 桥后即由 PCI 桥接管来自上游总线的总线事务并将其转发到下游总线。采用这种数据传送方式在数据还没有到达最终的目的地之前PCI 总线就可以结束当前总线事务从而在一定程度上解决了 PCI 总线的拥塞。Non-Posted总线事务Non-Posted 总线事务是指 PCI 主设备向 PCI 目标设备进行数据传递时数据必须到达最终目的地之后才能结束当前总线事务的一种数据传递方式。由于Non-Posted传送时在没有结束当前总线事务时候必须等待容易造成阻塞因此可以使用Delayed进行缓解。HOST处理器访问PCI设备主要包含两方面的内容1是处理器向 PCI 设备发起存储器和 I/O读写请求2是处理器对 PCI 设备进行配置读写。存储器域和PCI总线域存储器域、PCI总线、Host桥的关系如图所示DRAM动态随机存储器PCI 设备访问存储器域时也需要通过 HOST 主桥并由 HOST 主桥进行 PCI 总线域到存储器域的地址转换CPU 访问 PCI 设备时同样需要通过 HOST 主桥进行存储器域到 PCI 总线域的地址转换。在X86处理器中大多数DRAM域中的地址域存储器中的地址一一对应且相等存储器域的PCI地址和PCI总线域的地址也一一对应且相等。处理器单指CPU 处理器系统CPU外部设备CPU 域地址空间指 CPU 所能直接访问的地址空间集合DRAM 域地址空间指 DRAM 控制器所能访问的地址空间集合也叫主存储器。基地址不可改写值为0x0。通常为一段连续的地址。多数处理器系统中DRAM 域空间是 CPU 域空间的一部分。Legacy地址空间Legacy地址空间在存储器域和DRAM域都有映射且地址相等这是x86处理器所固有的大小为1MB的内存空间具体说明如下存储器域统称 CPU 域与 DRAM 域。存储器域包括 CPU 内部的通用寄存器存储器映像寻址的寄存器主存储器空间和外部设备空间。在X86系统中PCI总线域可以代替外部空间设备域。CPU 访问主存储器时首先将读写命令放入读写指令缓冲中然后将这个命令发送到 DRAM 控制器或者 HOST 主桥。DRAM 控制器或者 HOST 主桥将 CPU 地址转换为 DRAM 或者 PCI 总线地址分别进入 DRAM 域或者 PCI 总线域后再访问相应的地址空间。PCI总线域由PCI设备所能直接访问的地址空间组成在一个处理器系统中可能存在多个 HOST 主桥因此也存在多个 PCI 总线域。如果HOST支持Peer-to-Peer,则该HOST桥可支持不同PCI总线域之间的数据传输。如果不支持则需要通过FSB进行数据交换。处理器域处理器域是指一个处理器系统能够访问的地址空间集合主要包括存储器域和外部设备域对于X86外部设备主要指的是PCI设备存储器域与 PCI 总线域之间由 HOST 主桥联系在一起。HOST主桥是PCI总线的实际管理者。域的转换关系存储器域与PCI总线域之间的转化关系由HOST桥进行统一管理使用寄存器进行地址的映射。映射的规则处理器访向问 PCI总线域地址空间时首先需要访问存储器域的地址空间再通过 HOST主桥将存储器地址转换为PCI总线地址之后才能进入 PCI总线域进行数据交换。PCI设备使用的地址空间保存在各自的PCI 配置寄存器中即 BAR 寄存器中。这些PCI总线地址空间需要在初始化时映射成为存储器域的存储器地址空间之后处理器才能访向这些地址空间。PCI设备访问存储器域时首先需要访问PCI 总线域的地址空间再通过HOST主桥将 PCI总线地址转换为存储器地址才能穿越 HOST主桥进行数据交换。为此处理器需要通过 HOST主桥将这个PCI总线地址反向映射为存储器地址。如果HOST桥不支持Peer-to-Peer传送方式那么不同PCI总线的数据无法直接进行数据交换。PCI总线的桥与配置在PCI体系结构中包含两类桥HOST桥和PCI桥在每一个PCI设备中都有一个配置空间该配置空间由HOST主桥管理。每接入一个PCI桥就多一个PCI总线。同一PCI总线上设备进行数据交换不会影响其他PCI总线。PCIe解决PCI存在的问题PCIe使用了高速差分总线端到端的连接方式替代并行总线与并行总线相比高速差分信号可以使用更高的时钟频率使用更少的信号线实现之前需要更多的芯片管脚才能实现的总线带宽而且与单端信号相比差分信号的抗干扰能力更强。PCIe的链路可以由多条Lane组成换句话来说它的性能可扩展。可以像搭积木一样增加Lane或者减少Lane的组合来提高性能。一条PCIE通道Lane两组差分信号四条差分线。PCIe总线在系统软件编程上和PCI总线兼容绝大多数的PCI总线事务都被PCIe总线保留PCI设备的配置空间也被PCIe继承。PCIe基本结构PCIE采用点对点的传输方式两个数据线组成1个Lane一个负责传输一个负责接受其中每个数据线包含两根差分线。PCIe属于高速串行点对点双通道高带宽传输所连接的设备独享通道带宽不共享总线带宽。一个lane每个时钟传输1bit数据。PCIE采用串行传输但是在芯片内部数据总线是并行的此需需要进行串并转换会带来一定的延时问题。PCIe传输速率计算带宽传输速率*lane的数量*编码效率方案以PCIe 1.0单lane为例带宽2.5*1*8/102.0Gb/s 2.0Gb/s/8250MB/s 8bit等于一个字节PCIE拓扑结构RCRoot Complex:CPU与PCle总线之间的接口位于PCI倒立拓扑的“根”主要完成存储器域(CPU能直接访问的地址空间) 到PCle总线域(PCle设备所能访问的地址空间)的地址转换。Switch:用作链路扩展提供扩展或聚合能力。因为PCle总线使用端到端的连接方式一条PCle连接一个设备当一个PCle链路需要挂接多个EP时需要使用Switch进行链路扩展。该设备由一个上游端口和2-n个下游端口组成。Egress端发送端口、Ingress端接收端口。Bridge:桥提供了一个转换接口用来连接其他的总线如PCI/PCI-X。这样可以允许在PCle的系统中接入一张旧的PCI设备。EP它只有一个上游端口位于PCle拓扑结构树的末端。它作为总线操作的发起者或终结者分为Legacvy PCleEndpoint和Native PCle Endpoint, Lagacy PCle Endpoint是指那些原本准备设计为PCI-总线接口的设备但是却被改为PCle接口的设备而Native PCle Endpointm是标准的PCIe设备。PCIE设备初始化传统复位方式Conventionnal Reset分为Cold、Warm和Hot Rest。其时延大于FLR方式Cold使用的时间最长。FLR方式Function-Level Rest:支持FLR复位方式的PCIE设备需要在BAR空间提供一个寄存器对该寄存器Function Level Reset位写1时使用FLR方式复位。PCIe协议层次事务层事务层(TramsactionLayer)负责TLP包(Transaction LayerPacket)的封装与解封装此外还负责QoS流控、排序等功能;数据链路层Data ink Layer)来自事务层的报文通过数据链路层时候将被添加Sequence Number前缀和CRRC后缀。此外数据链路层还负责DLLP包(Data LinkLayerPacket)的封装与解封装此外还负责链接错误检测和校正使用Ack/Nak协议来确保传输可靠;物理层(Physical layer)处理所有的Packet数据物理传输发送端数据分发到各个Lane传输接收端把各个Lane上的数据汇总起来每个Lane上加扰、去扰以及8/10或者128/130编解码等。PCIe设备标识符BDF//PCI设备配置空间的访问机制BUS总线号由置软件决定最多可分配256个总线号。初始总线号0通常分配给Root Complex。Device:设备号由PCI设备的IDSEL信号与PCI总线地址线的连接关系确定PCle允许在单个PCI总线上最多连接32个设备但是PCle的点对点特性意味着只有一个设备可以直接连接到PCle链路该设备始终是设备0。RC和Switch具有虚拟PCI总线它允许多个设备“连接”到总线。每个设备必须实现功能0并且可以包含最多八个功能的集合实现两个或两个以上功能时设备称为多功能设备。Function:功能号与PCI设备的具体设计相关每个PCI设备最多有8个功能设备这些功能可以包括硬盘驱动器接口、显示控制器、以太网控制器、USB控制器等。具有多个功能的器件不需要按顺序实现。例如设备可以实施功能0、2和7。因此当配置软件检测到多功能设备时必须检查每个可能的功能以了解其中哪些功能是存在的。每个功能还有自己的配置地址空间用于设置与该功能相关联的资源。PCle协议支持256个Bus占8bits每条Bus最多支持32个Device占5bits)每个Device最多支持8个Function占3bits所以由BDF构成了每个PCle设备节点的身份证号。HOST主桥使用寄存器号访问PCI设备配置空间的某个寄存器。CONFIG_ADRESS配置寄存器详细说明。Enable为1时才可以进行PCI配置空间的转换PCIe设备扫描PCIe设备扫描基于深度优先下级分支最多的设备完成扫描。PCIe设备地址空间PCle架构定义了四种地址空间:配置空间、memory空间、IO空间和message空间。配置空间:软件可以通过此空间来对设备的状态进行控制和检查其通过BAR寄存器控制memory空间映射PCIe配置空间是PCIe规范中定义的一部分它提供了一种用于访问和配置PCIe设备的机制。PCIe配置空间是由一组寄存器组成的这些寄存器通常包含设备特定信息、设备状态信息、中断信息等可以由主机控制器和PCIe设备进行读写。通过使用PCIe配置空间可以在计算机系统中对外部设备进行连接和扩展。MemoryAdress Space空间:是存储器映射空间即MMIO空间32位平台为4G大小;IO空间用于访问IO设备的内部寄存器/存储已被MMIO机制代替访问方式与memory相同;mmessage空间:用于report带内的message和event例如error message、电源管理消息等。X86的CPU可以直接访问memory空间和IO空间但不能直接访问PCIe配置空间因此需要把配置空间映射到memory空间。配置空间每个PCle Function都有4KB的配置空间PCle配置空间如下图所示,地址范围为0x0000xFFF。0x00~0x3F : 64Bytes是基本配置空间是所有PCl设备必须支持的;//一个字节8bit一个16进制4bit两个16进制数表示1字节。0x40~0xFF:192 Bytes是PCI/PCI-x和PCle设备扩展的配置空间主要存放一些与MSI或MSI-x中断机制和电源管理相关的Capability结构;0x100~0xFFF:PCIe设备扩展配置空间存放PCle设备所独有的一些Capability结构而PCI设备不能使用这段空间。PCle―共支持256条Bus32个Dev8个Fun。因此在满负载的情况下共需内存大小4k*256*32*8256M这256M的内存空间是为PCle设备准备的空间系统不可用。配置空间0x00~0x3F配置空间前64字节是Header Space根据设备类型可分为type0和type1两类。Type0主要用于EP其各个字节定义如下图Device ID:具体的PCI设备VendorPCI设备的生产厂商Status: 记载PCI设备的状态Command:记载PCI设备的命令初始化时值为0Class Code:记载PCI设备的分类Revision记载PCI设备版本号Header Type该寄存器只读第7位为1表示PCI为多功能设备0表示单功能设备6-0表示当前配置空间的类型。Latency Timer控制PCI设备占用PCI总线的时间。Cache Line Size:记录HOST处理器使用的Cache行长度。Subsystem ID 和Subsystem Vendor ID:与前边基本一致用于进一步区分设备。Expansion ROM base addressPCI设备提供的ROM程序处理器初始化过程中执行该ROM程序初始化这些PCI设备Expansion ROM base address记录这段程序的基地址。Capabolities Pointer在PCI设备中该寄存器可选但是PCIE设备中必须存在该寄存器其存放Capabolities寄存器组的基地址PCI设备使用Capabolities寄存器存放与PCI设备相关的扩展配置信息。Interrupt Line:记录当前PCI设备使用的中断向量号,由系统软件初始化Interrupt Pin保存PCI设备使用的中断引脚这个寄存器保存PCI设备使用的中断引脚。PCI 总线提供了四个中断引脚:INTA#、INTB#、INTC#和INTD#。Interupt Pin 寄存器为1时表示使用INTA#引脚向中断控制器提交中断请求为2表示使用INTB#为3表示使用INTC#为4表示使用INTD#。Base Address Register 0-5寄存器BAR寄存器保存PCI设备使用的地址空间的基地址和大小是设备在PCI域下的地址。负责PCI设备内部空间的映射。设备在系统的PCI地址空间需要申请使用所申请的空间基址和大小保存在BAR寄存器BAR里的只是PCI域的地址空间需要映射到IO地址空间里或者内存空间里之后软件才能使用。BAR寄存器分为两类分别是Memory寄存器和IO寄存器type0有6个32bit的BAR寄存器type1与2个32bit的BAR寄存器。每一个BAR地址对应一个地址空间。BAR通过将某些位设置为只读且0来表示需要的地址空间大小比如一个PCI设备需要占用1MB的地址空间那么这个BAR就需要实现高12bit是可读写的而20-4bit是只读且位0。地址空间大小的计算方法如下a.向BAR寄存器写全1b.读回寄存器里面的值然后clear 上图中特殊编码的值(IO 中bit0bit1 memory中bit0-3)。c.对读回来的值去反加一就得到了该设备需要占用的地址内存空间。这样我们就可以在构建一张大表用于记录所有PCI设备所需要的空间。这也是PCI枚举的主要任务之一。另外别忘记设置Command寄存器enable这些BARsType1主要用于Bridge/只有桥能处理Type1请求具体内容如下图所示与Type0不同Type1只有两组BAR寄存器两组寄存器是可选的如果该桥下不存在私有寄存器则可不使用两组寄存器设置的BAR空间设置为0。PCI桥需要管理其下连接的PCI总线子树使用的各类资源包括存储器、I/O地址空间和总线号。BIST Built-In Self-Test可选用于内部自检Secondary Status:记录Secondary Status的状态I/O Limit和I/O Base寄存器存放PCI子树中所有设备使用的I/O地址空间集合的基地址和大小Memory Limit 和Memory Base存放PCI设备使用的存储器地址空间集合的基地址和大小至少为1M。 寻址的上限和寻址的下限Prefetchable Memory Limit和Prefetchable Memory Base可预读取的基地址和上限I/O Base Upper 16Bits和I/O Base Limit 16Bits存放I/O端口的地址。Bridge Control 管理PCI桥的Secondary Bus。各Type独有寄存器type0 独有的寄存器CardBus CISpointer: 只读可选用于表明访问CIS(card info structure)的地址空间 通常不会涉及。Subsystem ID/ subsystem Vendor ID: 子系统和子厂商ID可以结合Device ID和Vendor ID来组成完成的PCI设备标识。Max_lat: 设备期望的最大延时只读。Min_Gbt: 设备期望的最小延时只读。type1 独有的寄存器Primary Bus Number: 表示PCI设备挂在的PCI总线号。Subordinate Bus Number: PCI桥可以管理其下的PCI总线子树。其中Subordinate Bus Number寄存器存放当前PCI子树中编号最大的PCI总线号。Secondary Bus Number 存放当前PCI桥Secondary Bus使用的总线号这个PCI总线号也是该PCI桥管理的PCI子树中编号最小的PCI总线号Secondary Latency Timer: PCI桥下游的延时寄存器和Latency Timer寄存器的含义相近配置空间0x40~0xFF//Capabilities Pointer 部分主要存放一些与MSI或者MSI-X中断机制和电源管理相关的Capbility结构。基本配置空间中的Capabilities Pointer (在0x34地址处存放Capabilities结构链表的头指针。每一个Capability 结构都有唯一的ID号每一个Capability 寄存器都有一个指针这个指针指向下一个Capability 结构 从而组成一个单向链表结构这个链表的最后一个Capability 结构的指针为0。其中Pointer即为下一个Capability结构体偏移值。表结如下:PCIe配置空间0x100~0xFFF//PCIe Extended Capabilities部分小端高位在后该部分存放PCIE设备的使用特性使用PCIe Extended Capabilities后几乎可以不使用BAR寄存器空间存放与PCIE总线相关的任何信息。该部分内容结构位PCIe Extended Capabilities 为PCIe设备独有可以没有一个PCIe设备可以存放多个PCIe Extended Capabilities 形成一个单向列表其中第一个Capabilities结构的基地址为0x100其结构如下在这个单向链表的尾部其Next Capabilities Offset、Capabilities ID和Capabilities Version字段的值都为0。如果在PCle设备中不含有PCle Extended Capabilties结构则0x100指针所指向的结构其Capabilities ID字段为0xFFFF而Next Capabilities Offset字段为0x0。BIOS对PCIE的相关操作PCIe的配置空间Configuration Space和BAR空间Base Address Register Space是由BIOS进行配置和分配的在启动时BIOS会扫描PCIe设备并为每个设备分配一个唯一的地址空间。这个地址空间包括了设备的配置空间和BAR空间。其中配置空间用于存储设备的配置信息如设备ID、厂商ID、中断号等。而BAR空间则用于映射设备的I/O端口和内存地址。当操作系统启动后它可以通过读取配置空间中的信息来了解设备的属性和功能。此外操作系统还可以使用BAR空间来访问设备的I/O端口和内存地址从而与设备进行通信。PCIE配置空间的访问IO访问//PCI兼容访问机制x86上使用了两个I/O端口寄存器CONFIG_ADDRESS物理地址0CF8H和CONFIG_DATA物理地址0CFCH来访问PCI配置空间。这两种寄存器只能访问基本的配置空间即前256个字节之后的扩展配置空间需要通过ECAM方式进行访问。CONFIG_ADDRESS存放PCI设备的ID号配置空间的地址端口CONFIG_DATA存放进行配置读取的数据PCI配置空间的数据端口。ECAM 机制的主要原理是将处理器系统中所有PCIE设备的配置空间映射到一段地址连续的存储器域的地址空间中。GPU 可以直接对这段特殊的存储器域地址空间进行访问从而访向PCIE设备的配置空间。CONFIG_ADDRESS寄存器字段说明其中Bit 31位是使能位写1。23-16位总线号0-255系统中最多有256个总线。15-11位设备号0-31每个总线最多挂载32个设备。10-8位功能号0-7每个设备对多8个function。7-2位寄存器号待访问配置空间寄存器的偏移地址。1-0位恒为00这是因为CF8h和CFCh是32位端口如上在CONFIG_ADDRESS端口填入BDF就可以在CONFIG_DATA上写入或者读出PCI配置空间的内容。内存访问//PCIE增强访问机制但是这种方法只能访问4KB配置空间的前256个寄存器寄存器号为8位对于之后的配置空间Intel提供了另外一种PCIe配置空间访问方法通过将配置空间映射到Memory map IOMMIO空间对PCIe配置空间可以像对内存一样进行读写访问。在系统存储器空间里划出一片256MB区域将总容量为256MB的全部配置寄存器一对一地映射于这片存储器空间然后CPU进行访问。PCI的枚举PCI枚举是个不断递归调用发现新设备的过程PCI枚举简单来说主要包括下面几个步骤A 利用深度优先算法遍历整个PCI设备树。从Root Complex出发寻找设备和桥。发现桥后设置Bus,会发现一个PCI设备子树递归回到A)B 递归的过程中通过读取BARs记录所有MMIO和IO的需求情况并予以满足。C 设置必要的Capabilities在整个过程结束后一颗完整的资源分配完毕的树就建立好了DMA操作主要作用DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。DMA核心参数1 数据的源地址 2 数据传输位置的目标地址 3 传递数据多少的数据传输量 4 进行多少次传输的传输模式。当剩余传输数据量为0时达到传输终点结束DMA传输。PCI桥的Combining Merging 和Collapsing三种工作模式Combining:PCI 桥可以将接收到的多个存储器写总线事务合并为一个突发存储器写总线事务。 PCI 桥进行这种 Combining 操作时需要注意数据传送的 “顺序” 。Merging:PCI 桥可以将收到的多个对同一个 DW 地址的 Byte、 Word 进行的存储器写总线事务合并为一个对这个 DW 地址的存储器写总线事务。//double word对齐Collapsing:Collapsing 指 PCI 桥可以将对同一个地址进行的 Byte、 Word 和 DW 存储器写总线事务合并为一个存储器写操作。PCI几乎不支持这个方法PCIe BAR寄存器BAR是PCI配置空间中从0x10 到 0x24的6个register用来定义PCI需要的配置空间大小以及配置PCI设备占用的地址空间。配置空间里的header有Base Address Register BARtype0的header中有6个可用BAR每个32bit未用到的BAR设置为0Type1中只有两个可用的BAR。BAR中的低bit无法使用软件进行改写高位可以使用软件操作用于存放系统软件为设备分配的BAR空间基址。BAR初始化是内核进行初始化的BAR初始化流程BAR由内核进行初始化上电时系统软件首先会读取PCIe设备的BAR0得到数据然后系统软件往该BAR0写入全1得到低12bit没变表明该设备空间大小是4KB2的12次方BAR地址的低4位表明了该存储空间的一些属性[0]: IO映射还是memory映射[2:1]32bit地址还是64bit地址[3]能否可预取。然后系统软件根据这些信息在系统内存空间找到这样一块地方来映射这4KB的空间把分配的基地址写入到BAR寄存器。BAR寄存器访问方法BAR地址寄存器负责PCle设备内部空间的映射有了这个映射CPU就可以访问PCle设备空间。比如CPU想去读PCle设备的数据系统启动时通过BAR地址把PCle设备空间映射到内存空间CPU要访问该PCle设备空间 只需访问对应的内存空间。CPU发出一个物理地址RC检查该地址如果发现该内存空间地是某个PCle设备空间的映射就会触发其产生TLP去访问对应的PCle设备读取或者写入PCle设备。PCIe信息查看lspci:查看linux下的PCI设备lspci -s bdf 查看设备号为xx.xx.x的pci设备lspci -vt:以设备树的形式查看linux系统下的pci设备树lspci -s bdf -v :显示设备的详情信息lspci -s bdf -vv :显示设备的更详情信息lspci -s bdf -vvv :显示设备的所有可解析信息lspci -s bdf -xx :以16进制显示设备配置空间的前64字节lspci -s bdf -xxx :以16进制显示设备整个配置空间(256字节)lspci -s bdf -xxxx :以16进制显示设备PCIe配置空间(4096字节/4KB)lspci -k 查看设备加载的驱动模块PCIe配置空间的读写命令读命令b3:00.0 表示设备号 0x00表示寄存器地址b表示一个字节 b3总线号00设备号 0功能号写命令待修改的寄存器的地址范围是 0x00 ~ 0xFF并且通过 ‘w’, ‘b’后缀指定数据宽度其中‘w’表示 2字节‘b’表示 1字节‘l’表示4字节使用RW观看PCIE设备图中一个小格就是一个Byte。32位就是四个ByteDevice和Vendor ID 为000h-004h因此其值为0x9BC58086Revision ID 为008h因此其值为0x05Class Code为009h-011h因此其值为0x038000Cacheline Size为00Ch因此其值为0x10LatencyTimer为00Dh因此其值为0x00Interrupt Pin为03Dh因此其值为0x01对应的为INTAInterrupt Line为03Ch因此其值为0x00 NoneBAR1为010h-013h因此其值为0xCF000004BAR2为014h-017h因此其值为0x000000000BAR3为018h-01Ch因此其值为0xD000000CBAR4为01Dh-020h因此其值为0x000000000BAR5为021h-024h因此其值为0x0000FF81BAR6为025h-029h因此其值为0x000000000Expansion ROM为030h-033h因此其值为0x00000000Subsystem ID 为02Ch-02Fh因此其值为0x317B17AAPCIE事务层事务层接收PCIe设备核心层的数据请求并将其转换为PCIE总线事务。接收端的事务层负责事务层包Transaction Layer PacketTLP的解码与校检发送端的事务层负责TLP的创建。此外事务层还有QoSQuality of Service和流量控制Flow Control以及Transaction Ordering等功能。PCIE数据链路层数据链路层负责数据链路层包Data Link Layer PacketDLLP的创建解码和校检。同时本层还实现了Ack/Nak的应答机制。保证来自事务层的TPL在PCIE链路中正确传递。PCIE物理层物理层负责Ordered-Set Packet的创建于解码。同时负责发送与接收所有类型的包TLPs、DLLPs和Ordered-Sets。当前在发送之前还需要对包进行一些列的处理如Byte Striping、Scramble扰码和Encoder。333333