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

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

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

读写事务工作过程

PCI总线规范中规定了两类数据传送方式,Posted和Non-Posted(下文简称为P方式和NP方式),对应的有Posted总线事务和Non-Posted总线事务(下文简称P事务和NP事务)。

P事务是一种自顶向下逐级释放资源的模式。当上游总线的数据传输事务到达下一级的PCI桥后,由该PCI桥接管事务,将事务转发到下游总线,同时结束上游总线的事务。本质上,是该PCI桥重新开辟了一个事务转发给下游总线,上游总线就不用管了。

NP事务,则在原则上需要等待数据最终传送到目标设备,返回响应信息之后,才能结束当前的总线事务。

PCI规范中规定,只有存储器写请求可以使用P事务,而存储器读请求、I/O读写请求、配置读写请求只能采用NP事务。采用NP方式的数据传输将更可靠,但是数据传输中对PCI总线资源的占用也十分严重。在NP方式下,总线资源的释放,也是在目标设备的响应信息回送过程中,进行的逐级释放,因此很容易引起PCI总线的拥塞。对于这一特点,PCI桥对NP事务有优化策略,即使用Delayed总线事务来处理NP事务。PCI总线的Delay总线事务由Delay读写请求和Delay读写完成总线事务组成。主要思想是在NP事务的过程中引入Retry周期。Retry周期指的是PCI桥重新发起相同的总线周期。当HOST主桥启动NP方式的PCI读写总线事务后,期后的第一个PCI桥首先使用Retry周期,使HOST主桥择时重新发起相同的总线周期,此时该PCI桥上游的PCI总线将被释放。当该PCI桥继续转发读写请求时使用的便是Delayed总线请求。具体的一个示例过程见书中[P20]


HOST处理器访问PCI设备

对于I/O读写事务和存储器读写事务,要搞清楚I/O地址空间和存储器地址空间的区别。PCI总线域中,有PCI设备的存储器地址空间和I/O地址空间;在存储器域中,有存储器的存储器地址空间和I/O地址空间。但是,是否具有独立的I/O地址空间,因处理器相异。在x86处理器中,是有独立的I/O地址空间的,且存储器域的I/O地址空间和PCI总线域的I/O地址空间相同。但是,仍然要知道区分这两个概念。

处理器对于PCI设备发起的I/O读写请求和存储器读写请求的处理过程是类似的,处理器将其可以访问的存储器域的I/O地址或者存储器地址通过HOST主桥转换为PCI总线域的I/O地址或者存储器地址。书中的[P16下方→P17]详细介绍了处理器访问PCI设备的存储器写事务的处理过程;[P17下方→P18]详细介绍了处理器使用纯粹NP方式访问PCI设备的存储器读事务的处理过程,这个过程清楚地展示了NP方式的一个特点,就是PCI总线在向上传递目标设备的响应时,后方不再使用的总线事务才会关闭(结束)。对于I/O写事务的过程,则是留给读者考虑(I/O读事务和存储读事务的处理过程类似)。

 这里再次给出了图1-1,接下来尝试探讨处理器向PCI设备发起I/O写事务的过程。

以处理器向PCI设备11发起I/O读写操作为例。这里假设事务过程使用的是纯粹的NP方式(没有使用Delayed传送方式)。I/O写总线事务的处理过程如下:

a.    首先处理器将要传递的数据放入通用寄存器中,然后向PCI设备映射到存储器域的地址进行I/O写操作。对于有独立I/O地址空间的处理器(如x86),在事务开始前,x86处理器会将PCI设备使用的I/O地址映射到存储器域的I/O地址空间中,之后处理器可以通过IN、OUT等指令对存储器域的I/O地址进行访问,然后通过HOST主桥将PCI存储器域的I/O地址转换为PCI总线域的I/O地址;对于没有独立I/O地址的处理器,如PowerPC,在HOST主桥初始化的时候,将PCI设备使用的I/O地址空间映射为处理器的存储器地址空间,在请求到来时,HOST主桥再进行地址的转换。

b.    HOST主桥x接收来自处理器的I/O写请求(在HOST主桥x和y应该是经历过一个地址范围的判断),HOST主桥x进行存储器地址到PCI总线域的PCI总线地址的转换,然后向PCI总线x0发起I/O写总线事务;

c.     PCI总线上的所有设备都将监听这个事务,最后PCI桥x1接收这个事务,然后该桥向PCI总线x1发起新的PCI总线I/O写请求。

d.    PCI总线x1上所有的设备都将监听此事务,最后PCI设备11接收此事务,通过设备的控制器接口将事务中的数据写入到指定地址,并将这个写请求总线事务转换为I/O写完成总线事务(回送响应,回应)。“回应”向上传递。

e.    “回应”上传到PCI桥x1时,结束PCI总线x1上的PCI总线事务;

f.     “回应”通过PCI总线x0继续上传到HOST主桥x时,结束PCI总线x0上的PCI总线事务。

g.    HOst主桥x将“回应”传递给处理器,最终结束处理器的I/O写操作。

PCI设备读写主存储器

PCI读写主存储器是DMA过程。在PCI设备的DMA过程中,使用的地址也是PCI总线域的地址,因此当DMA请求到达HOST主桥时候,也需要主桥将地址转换为存储器域的地址。书中[P18下方→P19]的内容详细介绍了PCI设备向主存储器发起DMA读写的过程。根据表1-2 “PCI总线事务”中的说明,PCI总线事务中的Memory Read/Write(存储器读/写)可以是处理器向PCI设备发起的,也可以是PCI设备向处理器发起的。因此,这里的DMA读写操作对应的其实是一种PCI设备对处理器发起的存储器读写总线事务。(I/O读写事务只能是处理器向PCI设备发起的?)

PCI设备处理可以向主存储器发起DMA操作,还可以向其他的PCI设备发起读写操作,不过不常见(目前我的理解是,这中读写事务也算一种存储器读写事务,同样的写事务将使用P方式,读事务将使用NP方式)。

还是参考上面的图1-1,书中介绍了PCI设备11向主存储器发起DMA读写(PCI存储器读写事务)的详细过程[P18-19],以及PCI设备11将数据写入PCI设备01的过程[P19下方],接下来尝试探讨PCI设备11从PCI设备01读取数据的过程。

为方便说明,还是将图1-1放在这里。

a.       PCI设备11将PCI读总线事务发向PCI总线x1上,PCI桥x1和PCI设备12同时监听此总线事务。

b.       PCI桥x1将接收这个总线事务,并将此PCI读总线事务上推到PCI总线x0。

c.       PCI总线x0上的所有设备将监听此PCI读总线事务,最后由PCI设备01接收这个数据请求,并将所需数据通过PCI总线x0传输到PCI桥x1,此时结束PCI总线x0上的读请求总线事务。

d.       PCI桥x1将收到的数据通过PCI总线x1传输给PCI设备11,此时结束PCI总线x1上的总线事务。


总结

好的,PCI总线的知识介绍,告一段落。我把《PCI Express体系结构导读》中第一章关于PCI协议的知识基本都覆盖到了。这个总结的过程对知识有很好的巩固作用,但是效率也低,之后我不会再做这么详细的总结了,而打算采取更为抽象的脑图模式,或者是边看便总结。不过这个付出是值得的,因为PCI协议的知识作为PCIe协议的重要基础,学得再怎么扎实都不过分。


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

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