欢迎光临散文网 会员登陆 & 注册

“PCI”协议基本知识(1)

2023-02-15 10:51 作者:开发员阿梦  | 我要投稿

PCI协议是PCIe协议的基础。想学习PCIe协议必须先读懂PCI协议。

这里很多内容我没有细究,但是就阅读的过程来看,PCI协议的内容确实比较传统,但是也不难懂。

我阅读的书是机械工业出版社的《PCI Express体系结构导读》,王齐编著。

想讲好协议的内容确实不容易,我读过一部分NVMe协议的内容,我知道协议本身读起来其实很枯燥。这里王齐作者不光是讲了PCI协议的知识,更多的是附带讲解了很多处理器系统的知识。不过总体来说其语言还是比较啰嗦的。至少在第1章,一个重要特征是图示很少,围绕一两个图示说明的内容能占到很大的篇幅。学到东西就行吧。

本书分为两部分,的一部分是PCI总线的基本知识,也足够我进行基本的了解了。PCI的知识我先看了第一章这么多,接下来直接去看PCIe的内容,如有需要再回头来看PCI的内容。

定义

PCI总线是处理器系统的局部总线,作用是连接外部设备,而不是作为处理器系统总线连接Cache和主存。PCI总线可说是系统总线的延伸,其设计考虑了许多与处理器相关的内容,比如Cache共享一致性(Cache Coherent)和数据完整性(Data Consistency)。

PCI总线是一条并行总线。

PCI总线是一条共享总线,也就是说同一条总线上所有的PCI设备共享总线带宽(显然将极大地影响总线的利用率)。

PCI总线是一条同步总线。所有设备都是用统一的CLK信号同步数据传输。

结构


如上是PCI总线的一个结构图。上图图示中,HOST主桥即指Host-to-PCI主桥,起到连接处理器和PCI总线的作用。图中的PCI桥指的是PCI-to-PCI桥,用于PCI总线的扩展。这里我给出一个简图,进一步说明HOST主桥、PCI桥、PCI总线和PCI设备之间的关系。

PCI总线从HOST主桥出发,通过PCI桥的扩展,可以延伸出多条总线,连接多个设备,最终形成一个以HOST主桥为根节点的PCI总线树。HOST主桥会引出第一条PCI总线(PCI总线0),总线下能够挂载诸如声卡、网卡、SSD等外围设备,以及PCI桥。PCI桥将再推出一条新的PCI总线,从而挂载一颗PCI总线子树。因此,PCI桥的上下两端都连接着PCI总线。上端,距离处理器较近的总线被称为上游总线(Primary Bus),对应的下端的总线叫下游总线(Secondary Bus)。通过PCI桥进行扩展有限制:一颗PCI总线树上最多挂载包括PCI桥在内的256个PCI设备。

注意,HOST主桥是一个特殊的PCI设备。在PCI规范中并没有定义如何设计HOST主桥。但是HOST主桥的作用至关重要,其可以获取PCI总线的控制权访问PCI设备,也可以被PCI设备访问。

地址域

在PCI总线体系结构下,处理器地址空间和PCI设备的地址空间是相隔离的。在本书中,处理器能直接访问的的地址空间,也就是主存储器的物理地址空间,被称为存储器域;PCI设备的地址空间被称为PCI总线域。HOST主桥正起到这个隔离的作用。处理器需要通过主桥访问PCI设备。在HOST主桥的设计中,有很多缓冲,使得处理器总线和PCI总线工作在各自的频率下互不干扰。因此,处理器和PCI设备之间的访问,需要经过HOST主桥的地址转换。

本书编写时,x86的处理器中存储器域与PCI总线域没有严格划分,但是程序员必须知道二者之不同。

当一个PCI设备的配置空间被初始化后,其在当前的PCI总线树上将拥有一个独立的PCI总线地址空间,这个空间由BAR (Base Address Register) 寄存器描述。

根据以上描述,可以知道HOST主桥、PCI总线域和PCI总线树是一一对应关系。

重要信号

书中的[P9~13]介绍了重要的PCI总线信号。部分信号的说明详见下下节“PCI总线事务时序”。

总线事务

从[P9]的表1-2得知,PCI总线协议中定义了多种总线事务。

PCI总线事务
PCI总线事务


其中,关于读写事务,有三类:I/O读写事务、存储器读写事务以及配置读写事务。这里主要介绍存储器读写事务的过程,来集中整理前述的零散知识。

对于I/O读写事务、存储器读写事务这样的数据传输,处理器与PCI设备之间相互访问的方式是地址译码方式,也就是通过HOST主桥转换存储器域和PCI总线域的地址来完成两端访问;对于配置读写事务这样的配置信息传输,一般是处理器通过ID译码的方式来访问PCI设备。使用的ID信号比如Bus Number、Device Number、Function Number、Register Number等等。

对于PCI总线中的存储器读写总线事务,有以下几种:

1.    HOST处理器对PCI设备的BAR空间进行数据读写,BAR空间可以使用存储器或者I/O译码方式,HOST处理器使用PCI总线的存储器读写总线事务和I/O读写总线事务访问PCI设备的BAR空间。

2.    PCI设备之间的数据传递,一个PCI设备访问另一个PCI设备的BAR空间,比较少见;

3.    PCI设备对主存储器进行数据读写,也就是DMA操作。PCI规范中提供了一些中断信号INTX#以及MSI机制提交中断请求(DMA操作接收将产生中断)。

PCI总线事务时序

结合PCI有关的信号功能,来说明PCI规范中,PCI设备使用总线的时序。

以下简述图中信号的作用。注意,是从申请PCI总线使用权的PCI设备的角度去描述的。下文中的PCI主设备指的是申请使用PCI总线的设备;目标设备指的是读写事务最终作用到的设备。信号IRDY#(In Ready)中的"In"和信号TRDY#(Transport Ready)中的"Transport"都是对于PCI主设备而言的。

上图中,FRAME#信号表示一个PCI事务的开始与结束,低位有效。PCI设备(包括HOST主桥)只有通过仲裁获得当前PCI总线的使用权之后,才能驱动该信号。

AD[31:0],则是PCI总线复用地址信号与数据信号。具体工作过程是,PCI总线在启动后的第一个周期传送地址,这个地址是PCI总线域的存储器地址或者I/O地址;而在下一个时钟周期传送数据。相应的周期被称为地址周期或者数据周期。PCI总线支持突发传送,即在一个地址周期之后,可以紧跟多个数据周期。

C/BE[3:0]#信号(Command/Byte Enable),是PCI总线复用的命令信号与字节选通信号。在地址周期中,该信号表示PCI总线的命令,其定义的各项总线事务见“总线事务”一节中的表格;在数据周期中,该信号表示字节选通。其中C/BE3#、C/BE2#、C/BE1#、C/BE0#与数据字节的3、2、1、0对应,使用这组信号可以对PCI设备进行单个、字、双字的访问。

IRDY#和TRDY#都是低位有效的信号。

IRDY#由PCI主设备驱动(包括HOST主桥),有效时信号表示PCI主设备的数据准备完毕。若是读事务,则表示PCI主设备已准备好接收缓冲,目标设备可以将数据发送到AD[31:0]上;若为写事务,则表示待写入数据已经在AD[31:0]上有效。

TRDY#由目标设备驱动,在读事务中,表示PCI主设备需要的数据已经在AD[31:0]上有效;在写事务中,表示目标设备已经准备好接收缓冲。

PCI总线使用IRDY#和TRDY#进行传送控制。结合以上内容,也就是说,在读操作中,PCI主设备驱动IRDY#拉低,目标设备驱动TRDY#拉低,方能传输数据;在写操作中,PCI主设备驱动TRDY#拉低,目标设备驱动IRDY#拉低,方能传输数据。

DEVSEL# (Device Selection)信号由目标设备驱动,表示目标设备已经完成了地址译码(告知PCI主设备,其访问对象当前在PCI总线上),但是不表示目标设备可以与主设备进行数据交换。而TRDY#信号表示数据有效,PCI主设备可以向目标设备写入或者从目标设备读出数据。

简介主要信号的作用后,现简述PCI总线事务的时序过程。学习协议的枯燥过程中,一个重要的事情是了解该协议的事务时序,知道主要信号的工作方式;再者就是熟悉读写操作的过程,这也是针对协议编程所当具有的基本知识。

首先,PCI主设备需要发送REQ#信号,通过总线仲裁获得总线使用权(GNT#信号有效),使用以下步骤完成一个完整PCI总线事务,对目标设备进行存储器或者I/O地址空间的读写访问。结合上图“PCI总线事务的时序”。

1.    PCI主设备获得总线使用权之后,将在CLK1的上升沿置FRAME#信号有效,启动PCI总线事务。当PCI总线事务结束后,FRAME#信号将被置为无效。

2.    PCI总线的第一个时钟周期是地址周期,此时PCI主设备将访问的目的地址和总线命令分别驱动到AD[31:0]和C/BE#信号上。

3.    当IRDY#、TRDY#和DEVSEL#都有效后,总线事务将使用数据周期进行数据传递;当IRDY#和TRDY#没有同时有效,PCI总线不能进行数据传递。PCI总线使用这两个信号进行传送控制。

4.    PCI总线支持突发周期(只有存储器读写事务支持),也就是说在地址周期之后可以有多个数据周期。


“PCI”协议基本知识(1)的评论 (共 条)

分享到微博请遵守国家法律