七、PCI总线的互斥操作

PCI总线具有互斥访问功能(机制),但该机制并不影响非互斥访问的进行,有时也将次功能成为资源锁定。如此设置时为了将来的处理器可以在几个访问之间保持一个硬件锁,而又不会扰乱像视频数据传输这类实时诗句传输。该机制的实现是基于仅仅锁定那些别原来的锁访问作为目标的PCI资源,同时它与现有的互斥软件是完全兼容的。

资源的锁定是通过LOCK#信号实现的。PCI规定,凡是提供系统存储器的设备必须实现LOCK#信号;尤其是具有可执行存储器的设备更是如此,以保证在该存储器中进行访问的独占性。由于主桥的后面有系统存储器,所以它也必须实现LOCK#信号。

LOCK#的有效预示着一个互斥访问在潜伏进行。当一个设备GNT#有效时,并不能保证它对LOCK#的控制,为获得对LOCK#的控制,需将GNT#信号和LOCK#自身的规程结合起来才能实现。

如果使用了资源锁定,设备的非互斥访问可依然进行而不收限制,那怕此时有另一主设备持有对LOCK#的所有权也没有关系。然而对于兼容性有较高要求时,可利用仲裁器将一资源锁定为总线锁,具体做法时在LOCK#信号放开之前,一直批准有用LOCK#的设备对总线的互斥访问。

在资源锁中,访问的独占性时由被访问的从设备保证的,而不是依靠排斥其它设备对总线的访问。锁的粒度定义为16个对齐的字节,对16个字节内的任何字节进行互斥访问时,都会锁住16个字节的全部,主设备不能通过16个字节之外的地址区显示对16个字节块的锁定。对于目标设备也要能实现锁定,要求最少锁住16个字节块,最大到整个资源。

总之,在PCI总线中,LOCK#信号应遵循以下规则:

1)在地址期,当LOCK#被置为无效时,执行访问的从设备要将自身锁住。

2)一旦建立了锁,目标将保持锁住状态,直到它取样发现FRAME#和LOCK#一起撤销,或者直到发出目标废止。

3)保证LOCk#信号所有者的独占性,一旦锁已经眼里,至少由16个字节,最大可锁住整个资源。

4)锁不能跨越设备界限。

5)锁操作的第一个传输必须时读传输。

6)LOCK#必须在地址期之后的第一个时钟上被设置,并保持设置以继续控制。

7)在数据期结束之前,再试被告知还有锁建立,则LOCK#被释放。

8)无论何种情况,只要一次访问被主、从设备打断时,LOCK#必须释放。

9)在连续的锁操作中,LOCK#必须被置为成一个最小的空闲周期。

7.1、一个互斥访问的开始

如果一个设备需要进行互斥访问时,在它发出REQ#之前应跟踪LOCK#的状态。在任何时候,只要LOCK#有效,主设备就告知LOCK#时忙碌的,只有在FRAME#和LOCK#同时无效时,主设备才提供LOCK#空闲的信息。如果LOCK#处于忙状态,请求互斥访问设备就应等到LOCK#可用时再发REQ#信号。

上图表示一个主设备发送一个互斥访问。LOCK#再地址期之后立即发出,再互斥访问完成之前它一直受该主设备的控制。

一个被锁定的操作状态只有在第一个传输的第一数据期(IRDY#和TRDY#同时有效)完成时才能建立起来。如果从设备未完成数据传输而将第一个对话再试,那么主设备就必须终止传输并释放LOCK#信号。反之,若第一数据期顺利完成,互斥操作就已建立,并且主设备将一直保持LOCK#信号的有效直到互锁操作的完成,除非由于一个错误而引起的提前终止(主设备或从设备废止)。但是在锁操作建立后,目标设备终止中的再试或断开均属于正常终止,如果这种终止情况发生,它仅表明该目标设备目前处于忙碌状体,无法完成要求的数据传输,该目标设备将会在以后空闲时接受访问,同时仍然承认以前的锁操作而排斥其它访问,相应的主设备继续实施对LOCK#的控制权直到当前的互斥访问完成后将其置为无效,此后,其它设备才有可能取得对它的控制权。

7.2、一个互斥访问的延续

下图表示了一个主设备对一个互斥访问的继续。可以看出,在时钟1之前该设备已经在进行互斥反坐,因此在时钟3时LOCK#又一次有效就表明该设备将继续进行互斥访问。具体过程是,当主设备得到访问总线的批准时,就开始对被它以前锁住的从设备进行另外一次互斥访问,但应注意,另外一次互斥访问的锁定状态应重新建立,因此在地址期内要撤销LOCK#,以便锁的重建(见下图时钟2处),下一个LOCK#信号在时钟3发出,被锁设备应当接受并响应这一请求,以保持目标设备的锁状态并允许当前主设备在当前传输完成之后继续拥有对LOCK#信号的控制权。

另外,上述访问的延续也可能还不是整个互斥访问的最终完成,也就是说可能还要进一步延续。如果主设备继续锁操作时,就接着发LOCK#信号,当它完成锁操作时,便在最后数据期之后的时钟5处置LOCK#信号无效。

7.2、锁定状态下非互斥访问的进行

下图给出了一个主设备试图对一个已经被锁住的设备进行非互斥访问的时序关系。

从图中可以看出,当LOCK#在地址期中有效且目标是锁着的时候,目标不会进行任何数据的传输,只是回答一个再试。反之,如果目标设备是未锁的,它就不会理睬LOCK#的有无,只是决定是否响应主设备的访问。另一方面,因为在地址期LOCK#和FRAME#均为有效状态,所以未锁的设备不会进入锁定状态。

7.4、互斥访问的完成

在互斥访问呢的最后一次数据传输器件,如果目标设备接受了请求,LOCK#信号就要撤销。作为主设备可以在互斥操作完成后的任何时刻置LOCK#无效。但是最好(并不是一定)将LOCK#和IRDY#两个信号同时在互斥操作的最后数据结束后撤销,这主要是防止在任何其它时间释放LOCK#后,可能会造成以后的传输被不必要的再试而终止。对于被锁的节点,只要它发现LOCK#和FRAME#都无效时便可自行解锁。

如果一个主设备想要在总线上进行两个相互独立的互斥操作,它就必须能保证这两个互斥操作之间,FRAME#和LOCK#至少有一个时钟周期处于无效状态,从而保证任何被第一个互斥操作锁住的设备能在第二个互斥操作开始之前完全释放(开锁)。

7.5、总线的完全锁定

PCI的资源锁可以转变未一个完全的总线锁,也就是在LOCK#信号有效时,仲裁器不批准任何设备的使用总线请求。如果被锁序列的第一个访问出现再试时,主设备必须撤销它的REQ#和LOCK#信号。当第一个访问完成时,总线就别完全锁定,仲裁器将不会把总线使用权批准给其它任何设备。如果再完全总线锁建好时,仲裁器已经把总线批准给了其它设备,那么这时仲裁器必须撤销它的批准,以保证总线的完全锁定。完全总线锁可能会对系统的性能产生严重影响,尤其时视频子系统。另外,在完全总线锁状态下,所有的非互斥访问在锁操作期间都不能进行,这是显而易见的。

不论是完全总线锁还是完全资源锁,如果遇到系统中由回写式高速缓存时,必须避免死锁问题。这就意味着,支持完全总线锁的仲裁器必须批准高速缓存设备为完成一次回写所发的请求;支持回写高速缓存的从设备即使被锁住也应允许进行回写。

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值