PC 中断管理和运行机制

PC 系列的中断系统尽管有 3 种类型的中断,但当 CPU 响应任意一个中断请求后,其处理过程是完全相同的。

一、中断向量表

所谓中断向量就是中断服务程序的入口地址。不同的中断源要求的中断处理是不相同的。因此,对每一个中断源都要设计一个中断处理程序,以便在 CPU 响应中断后调用对应的中断处理程序。如何找到要调用的中断处理程序入口地址呢?利用中断向量表,可以很快地找到所需的中断处理程序入口地址。

8086/8088 在内存最小地址的 1KB 空间建立了一个中断矢量表,它把中断类型码与该中断源所对应的中断处理程序之间确定了一一对应联系。图 2 给出中断矢量表的安排,表内存放有 256 个中断处理程序入口地址。每个入口地址由 4 个字节组成:两个低字节存放入口地址的偏移量,两个高字节存放它的段基值。待中断响应后,把表中对应的 4 个字节的内容分别送入 IP 和 CS,完成程序转移。因此,只要知道现在响应中断的中断类型码,就可以很方便地从中断矢量表中找到该中断源的处理程序入口地址。设中断类型码为N,那么:

1
2
3
IP(4*N4*N+1)

CS(4*N+24*N+3)

即把中断处理程序的入口地址(偏移量和段基值)分别送入 IP 和 CS。

中断向量表

图 2 中断向量表

中断向量表是每当系统启动期间在内存中建立并初始化的。首先,由 ROM-BIOS 自举程序对向量表初始化,向其写入内中断向量、外中断向量和 ROM-BIOS 软中断向量。其次,由 DOS 的初始化程序设置 DOS 支持的中断向量。没有使用的自由中断向量,则留给应用程序根据需要设置。

中断向量表是中断管理机制的核心。不论系统处理哪一种类型的中断,都与这张中断向量表发生关联。而且对中断的进一步开发应用,也与这张表息息相关。从后面介绍的中断应用中,可以看到,通过对向量表中断向量的修改,应用程序可以接管系统程序,修改或增加系统功能。

二、中断优先级

PC 的中断源有许多个,因此会出现两个问题:一个问题是当同一时刻有若干个中断源发出了中断要求,CPU 先响应哪一个呢?第二个问题是当 CPU 响应某个中断源的中断请求,正在执行其中断处理程序时,又有新的中断源申请中断(中断嵌套的情况),这时,CPU 是响应新的中断,还是不理睬它继续原有中断处理程序的执行呢?

上述两种情况,涉及中断优先级问题。所谓优先级,即在处理问题时,按问题的轻重缓急定义问题处理的先后次序。

对于上述两种情况,8086/8088 是采用中断优先级判别的办法:首先响应优先级高的中断源。每一个中断源都有一个优先级别,它们的优先级高低规定如表 2 所示。

中断优先级别

表 2 中断优先级别

可屏蔽中断 INTR 可能连接有多个中断源,它们的优先级别由 8259 的“优先权判别器”来确定。连接在 8259A 输入端的 IRQ0~IRQ7 各中断源优先级可通过编程方法进行排队。若 IRQ0~IRQ7 上同时有几个中断源提出请求,8259A 的“优先权判别器”进行优先级的判别,在 INTR 中断请求得到响应后,只给出优先级别最高的中断类型码。在中断嵌套中,只有优先级别比正在进行中断处理的优先级别更高时,CPU 才会暂停原有中断处理,响应新的中断请求,待这个新的优先级别更高的中断处理结束后,又返回到原来的中断处理。如果新的中断请求优先级别比正在进行中断处理的优先级低或相同,CPU 就不响应新的中断请求,待原有中断请求结束后,再响应它。

三、中断响应过程

CPU 在每执行完一条指令后,均要查询是否有中断请求。换句话说,当有中断请求时,至少要等到现行指令执行完后才能响应。不管哪一种类型中断的请求,一旦被 CPU 响应,均自动按下面的流程转入中断服务程序去执行。

(1)标志寄存器 F 压栈保护。

(2)关中断(IF=0)和清除跟踪标志(TF=0)。

(3)当前代码段值(CS)和指令位移(IP)依次进栈保存(保护断点)。

根据中断号 n,到中断向量表中取出中断向量置入 CS 和 IP。

到此,CPU 转入由 CS:IP 指向的中断服务程序去执行。中断服务程序的最后一条指令即中断返回指令 IRET 使 CPU 从中断处理程序中返回到断点处继续执行中断前的任务。

四、中断指令

中断指令可以使 CPU 产生中断(软件中断)去执行一个中断处理程序。

  1. 中断指令 INT

    格式:INT TYPE

    功能:SP←SP-2,(SP,SP+1)←F  (标志寄存器 F 内容压栈)

    IF←0,TF←0        (中断标志和单步标志清 0,即关中断和禁止单步)

    SP←SP-2,(SP,SP+1)←CS  (断点的段值压栈)

    SP←SP-2,(SP,SP+1)←IP  (断点的偏移值压栈)

    IP←(TYPE*4,TYPE*4+1)  (从向量表中取中断处理程序入口的偏移量送 IP)

    CS←(TYPE*4+2,TYPE*4+3) (从向量表中取中断处理程序入口的段值送 CS)

    说明:TYPE 为中断类型号,其值在 0~255 范围内。

  2. 中断返回指令 IRET

    格式:IRET

    功能:IP←(SP,SP+1),SP←SP+2  (取回断点偏移值)

    CS←(SP,+1),SP←SP+2  (取回断点段值)

    F←(SP,SP+1),SP←SP+2  (恢复保存的标志寄存器内容)

    说明:IRET 指令是任何类型中断的处理程序的最后一条要执行的指令,它使 CPU 从中断处理程序返回到被中断的程序断点处继续执行。

请参阅

(完)

comments powered by Disqus