简述
在【x86架构】8259A中断控制器中我们有介绍到,通过8259A中断控制器,系统最多可以连接64个中断源,但是在实际的使用中,如果真的用到8片的8259A,那么系统设计将会非常的困难。因此在实际的使用中,我们一般就使用1片或者2片的8259A芯片,这样就构成最多16个中断(其中一个还是级联用的,所以实际就15个)。
但是,随着计算机系统的发展,需要接入的设备越来越到,尤其是PCI设备的引入,导致中断的个数实在是不够用了,为了解决这个问题,就引入了中断共享的概念,而为了更好的支持PCI设备,又引入了PCI中断(即本文题目中提到的PCI IRQ)。
本文主要介绍这个PCI IRQ。需要注意的是,这个东西需要PCI设备额外的引脚来支持,随着后续MSI中断的引入,PCI IRQ也已经基本上被淘汰,因此本文也属于考古文。
PCI规范中的IRQ说明
下图是PCI规范中规定的设备PIN脚:
需要注意的是红框部分的PIN脚,它们就是用于中断的,它们有以下的特点:
1. 可选的,因为在使用MSI的情况下,中断走PCI协议,不需要额外的引脚来支持;
2. 总共有4个引脚,分贝是ABCD;
3. 对于多功能(Multi-Functions)的设备,会使用到INTA#之外的引脚,否则就只能用INTA#;
以上是硬件上的配置,当确定引脚之后,还需要软件上的配置,这就需要用到PCI配置空间里面的内容,如下所示:
这是PCI的配置空间,红色部分是关于PCI IRQ的配置。
Interrupt Pin:指定使用的是INTA#/INTB#/INTC#/INTD#中的一个,1表示INTA#,2表示INTB#,以此类推;
Interrupt Line:指定该PCI IRQ连接到中断控制器中的哪个中断(比如8259A的中断号,有趣的是,一般8259A中的中断A/B会被流出来给PCI IRQ用,刚好形成了对应关系,不过这种对应并不是必须的)。
中断的路由
PCI规范中的规定比较简单,已经在上面说明。
但是需要注意的是,PCI设备不是直接连接在中断控制器上的,而连接在芯片组(以x86为例)上的。
因此当中断发生之后,是先到芯片组,然后再通过芯片组到中断控制器的,中间需要芯片组的处理,我们将之称为中断路由。
如图所示:
这里的可编程中断路由器就在芯片组中(实际上8259A通常也在芯片组中)。
通过对芯片组的配置,才能将中断对应到8259A上的特定中断上。
至于如何配置这个路由关系,需要根据不同的芯片组来实际设定,可以参考对应芯片组的DataSheet,这里不做说明。
关于中断的处理
这是一个遗留问题。
我们知道系统都不同的中断都会有处理函数,因此对PCI中断也有处理函数。
但是中断时共享的,假设不同设备的INTA#都对应同一个处理函数,那么系统程序该如何来做区分呢?
目前对于这个问题还不是很了解,待研究。
关于这一点,可以参考PCI 中断路由机制中第三节的说明,比较有道理。