博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

PCIE背景知识学习(1)

Posted on 2022-09-26 16:40  沉默改良者  阅读(458)  评论(0编辑  收藏  举报

PCIE背景知识学习(1)

1.PCI事务模型

PCI同先前的总线模型一样,在数据传输上使用三种模型:Programmed I/O(PIO)、Peer-to-peer、以及DMA。这些模型的图解如图 1‑6所示,接下来的几个小节将对它们进行描述。

Programmed I/O(PIO)

当一个PCI设备向CPU发出中断,并表示它需要向memory中放入数据,则由CPU最终将数据从PCI设备中读出并放入一个内部寄存器中,然后再将这个内部寄存器的值复制进memory中。反之,如果数据要从memory移动到PCI设备中,那么软件会指示CPU将memory中的数据读出至内部寄存器中,然后再将内部寄存器的值写入到PCI设备中去。

软件与设备交互,Programmed IO仍然是一种必要的事务模型。

Direct Memory Access(DMA)

一旦CPU将起始地址(starting address)和数据字节总量(byte count)写入DMA Engine,DMA Engine将自己处理总线协议与地址排序。

外设自身可以集成入这种DMA功能,这样它们就不再需要一个外部的DMA Engine。这些设备有能力处理自己发起的总线传输,我们将它们称为总线主设备(Bus Master device)。

在数据传输完成后,PCI外设可以产生一个中断来通知系统。DMA提升了数据传输效率,因为这种方式在搬移数据时不需要CPU的参与,那么对于CPU来说,只需要一个总线周期的开销,将起始地址和总数据量写入DMA Engine,即可完成高效的数据块搬移。

Peer-to-Peer(点对点)

如果一个设备能够作为总线主设备,那么它就提供了一个有趣的作用。一个PCI总线Master可以发起针对其他PCI设备的数据传输,而对于PCI总线自身来说这整个事务都是在本地进行的,并未引入任何其他系统资源。因为这个事务是在总线上的两个设备之间进行的,且这两个设备被认为是总线中两个对等的节点,因此这个事务被称作一个“点对点”的事务。

然而,在实际场景中点对点事务很少被使用,这是因为Initiator和Target通常不会使用相同的数据格式,除非二者都是由一个供应商制造的。

因此,数据一般必须要首先发送到memory,在那里由CPU在数据传输到Target之前,对其进行格式转换,而这就阻碍并破坏了点对点传输的设计目标。

 

总线仲裁

在像PCI这种共享总线的体系结构中,各设备需要轮流占用总线,因此当一个设备想要发起事务时必须首先向总线仲裁器请求总线所有权(ownership)。仲裁器将查看当前所有的请求,并使用一些特定的仲裁实现算法来决定哪个Master可以下一个占用总线。

PCI协议规范并没有描述这个仲裁算法,但是有声明这个仲裁必须是“公平”的,不得在访问中差别对待任何一个设备。

 

PCI重试协议(PCI Retry Protocol)

当一个PCI Master发起一个事务,用于访问一个Target设备,而此时Target设备并未处于Ready状态,那么Target就会给出一个事务重试的信号。

 

 

北桥发起一个读memory事务,希望从以太网设备中读取数据。这个以太网设备Target响应这个事务,请求并参与到总线周期中来。然而,这个以太网设备Target此刻并没有立即将数据返回给北桥Master。

这个以太网设备此时有两个办法来推迟这次数据传输。第一个办法就是在数据传输中插入等待态(wait-state)。如果过程中仅需插入少量的等待态,那么数据的传输还能算是比较有效率。但是如果Target设备需要延迟更多的时间(从事务被发起后延迟16个时钟周期以上),那么就需要用第二种办法了,第二种办法就是Target发出一个STOP#信号来表示事务重试(retry)。

Retry操作是通知Master在数据没有传输前就提前结束总线周期。这样做可以防止总线长时间处于等待状态而降低了总线效率。当Master接收到Target发来的Retry请求,Master至少等待2个时钟周期,然后必须重新向总线发起仲裁请求,当再次获得总线的使用权之后重新发起相同的总线周期。

在当前总线Master正在处理Retry的这段时间中,仲裁器可以将总线使用权授予其他的Master,以便于PCI总线能被更有效率的利用起来。

当此前执行Retry的Master再次占用总线并重新启动与此前相同的总线周期时,Target可能也已经准备好了需要传输的数据,并参与到总线周期中进行数据传输。否则,若Target仍然未准备好,那么它将会再次发起Retry,按照这样的流程循环下去直到Master成功完成了数据传输。

PCI断开连接协议(PCI Disconnect Protocol)

当一个PCI Master发起一个事务来访问一个Target,并且如果这个Target可以传输至少一个双字(doubleword,后面使用dw简写)的数据,但是它无法完成整个完整的全数据量的传输,那么它将会在它无法继续进行传输时断开与事务操作的连接。

北桥发起一个突发读memory事务(burst memory read),希望从以太网设备中读取数据。以太网Target设备响应了请求并参与到这个总线周期中来,传输了部分数据,但是随后不久把已有的所有数据都发送光了,却依然没有达到Master需要的数据总量。

以太网设备Target此时有两个选择来延迟数据的传输。第一个选择是在数据传输阶段插入等待态,然后自身也同时在等待收到新增的数据。如果过程中仅需插入少量的等待态,那么数据的传输还能算是比较有效率。但是如果Target设备需要延迟更多的时间(PCI协议规范中允许在数据传输中途最多有8个时钟周期的等待态,这里区别于上一节Retry中的16个周期,那是因为那时传输还没开始,而这8个周期针对的是传输已经开始了一段时间的传输中途等待),Target必须发出断开连接的信号。要断开连接,Target需要在总线周期运行中将STOP#置为有效,这样就能告知Master提前结束总线周期。

Disconnect与Retry的一个区别就在于,Disconnect有数据已经被传输,而Retry则是数据传输根本就没开始。Disconnect这种操作也让总线避免长时间处于等待态。Master至少等待2个时钟周期,然后才能再次向总线发起仲裁请求,当再次获得总线的使用权之后就可以再次访问刚才断开连接的设备地址,继续完成此前断开未完成的总线周期。

在当前总线Master正在经历Disconnect的这段时间中,仲裁器可以将总线使用权授予其他的Master,以便于PCI总线能被更有效率的利用起来。当此前经历Disconnect的Master再次占用总线并准备继续此前未完成的总线周期时,Target可能也已经准备好了需要继续传输的数据,并参与到总线周期中继续完成数据传输。

否则,若Target仍然未准备好,那么它将会再次发起Retry或者Disconnect,然后按照这样的流程循环下去直到Master成功完成了所有数据的传输。