中断处理过程
# O% _* O& a2 w' W6 `1 K) R4 H1 V
1.中断处理的基本过程
, y/ R! e1 h) U p
如图5.24所示是PC/AT机
2 U" M+ u2 Y( X% n: @- q; f. v
中断处理的基本过程示意图,
7 }0 P9 P! U! d/ R6 ?
其中略去了一些细节。这个
5 F: M* \# {% x+ d$ z处理顺序保证了表5.3所给
" g! S8 [6 N# v1 O& B5 B出的优先级别。从中可以看
9 }& `- F* u2 m7 s& S6 J
出,只有可屏蔽中断,才需
" B* _4 c" [* y% }要进入中断响应周期,以获
4 K5 n1 K: B0 M& W r. i
取相应的中断类型号,其他
& `2 K( k, A# ~中断的中断类型号或是CPU
+ ^2 Q8 ^ |% C" G1 g& A0 s
自动形成的,或是指令中已
" q: |2 \+ P+ E A/ k: O! [3 q
经给出(软中断),所以直接去执行相应的中断服务程序。
7 i0 R/ A. w7 c! N; [ l, K+ Y8 ?+ n8 B! D0 X
) P: m% m6 r9 a g& G$ Z3 \0 h: L- a+ a5 J! M; ^' z* f/ b
. m* o7 D1 J# s' d7 e
2.外部可屏蔽中断的处理过程
, Z* W4 A9 a) d- t6 S7 _ 对一般用户来说,更关心外部可屏蔽中断(外部硬中断)的处理过程,因为有时需要在系统中加入自己的外部可屏蔽中断。外部可屏蔽中断的处理过程可分为四步。
$ m! ^) I( g4 x
(1)中断请求
9 u( R7 l# t3 X 在:PC/AT机中,ROM-BIOS(操作系统固化在ROM中的部分)将8259A的IRR设置为边沿触发方式。各个外部可屏蔽中断源可随时将IRR相应位置1,由8259A向CPU提出中断请求INTR。
# @7 y# g |0 Y1 b9 x& U (2)中断响应
, Q0 J: f6 d' o 如果CPU执行的不是软中断指令(INT n),也不是溢出指令INTO,或者虽然执行的是INT0指令但溢出标志OF为0,执行指令时没有出现除法错,则在该指令的最后一个总线周期的最后一个时钟周期的开始检测INTR。若INTR有效,且此时中断允许标志IF为1,没有NMI,则在当前指令结束连续运行两个中断响应周期。图5.25所示是中断响应周期的时序图。LOCK信号在第一个中断响应周期为低,表明此时不允许响应DMAC或其他总线主控设备的总线请求。每个中断响应周期都要发出一个中断响应信号INTA。
3 @; ]% U. _* E' j! l+ s& O; r5 p
第一个中断响应信号INTA供8259A内部操作使用。判断IRR中的优先级别,将未被屏蔽的中断请求中优先级最高的所对应的ISR位置1(表明为它服务),把IRR中相应位复位。
/ t% U \5 s& @
如果是从8259A的中断请求优先级别最高,则在第一个INTA结束时,主8259A把从片标识ID送到级联线(CAS2~CASO)上。
0 v; i* @1 G$ Z2 y. Z
第二个INTA期间,8259A将中断类型号送上数据总线。若是从8259A的中断请求优先级别最高,则被从片标识ID选中的从8259A把中断类型号送上数据总线。若在初始化时置成自动中断结束方式,则在第二个INTA结束时复位ISR相应位。
2 w6 s7 f# [8 w( S. B o$ a
在中断响应周期CPU还完成以下操作:
6 G- g2 s# Q, D1 L
·保存CPU状态,即将标志寄存器FR的内容压入堆栈;
- s8 H) u$ S$ W+ {3 K; s·关中断,即将IF(还有TF)清0;
! n3 f2 D9 v; B ·保存断点地址,即将cs、IP的内容压人堆栈;
* m9 |/ z6 c4 {3 F8 a" @ ·中断类型号乘以4,指向存放中断向量的首地址,从中取出中断向量,送cs、IP。
3 M$ f6 L7 E, O 这样,第二个中断响应周期结束后,就开始执行中断服务程序。
$ P! A0 m) E+ B% N* m3 Q/ a! S$ M D
6 {' i% o8 u' o" O' S! g% i
; j% Y9 ^* F( E/ d* G) l2 }
% N' \0 ~; g5 J' p1 U5 \
/ l: T+ W# }' ^' j3 U# ~& x (3)执行中断服务程序
5 J' @$ J3 c# G2 L. y3 s* Y# m+ u cPu经过两个中断响应周期之后,就进入到中断服务程序并执行。为了不破坏主程序被中断时的现场以及允许中断服务期间响应更高级的中断,中断服务程序一般采用以下结构:
. Z# D/ A. d: O1 v4 l ①保护现场:将中断服务程序中要用到的寄存器的内容压入堆栈。
- n1 z, Z* p' v9 } g! Z0 R8 ? ②开中断:允许在本次中断服务期间响应更高级的中断,即允许中断嵌套。
# r' M, M" i% p, O& C# f* ^: b
③中断服务:针对中断源的具体服务。
# l6 p6 _9 |( ]" y( ]& Q' z ④发中断结束命令:将ISR中相应位复位(若初始化时选择了非自动结束方式,则这一步必须做)。
2 E! D- r9 q8 \5 ]" P) C0 F
⑤恢复现场:将保护现场时压人堆栈的内容弹出。
1 d& C' @3 Q& [: k8 K' H
⑥中断返回(IRET指令)。
" Q" P6 g% z: f" W9 B T (4)中断返回
6 D( G: I: c* u 中断服务程序的最后一条指令都应该是中断返回指令(IRET)。执行该指令时,从堆栈中弹出原先在中断响应时压入堆栈的FR、IP、cs的内容,断点地址被送入IP、cs中,于是返回到被打断的程序,继续往下执行。