《PCI Express体系结构导读》随记 —— 第I篇 第1章 PCI总线的基本知识(19)

发布时间:2023年12月31日

接前一篇文章:《PCI Express体系结构导读》随记 —— 第I篇 第1章 PCI总线的基本知识(18)

1.4 PCI总线的中断机制

1.4.3?中断请求的同步

在PCI总线中,INTx信号是一个异步信号。所谓异步是指INTx信号的传递并不与PCI总线的数据传送同步,即INTx信号的传递与PCI设备使用的CLK#信号无关。这个“异步”信号给系统软件的设计带来了一定的麻烦。

系统软件程序员需要注意“异步”这个事件,因为几乎所有“异步”事件都会带来系统的“同步”问题。仍以图1-1为例:

当PCI设备11使用DMA写方式,将一组数据写入存储器,该设备在最后一个数据离开PCI设备11的发送FIFO时,会认为DMA写操作已经完成此时,这个设备将通过INTx信号,通知处理器DMA完成

此时处理器(驱动程序的中断服务例程)需要注意,因为INTx信号是一个异步信号,当处理器收到INTx信号时,并不意味着PCI设备11已经将数据写入存储器中,因为PCI设备11的数据传递需要通过PCI桥x1和HOST主桥,最终才能达到存储控制器。

而INTx信号是“异步”发送给处理器的,PCI总线并不知道这个“异步”事件何时被处理。很有可能处理器已经接收到INTx信号,开始执行中断处理程序时,该PCI设备还没有完全将数据写入存储器

因为“PCI设备向处理器提交中断请求”与“将数据写入存储器”分别使用了两个不同的路径,处理器系统无法保证哪个信息率先到达,因此需要“同步”,从而在处理器系统中存在“中断同步”的问题。PCI总线提供了以下两种方法解决这个同步问题。

(1)PCI设备保证在数据到达目的地后,再提交中断请求

显然这种不仅加大了硬件的开销而且也不容易实现。如果PCI设备采用Posted写总线事务,PCI设备无法单纯通过硬件逻辑判断数据什么时候写入到存储器。此时为了保证数据到达目的地后,PCI设备才能提交中断请求,PCI设备需要使用“读刷新”的方法保证数据可以到达目的地,其方法如下:

PCI设备在提交中断请求之前,向DMA写的数据区域发出一个读请求。这个读请求总线事务将被PCI设备转换为读完成总线事务,当PCI设备收到这个读完成总线事务后,再向处理器提交中断请求。PCI总线的“序”机制保证,这个存储器请求会将DMA数据最终写入存储器。

PCI总线规范要求HOST主桥和PCI桥必须保证这种读操作可以刷新写操作(这是关键点)。但问题是,没有多少芯片设计者愿意提供这种机制,因为这将极大地增加他们的设计难度。除此之外,使用这种方法也将增加中断请求的延时。

总之,此种解决方法不可取。

(2)中断服务例程使用“读刷新”方法

中断服务例程在使用“PCI设备写入存储器”的这些数据之前,需要对这个PCI设备进行读操作。这个读操作也可以强制将数据最终写入存储器实际上是将数据写到存储器控制器中。这种方法利用了PCI总线的传送序规则,与第1种方法基本相同,只是这种方法使用软件方式,而第1种方法使用硬件方式

第2种方法也是绝大多数处理器系统采用的方法。程序员在编写中断服务例程时,往往都是先读取PCI设备的中断状态寄存器,判断中断产生的原因之后,才对PCI设备写入的数据进行操作。这个读取中断状态寄存器的过程,一方面可以获得设备的中断状态,另一方面可以保证DMA写的数据最终到达存储器。如果驱动程序不这样做,就可能产生数据完整性问题。产生这种数据完整性问题的原因是INTx这个异步信号

这里也再次提醒系统程序员注意PCI总线的“异步”中断所带来的数据完整性问题。在一个操作系统中,即便中断处理程序没有首先读取PCI设备的寄存器,也多半不会出现问题。因为在操作系统中,一个PCI设备从提交中断到处理器开始执行设备的中断服务例程,所需要的时间较长,处理器系统基本上可以保证此时数据已经写入存储器。

但是如果系统程序员不这样做,这个驱动程序依然有Bug。尽管这些Bug因为各种机缘巧合,始终不能够暴露出来,而一旦这些Bug被暴露出来将难以定位(这种都属于“万里有一”的事情)。为此,系统程序员务必重视设计中的每一个实现细节。

PCI总线V2.2规范还定义了一种新的中断机制,即MSI中断机制。MSI中断机制采用存储器写总线事务向处理器系统提交中断请求其实现机制是向HOST处理器指定的一个存储器地址写指定的数据这个存储器地址一般是中断控制器规定的某段存储器地址范围,而且数据也是事先安排好的数据,通常含有中断向量号。

HOST主桥会将MSI这个特殊的寄存器写总线事务进一步翻译为中断请求,提交给处理器。目前,PCIe和PCI-X设备必须支持MSI中断机制,但是PCI设备并不一定都支持MSI中断机制。MSI中断机制目前虽然在PCIe总线上成为主流,但是在PCI设备中并不常用。即便是支持MSI中断机制的PCI设备,在设备驱动程序的实现中很少使用这种机制。

首先,PCI设备具有INTx#信号可以传递中断,而且这种中断传送方式在PCI总线中根深蒂固其次,PCI总线是一个共享总线,传递MSI中断需要占用PCI总线的带宽需要进行总线仲裁等一系列过程,远没有使用INTx#信号线直接。

但是,使用MSI中断机制可以取消PCI总线这个INTx#边带信号,可以解决使用INTx中断机制所带来的数据完整性问题。而更为重要的是,PCI设备使用MSI中断机制向处理器提交中断请求时,还可以通知处理器系统产生该中断的原因,即通过不同中断向量号表示中断请求的来源。当处理器系统执行中断服务例程时,不需要读取PCI设备的中断状态寄存器,获得中断请求的来源,从而在一定程度上提高了中断的效率。

至此,第1章第4节“PCI总线的中断机制”全部结束。

文章来源:https://blog.csdn.net/phmatthaus/article/details/135308548
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。