【PCIe】非常适合初学的pcie博客(PCIe知识整理)

深入理解Linux内核 同时被 3 个专栏收录
26 篇文章 2 订阅

非常适合初学的pcie博客:

PCIE扫盲(第一阶段):http://blog.chinaaet.com/justlxy/p/5100053251

 


PCIe简介:http://blog.chinaaet.com/justlxy/p/5100053066

  •     这一章主要介绍PCIe的由来,在2001年的时候被提出,命名“PCI-Express”,主要优势就是传输速率高,另外还有传输距离远、功耗低、抗干扰能力强等。
  •     PCIe接口根据总线位宽不同,可以配置为x1、x2、x4、x8、x16、x32等,总线位宽越大对应传输速率越大。
  •     PCIe是在PCI/PCI-X的基础上发展而来的,因此完全兼容前面几种设备。

PCI总线基本概念:http://blog.chinaaet.com/justlxy/p/5100053077

  •     PCI是Peripheral Component Interconnect(外设部件互连标准)的缩写,曾经是个人电脑中最广泛的接口,主要用于连接声卡、显卡、网卡等,如今逐渐被PCIe取代。
  •     PCI被淘汰的主要原因是越来越不能满足日益增长的图吞吐量,虽然不断增加33MHz、66MHz、133MHz是在频率以提高传输速率,极限最大支持2G左右传输,但仍不满足。

一个典型的PCI总线周期:http://blog.chinaaet.com/justlxy/p/5100053078

  •     一次PCI传输周期所要用到的信号:CLK(时钟)、GNT(申请总线占用)、FRAME(表示数据传输的起始和持续)、AD(传输地址和数据)、C/BE(Command/Byte Enable)、IRDY(主设备准备好信号)、DESEL(片选)、TRDY(目标设备准备好信号)。
  •     一次传输流程:
  •         1、在第一个时钟上升沿,FRAME#和IRDY#都为inactive,表明总线当前处于空闲状态。与此同时,某个设备的GNT#信号处于active,表明总线总裁器已经选定当前设备为下一个initiator(可以理解为主机)。
  •         2、在第二个时钟上升沿,FRAME#被initiator拉低,表明新的事务(Transaction)已经开始。与此同时,地址和命令被依次发送到AD上,总线上面的所有其他设备(从机)都会锁存这些信息,并检查地址和命令是否与自己匹配
  •         3、在第三个时钟上升沿,IRDY#处于active状态,表明主机准备就绪,可以接收数据了。AD信号目前处于三态状态(处于输出和输入的转换状态),此时的TRDY#处于inactive状态,以保证Turn‐around cycle顺利进行。
  •         4、在第四个时钟上升沿,PCI总线上的某个从机确认身份,并依次将DEVSEL#信号和TRDY#拉低,并将相应的数据输出到AD上。此时,FRAME#信号为active状态,表明这并不是最后一个数据。
  •         5、在第五个时钟上升沿,TRDY#处于inactive状态,表明从机尚未就绪,因此所有的操作暂缓一个时钟周期(或者说插入了一个Wait State)。PCI总线最多允许8个这样的Wait State。
  •         6、在第六个时钟上升沿,从机向主机发送第二个数据。此时,FRAME#信号依旧为active状态,表明这并不是最后一个数据。
  •         7、在第七个时钟上升沿,IRDY#处于inactive状态,表明主机尚未就绪,再次插入一个Wait State。但是此时从机依旧可以向AD上发送数据。
  •         8、在第八个时钟上升沿,AD上的第三个数据被发送至主机,由于此时FRAME#信号被拉高,即inactive,表明这是本次事务(Transaction)的最后一个数据。此后,所有的控制信号均被拉高,处于inactive状态,AD、FRAME#和C/BE#处于三态状态(处于输出和输入的转换状态)。

PCI总线中的Reflected-Wave Signaling:http://blog.chinaaet.com/justlxy/p/5100053079

  •     这一章主要提到了,PCI使用了反射波信号技术,降低了功耗,但同时这种机制也限制了PCI总线频率的提高。
  •     虽然理论上一个PCI总线上最大可连接32个设备,实际一般只能连10~12个(如果使用插槽连接,则一个连接算两个PCI设备),如果需要连接更多设备,可以借助PCI桥。

PCI总线的三种传输模式:http://blog.chinaaet.com/justlxy/p/5100053095

  •     这一章主要介绍了PCI的三种传输模型:Programmed I/O(PIO),Peer-to-Peer和DMA。
  •     PIO传输模型其实就是通过CPU搬运数据,对于目前一些传输量特别大的设备,这是一种非常不好的办法。
  •     DMA传输模型是非常流行的传输方式,通过DMA搬运,几乎不需要CPU进行干预,应用很广泛。
  •     Peer-to-Peer这种方式仅针对PCI,因为PCI的主机身份不是固定的,如果两个设备需要进行传输,可以将其中一个设为主机,这种方式在实际应用中非常少。

PCI总线的中断和错误处理:http://blog.chinaaet.com/justlxy/p/5100053096

  •     PCI总线使用INTA#、INTB#、INTC#和INTD#信号向处理器发出中断请求。实际一般只使用INTA#信号。
  •     PCI总线通过PERR#或者SERR#报告错误。

PCI总线的地址空间分配:http://blog.chinaaet.com/justlxy/p/5100053219

  •     PCI总线具有32位数据/地址总线,所以存储地址空间为4GB,也就是所有PCI设备共同映射到这4GB上,每个PCI设备占用唯一的一段PCI地址,以便PCI总线统一寻址。
  •     PCI体系结构支持三种地址空间:Memory Address Space、I/O Address Space和Configuration Address Space。
  •     其中x86处理器可以直接访问的只有Memory Address Space和I/O Address Space。而访问Configuration Address Space则需要通过索引IO寄存器来完成。(在PCIe中,则引入了一种新的Configuration Address Space访问方式,直接映射到了Memory Address Space当中)
  •     虽然PCI支持32位的地址,但是由于x86的CPU只支持16位的I/O空间,这就限制了PCI的I/O Address Space最大只有64KB。
  •     每条PCI总线最多支持256个子总线(PCI桥)、每条PCI总线支持32个设备、每个PCI设备支持8种功能、每个功能都有256字节配置空间,因此计算出PCI总的配置空间大小:256*32*8*2565=16MB

PCI总线配置周期产生和配置寄存器:http://blog.chinaaet.com/justlxy/p/5100053220

  •     这一章主要讲了PCI的配置周期需要做的步骤:写入要操作的配置寄存器的地址(总线号、设备号、功能号、寄存器指针)、写入读或者写的数据。
  •     每一个PCI功能包含256字节配置空间,其中前64字节称为Header,剩余的192字节用于一些可选功能。
  •     PCI有两种类型的Header:Type0和Type1。Type1表示PCI桥(只有两个BAR),Type0表示普通的PCI设备(有6个BAR,一般只用2~3个BAR)。

66MHz的PCI总线与其技术瓶颈:http://blog.chinaaet.com/justlxy/p/5100053221

  •     这一章解释了PCI没落的原因和PCIe的强势崛起。
  •     为了能够支持更高的带宽,PCI将频率提高到了66MHz,带来的后果就是总线负载能力的降低,结果就是PCI总线只能支持一个PCI插卡设备。为了增加系统的PCI设备数,就需要额外的增加PCI桥。

PCI-X总线基本概念:http://blog.chinaaet.com/justlxy/p/5100053224

  •     这一章主要介绍了PCI-X,它在PCI的基础上发展而来,提高了PCI总线性能,时钟频率提高到133MHz,但是PCI-X很少得到应用(高功耗、高成本、引脚过多、复杂PCB设计...PCIe时代到来)

PCIe总线基本概念:http://blog.chinaaet.com/justlxy/p/5100053225

  •     这一章主要介绍了PCIe总线。其中,PCIe是高速串行总线。实际上,不仅是PCI总线到PCIe总线,高速串行总线取代传统并行总线是一个大的趋势。
  •     和很多的串行总线一样,PCIe采用了全双工的传输设计,即允许在同一时刻,同时进行发送和接收数据。
  •     与绝大部分的高速连接一样,PCIe采用了差分对进行收发,以提高总线的性能。
  •     除了差分总线,PCIe还引入了嵌入式时钟的技术(Embedded Clock),即发送端不再向接收端发送时钟,但是接收端可以通过8b/10b的编码从数据Lane中恢复出时钟。
  •     PCIe相对于PCI总线的另一个大的优势是其的Scalable Performance,即可以根据应用的需要来调整PCIe设备的带宽。
  •     和PCI-X总线一样,由于非常高的传输速度,PCIe是一种点对点连接的总线,而不像PCI那样的共享总线。但可以通过SWITCH连接多个PCIe设备,也可以通过PCIe桥连接PCI和PCI-X设备。

PCIe总线怎样做到在软件上兼容PCI总线:http://blog.chinaaet.com/justlxy/p/5100053245

  •     这一章主要解释了PCIe如何做到软件上的兼容PCI。
  •     PCIe总线完整的继承了PCI总线中的配置空间(Configuration Header)的概念。
  •     PCIe的Header基本上与PCI的Header是一致的,只有少许差别。但是这些差别并不影响PCIe对PCI的兼容性(还有PCIe到PCI桥对其进行处理)。
  •     需要特别说明的是,Root Complex(RC or Root)和Switch都是全新的PCIe中的概念,它们结构中的每一个端口(Port)都可以对应于PCI总线中的PCI-to-PCI桥的概念。

PCIe总线体系结构入门:http://blog.chinaaet.com/justlxy/p/5100053246

  •     PCIe体系结构包括应用层、事务层(Transaction Layer)、数据链路层(Data Link Layer)和物理层(Physical Layer)。
  •     事务层(Transaction Layer):接收端的事务层负责事务层包(Transaction Layer Packet,TLP)的解码与校检,发送端的事务层负责TLP的创建。此外,事务层还有QoS(Quality of Service)和流量控制(Flow Control)以及Transaction Ordering等功能。
  •     数据链路层(Data Link Layer):数据链路层负责数据链路层包(Data Link Layer Packet,DLLP)的创建,解码和校检。同时,本层还实现了Ack/Nak的应答机制。
  •     物理层(Physical Layer):物理层负责Ordered-Set Packet的创建于解码。同时负责发送与接收所有类型的包(TLPs、DLLPs和Ordered-Sets)。当前在发送之前,还需要对包进行一些列的处理,如Byte Striping、Scramble(扰码)和Encoder(8b/10b for Gen1&Gen2, 128b/130b for Gen3& Gen4)。对应的,在接收端就需要进行相反的处理。此外,物理层还实现了链路训练(Link Training)和链路初始化(Link Initialization)的功能,这一般是通过链路训练状态机(Link Training and Status State Machine,LTSSM)来完成的。

PCIe总线事务层入门(一):http://blog.chinaaet.com/justlxy/p/5100053247

  •     这一章介绍了TLP的几种类型以及TLP的包结构。
  •     PCIe总线的通信机制分为Posted和Non-Posted型。
  •     所谓Non-posted,就是Requester发送了一个包含Request的包之后,必须要得到一个包含Completion的包的应答,这次传输才算结束,否则会进行等待。所谓Posted,就是Requester的请求并不需要Completer通过发送包含Completion的包进行应答,当然也就不需要进行等待了。很显然,Posted类型的操作对总线的利用率(效率)要远高于Non-Posted型。但是这并不意味着Posted类型的操作不需要Completer进行应答,只是此时Completer采用了另一种应答机制——Ack/Nak的机制。
  •     那么为什么要分为Non-Posted和Posted两种类型呢?对于Memory Writes来说,对效率要求较高,因此采用了Posted的方式。
  •     介绍了TLP包结构。

PCIe总线事务层入门(二):http://blog.chinaaet.com/justlxy/p/5100053248

  •     这一章详细介绍了Posted和Non-Posted传输流程。

PCIe总线事务层入门(三):http://blog.chinaaet.com/justlxy/p/5100053249

  •     PCIe Spec中为每一个包都分配了一个优先级,通过TLP的Header中的3位(即TC,Traffic Class),TC值越大,表示优先级越高,对应的包也就会得到优先发送。
  •     Switch会先传输优先级高的数据包,Switch的这种判决操作叫做端口仲裁(Port Arbitration)
  •     PCIe总线中要求接收方必须经常(在特定时间)向发送方报告其VC Buffer的使用情况。而报告的方式是,接收方向发送方发送Flow Control的DLLP(数据链路层包),且这种DLLP的收发是由硬件层面上自动完成的,并不需要人为的干预。(这些VC Buffer的使用情况对于应用层(软件层)也是可见的)
  •     采用Flow Control机制的PCIe总线,相对于PCI总线获得了更高的总线利用率。虽然增加了Flow Control DLLP,但是这些DLLP对带宽的占用极小,几乎对总线利用率没有什么影响。

PCIe总线数据链路层入门:http://blog.chinaaet.com/justlxy/p/5100053250

  •     数据链路层(Data Link Layer)主要进行链路管理(Link Management)、TLP错误检测,Flow Control和Link功耗管理。
  •     数据链路层不仅可以转发来自事务层的包(TLP),还可以直接向另一个相邻设备的数据链路层直接发送DLLP,比如应用于Flow Control和Ack/Nak的DLLP。
  •     数据链路层实现了一种自动的错误校正功能,即Ack/Nak机制。发送方会对每一个TLP在Replay Buffer中做备份,直到其接收到来自接收方的Ack DLLP,确认该DLP已经成功的被接受,才会删除这个备份。如果接收方发现TLP存在错误,则会向发送发发送Nak DLLP,然后发送方会从Replay Buffer中取出数据,重新发送该TLP。

PCIe总线物理层入门:http://blog.chinaaet.com/justlxy/p/5100053261

  •     来自数据链路层的TLP和DLLP(这里所说的TLP和DLLP指的是包的原始发送者发的包)都会被临时放入物理层的Buffer中,并被加上起始字符(Start & End Characters),这些起始字符有的时候也被称为帧字符(Frame Characters)。
  •     物理层完成的一个重要的功能就是8b/10b编码和解码(Gen1 & Gen2),Gen3及之后的PCIe则采用了128b/130b的编码和解码机制。
  •     需要注意的是,PCIe物理层处理可以转发LTP和DLLP之外,还可以直接发送命令集(Ordered Sets)。

一个Memory Read操作的例子:http://blog.chinaaet.com/justlxy/p/5100053263

  •     简单描述一下PCIe传输的例子(对之前的事务层、链路层、物理层)
  •     RC侧的应用层会向事务层发送如下信息:32位(或者64位)的Memory地址,事务类型(Transaction Type),数据量(以DW为单位),TC(Traffic Class,即优先级),字节使能(Byte Enable)和属性信息(Attributes)等。
  •     RC侧的事务层使用这些信息创建了一个Mrd TLP(Memory Read的事务层包),并将RC侧的ID(BDF,Bus & Device & Function)写入到该TLP的Header中,以便EP侧根据这一BDF将Completion信息返回给RC。(然后这个TLP会根据其TC的值被放到对应的VC Buffer中,Flow Control逻辑便会检车接收端的对应的接收VC Buffer空间是否充足。一旦接收端的VC Buffer空间充足,TLP便会准备被向接收端发送。)
  •     RC侧的数据链路层(Data Link Layer)收到TLP包的时候,数据链路层会为其添加上12位的序列号(Sequence Number)和32位的LCRC。并将添加上这些信息之后的TLP(即DLLP)在Replay Buffer中做一个备份,并随后将其发送至物理层。
  •     RC侧的物理层收到DLLP后,为其添加上起始字符(Start & End Characters,又叫帧字符,Frame Characters),然后依次进行解字节(Strip Byte)、扰码(Scramble)、8b/10b编码并进行串行化,随后发送至相邻的PCIe设备的物理层。
  •     ---------------------------------------------
  •     EP侧的物理层接收到数据之后,依次执行与发送端相反的操作。并从数据中恢复出时钟,然后将恢复出来的DLLP发送至数据链路层。
  •     EP侧的数据链路层首先检查DLLP中的LCRC,如果存在错误,则向Requester发送一个Nak类型的DLLP,该DLLP包含了其接受到的DLLP中的序列号(Sequence Number)。Requester的数据链路层接收到来自Completer的Nak DLLP之后,从中找到序列号(Sequence Number),并根据序列号在Replay Buffer找到对应的DLLP,然后将其重新发送至Completer。如果Completer的数据链路层没有检查到LCRC的错误,也会向Requester发送一个Ack类型的DLLP,该DLLP同样包含了其接收到的DLLP中的序列号。Requester的数据链路层接收到之一Ack DLLP之后,便会根据其中的序列号在Replay Buffer中找到对应的DLLP的备份,并将其丢弃(Discard)。
  •     EP侧的数据链路层正确的接收到了来自Requester的DLLP(包含TLP的)时,随后将其进一步发送至事务层,事务层检查ECRC(可选的),并对TLP进行解析,然后将解析后的信息发送至应用层(软件层)。
  •     EP侧的应用层会根据接受到的信息进行相应的处理,处理完成后会将数据发送至事务层,事务层根据这一信息创建一个新的TLP(即CplD,Completion with data)。并根据先前接收到的TLP中的BDF信息,找到原来的Requester,然后将CplD发送至该Requester。这一发送过程与Requester向Completer发送TLP(Mrd Request)的过程基本是一致的。
浅谈PCIe体系结构 浅谈PCIe体系结构 - 1 - 目录 - 1 - 第I篇PCI体系结构概述 - 1 - 第1章PCI总线的基本知识 - 3 - 1.1 PCI总线的组成结构 - 6 - 1.1.1 HOST主桥 - 6 - 1.1.2 PCI总线 - 7 - 1.1.3 PCI设备 - 7 - 1.1.4 HOST处理器 - 8 - 1.1.5 PCI总线的负载 - 9 - 1.2 PCI总线的信号定义 - 10 - 1.2.1 地址和数据信号 - 10 - 1.2.2 接口控制信号 - 11 - 1.2.3 仲裁信号 - 13 - 1.2.4 中断请求等其他信号 - 14 - 1.3 PCI总线的存储器读写总线事务 - 15 - 1.3.1 PCI总线事务的时序 - 15 - 1.3.2 Posted和Non-Posted传送方式 - 16 - 1.3.3 HOST处理器访问PCI设备 - 17 - 1.3.4 PCI设备读写主存储器 - 19 - 1.3.5 Delayed传送方式 - 21 - 1.4 PCI总线的中断机制 - 23 - 1.4.1 中断信号与中断控制器的连接关系 - 23 - 1.4.2 中断信号与PCI总线的连接关系 - 24 - 1.4.3 中断请求的同步 - 25 - 1.5 PCI-X总线简介 - 28 - 1.5.1 Split总线事务 - 28 - 1.5.2 总线传送协议 - 28 - 1.5.3 基于数据块的突发传送 - 29 - 1.6 小结 - 29 - 第2章PCI总线的桥与配置 - 30 - 2.1 存储器域与PCI总线域 - 30 - 2.1.1 CPU域、DRAM域与存储器域 - 31 - 2.1.2 PCI总线域 - 32 - 2.1.3 处理器域 - 32 - 2.2 HOST主桥 - 34 - 2.2.1 PCI设备配置空间的访问机制 - 35 - 2.2.2 存储器域地址空间到PCI总线域地址空间的转换 - 37 - 2.2.3 PCI总线域地址空间到存储器域地址空间的转换 - 39 - 2.2.4 x86处理器的HOST主桥 - 42 - 2.3 PCI桥与PCI设备的配置空间 - 45 - 2.3.1 PCI桥 - 45 - 2.3.2 PCI Agent设备的配置空间 - 47 - 2.3.3 PCI桥的配置空间 - 50 - 2.4 PCI总线的配置 - 54 - 2.4.1 Type 01h和Type 00h配置请求 - 54 - 2.4.2 PCI总线配置请求的转换原则 - 56 - 2.4.3 PCI总线树Bus号的初始化 - 58 - 2.4.4 PCI总线Device号的分配 - 60 - 2.5 非透明PCI桥 - 62 - 2.5.1 Intel 21555中的配置寄存器 - 63 - 2.5.2 通过非透明桥片进行数据传递 - 65 - 2.6 小结 - 67 - 第3章PCI总线的数据交换 - 68 - 3.1 PCI设备BAR空间的初始化 - 68 - 3.1.1 存储器地址与PCI总线地址的转换 - 68 - 3.1.2 PCI设备BAR寄存器和PCI桥Base、Limit寄存器的初始化 - 70 - 3.2 PCI设备的数据传递 - 72 - 3.2.1 PCI设备的正向译码与负向译码 - 72 - 3.3.2 处理器到PCI设备的数据传送 - 74 - 3.2.3 PCI设备的DMA操作 - 74 - 3.2.4 PCI桥的Combining、Merging和Collapsing - 75 - 3.3 与Cache相关的PCI总线事务 - 77 - 3.3.1 Cache一致性的基本概念 - 77 - 3.3.2 PCI设备对不可Cache的存储器空间进行DMA读写 - 82 - 3.3.3 PCI设备对可Cache的存储器空间进行DMA读写 - 83 - 3.3.4 PCI设备进行DMA写时发生Cache命中 - 85 - 3.3.5 DMA写时发生Cache命中的优化 - 87 - 3.4 预读机制 - 89 - 3.4.1 Instruction Fetch - 89 - 3.4.2 数据预读 - 92 - 3.4.3 软件预读 - 94 - 3.4.4 硬件预读 - 96 - 3.4.5 PCI总线的预读机制 - 97 - 3.5 小结 - 101 - 第II篇PCI Express体系结构概述 - 102 - 第4章PCIe总线概述 - 104 - 4.1 PCIe总线的基础知识 - 104 - 4.1.1 端到端的数据传递 - 104 - 4.1.2 PCIe总线使用的信号 - 106 - 4.1.3 PCIe总线
©️2021 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值