您的位置:首页 > 其它

中断线 申请 外设——PCI中断路由机制

2016-02-01 00:00 246 查看
/article/7802844.html

PCI中断是可选的,中断是电平触发,低电平有效,集电极开路驱动。中断信号与PCI CLK异步,设备一旦断言为低,则要维持低电平状态,直到驱动程序清除这个中断请求。PCI中断可以为通过链的方式来共享。下文会仔细分析。


1. PCI 中断的硬件组成

如图1所示:在PCI 总线上中断请求信号引出脚有INTA# - INTD#
4个,单功能设备只能使用INTA#,而对于多功能设备,各功能设备可任意接至PCI 总线的四条中断申请线INTA# - INTD#
。与中断密切相关的PCI配置寄存器是中断引脚寄存器(Interrupt Pin:0x3C) 和中断线寄存器(Interrupt
Line:0x3B)。



图1中断的硬件结构

中断引脚寄存器(Interrupt Pin:0x3C)

它是一个8 位的寄存器,由接口设计者根据PCI设备使用的PCI 总线中断引脚(INTA# -
INTD#)来设置:如果设备使用INTA#脚来申请中断,该寄存器应写入1;如果设备使用INTB#脚来申请中断,该寄存器应写入2;如果设备使用
INTC#脚来申请中断,该寄存器应写入3 ;如果设备使用INTD#脚来申请中断,该寄存器应写入4;如果设备不使用中断,该寄存器应写入0,0x05
到0xFF为保留值。

中断线寄存器(Interrupt Line:0x3B):

对于X86 系列的PC 机,各个插槽的INTA# -
INTD#引脚由主板设计者通过可编程路由器接到由主从两个8259A 组成的系统中断控制器的IRQ0 - IRQ15
引脚共计16个引脚中的未使用引脚上。中断线寄存器(Interrupt
Line)用于保存中断路由信息的寄存器,在初始化和配置系统时,HOST把路由信息写入到该寄存器。在PCI
接口卡配置空间中,该寄存器的值表明设备的中断引脚( INTA# - INTD#)被连接到系统中断控制器的哪一个引脚(1RQO
- IRQ15中的哪一个)上了。设备本身不使用这个值,设备驱动和操作系统使用该值来决定中断的优先权和中断矢量信息, 义,值0 —15
对应16个IRQ 引脚号,值255 用于表示“未知”或“没有连接到中断控制器”,值16 到254 保留。例如:某设备的INTA#被路由至IRQ3
脚,其中断线寄存器的值会设置为3。

可编程中断控制器(PIC:Programmable interrupt controller)
是用来检测中断申请。如图1所示。可编程中断路由器集成在PCI/ ISA
桥芯片(南桥)中,并且提供了四个中断输入端INTA#、INTB#、INTC#、INTD#;通过路由器编程可以使其与系统中断控制器的输入端IRQi连接。

INTX#线怎样路由到IRQi 线上,由系统定义。如果系统的中断控制器有四个未使用的中断请求信号脚可供使用,如图1所示的IRQW,IRQX ,IRQY,IRQZ ,下面给出的路由机制可以将所有设备的中断请求均匀地分配到四条IRQ线上。

设:MB = IRQ 引脚号( IRQW:0 ,IRQX:1 ,IRQY:2 ,IRQZ:3) D = 设备号

I = INTX # 线号( INTA#:0 ,INTB#:1 , INTC#:2 , INTD#:3)

MB = ( D + I) MOD 4

在母板上的设备号

在PCI设备上的中断脚

在母板上的中断脚

0,4,8,12,

16,20,24,28

INTA#

IRQW

INTB#

IRQX

INTC#

IRQY

INTD#

IRQZ

1,5,9,13

17,21,25,29

INTA#

IRQX

INTB#

IRQY

INTC#

IRQZ

INTD#

IRQW

2,6,10,14

18,22,26,30

INTA#

IRQY

INTB#

IRQZ

INTC#

IRQW

INTD#

IRQX

3,7,11,15

19,23,27,31

INTA#

IRQZ

INTB#

IRQW

INTC#

IRQX

INTD#

IRQY

如下图2以COM Express的PCI中断路由为例:



图2 COM Express的中断路由

按照上面的中断路由表,图1 设计中四个设备的七个中断的路由情况为:

    设备0 的INTA#, 设备2 的INTC# 连接IRQW

设备1 的INTA#    连接IRQX

设备2 的INTA#, 设备1 的INTB# 连接IRQY

设备3 的INTA#, 设备2 的INTB# 连接IRQZ

如此,通过中断脚和中断线配置寄存器实现了中断的路由和自动配置。


2. PCI 中断共享的处理

系统必须为每个中断提供对应的中断服务程序,所有中断服务程序的入口地址即中断向量通常组织在一起形成一个中断入口表,在WINDOWS
操作系统中该表称为中断描述符表。 由于PCI
的中断是可以共享的,如图1所示,按照路由机制,设备0的INTA#和设备2的INTC#共享IRQW线而在中断入口表中,所有由IRQW线送来的中断中
只能有一个中断,其服务程序的入口存储在系统中断入口表中。那么其他中断服务程序的入口如何组织呢?
这一般应由操作系统决定,通常,如果多个设备使用同一个中断请求线IRQi,则后登记的中断入口会覆盖先登记的服务程序的入口,先登记中断的入口被存储在
后登记中断的服务程序中,依次形成一条链。
按照路由机制,如果系统在建立中断入口表时,先扫描到设备0 的INTA#中断,则设备0 中断服务程序的入口地址先被写入中断入口表中IRQW 对
应的表项,其后又扫描到设备2 的INTC#也使用了IRQW线申请中断,系统便把设备2
的INTC#中断服务程序的入口地址写入中断入口表中IRQW对应的表项,而设备O的INTA#中断服务程序的入口地址保存在设备2的INTC#的中断服
务程序中,如此形成一条链。

当某条IRQ
线有设备申请中断时,CPU首先转入最后登记入口的中断服务中,可查询该设备的中断请求位,若该位被置1,则执行该程序,否则找到下一个共享中断的入口,
转入下一个中断服务程序执行,在该程序中再查询该设备的中断请求位,判断是否是该设备提出的中断,依次类推。

如此实现了中断的共享处理。


3. PCI 中断共享的实现

PCI总线的中断共享由硬件与软件两部分组成。  

硬件上,采用电平触发的办法:中断信号在系统一侧用电阻接高,而要产生中断的板卡上利用三极管的集电极将信号拉低。这样不管有几块板产生中断,中断信号都是低;而只有当所有板卡的中断都得到处理后,中断信号才会恢复高电平。  

软件上,采用中断链的方法:假设系统启动时,发现板卡A用了中断7,就会将中断7对应的内存区指向A卡对应的中
断服务程序入口ISR_A;然后系统发现板卡B也用中断7,这时就会将中断7对应的内存区指向ISR_B,同时将ISR_B的结束指向ISR_A。以此类
推,就会形成一个中断链。而当有中断发生时,系统跳转到中断7对应的内存,也就是ISR_B。ISR_B就要检查是不是B卡的中断,如果是,要处理,并将
板卡上的拉低电路放开;如果不是,则呼叫ISR_A。这样就完成了中断的共享
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: