8259A工作原理描述
首先,一个外部中断请求信号通过中断请求线
IRQ
,传输到
IMR
(中断屏蔽寄存器)
,
IMR
根据所设定的中断屏蔽字(
OCW1
),决定是将其丢弃还是接受。如果可以接受,则
8259A
将
IRR
(中断请求暂存寄存器)
中代表此
IRQ
的位置位,以表示此
IRQ
有中断请求信号,并同时向
CPU
的
INTR
(中断请求)
管脚发送一个信号,但
CPU
这时可能正在执行一条指令,因此
CPU
不会立即响应,而当这
CPU
正忙着执行某条指令时,还有可能有其余的
IRQ
线送来中断请求,这些请求都会接受
IMR
的挑选,如果没有被屏蔽,那么这些请求也会被放到
IRR
中,也即
IRR
中代表它们的
IRQ
的相应位会被置
1
。
当
CPU
执行完一条指令时后,会检查一下
INTR
管脚是否有信号,如果发现有信号,就会转到中断服务,此时,
CPU
会立即向
8259A
芯片的
INTA
(中断应答)
管脚发送一个信号。当芯片收到此信号后,判优部件开始工作,它在
IRR
中,挑选优先级最高的中断,将中断请求送到
ISR
(中断服务寄存器)
,也即将
ISR
中代表此
IRQ
的位置位,并将
IRR
中相应位置零,表明此中断正在接受
CPU
的处理。同时,将它的编号写入中断向量寄存器
IVR
的低三位(
IVR
正是由
ICW2
所指定的,不知你是否还记得
ICW2
的最低三位在指定时都是
0
,而在这里,它们被利用了!)这时,
CPU
还会送来第二个
INTA
信号,当收到此信号后,芯片将
IVR
中的内容,也就是此中断的中断号送上通向
CPU
的数据线。
这个内容看起来仿佛十分复杂,但如果我们用一个很简单的比喻来解释就好理解了。
CPU
就相当于一个公司的老总,而
8259A
芯片就相当于这个老总的秘书,现在有很多人想见老总,但老总正在打电话,于是交由秘书先行接待。每个想见老总的人都需要把自己的名片交给秘书,秘书首先看看名片,有没有老总明确表示不愿见到的人,如果没有就把它放到一个盒子里面,这时老总的电话还没打完,但不停的有人递上名片求见老总,秘书就把符合要求的名片全放在盒子里了。
这时,老总打完电话了,探出头来问秘书:有人想见我吗?这时,秘书就从盒子里挑选一个级别最高的,并把他的名片交给老总。
这里需要理解的是中断屏蔽与优先级判定并不是一回事,如果被屏蔽了,那么参加判定的机会也都没了。在默认情况下,
IRQ0
的优先级最高,
IRQ7
最低。当然我们可以更改这个设定,这样在下面有详细描述。
言归正传,当芯片把中断号送上通往
CPU
的数据线后,就会检测
ICW4
中的
EOI
是否被置位。如果
EOI
被置位表示需要自动清除中断请求信号,则芯片会自动将
ISR
中的相应位清零。如果
EOI
没有被置位,则需要中断处理程序向芯片发送
EOI
消息
,芯片收到
EOI
消息后才会将
ISR
中的相应位清零。
这里的机关存在于这样一个地方。优先权判定是存在于
8259A
芯片中的,假如
CPU
正在处理
IRQ1
线来的中断,这时
ISR
中
IRQ1
所对应的位是置
1
的。这时来了一个
IRQ2
的中断请求,
8259A
会将其同
ISR
中的位进行比较,发现比它高的
IRQ1
所对应的位被置位,于是
8259A
会很遗憾的告诉
IRQ2
:你先在
IRR
中等等。而如果这时来的是
IRQ0
,芯片会马上让其进入
ISR
,即将
ISR
中的
IRQ0
所对应的位置位,并向
CPU
发送中断请求。这时由于
IRQ1
还在被
CPU
处理,所以
ISR
中
IRQ1
的位也还是被置位的,但由于
IRQ0
的优先级高,所以
IRQ0
的位也会被置位,并向
CPU
发送新的中断请求。此时
ISR
中
IRQ0
与
IRQ1
的位都是被置位的,这种情况在多重中断时常常发生,非常正常。
如果
EOI
被设为自动的,那么
ISR
中的位总是被清零的(在
EOI
被置位的情况下,
8259A
只要向
CPU
发送了中断号就会将
ISR
中的相应位清零),也就是如果有中断来,芯片就会马上再向
CPU
发出中断请求,即使
CPU
正在处理
IRQ0
的中断,
CPU
并不知道谁的优先级高,它只会简单的响应
8259A
送来的中断,因此,这种情况下低优先级的中断就可能会中断高优先级的中断服务程序。所以在
PC
中,我们总是将
EOI
位清零,而在中断服务程序结束的时候才发送
EOI
消息。
|