从Intel 8086/8088、286、386、486直到Pentium系列微处理器,它们中断系统的结构基本相同,不同之处主要有两点:一是 因CPU的工作模式不同,获取中断向量的方式有所不同;二是因系统的配置不同,所处理的中断类型有差别。本节先讨论80x86的中断系统的结构及中断类 型,然后介绍CPU工作在不同模式下的中断处理方式。
6.2.180x86中断结构及类型
80x86 CPU中断系统的结构示意图。根据中断源与CPU的相对位置关系,可分为外部中断(或硬件中断)和内部中断(或软件中断)两大类。在32位CPU中,把外部中断称为中断,把内部中断称为异常(Exceptions)。
1.中断
中断是指由外部设备触发请求而引起的硬件中断。80x86 CPU的硬件中断有两个:一个是由NMI引脚引入不可屏蔽中断,请求触发方式为上升沿(0到 1的跳变信号)有效;另一个是由INTR引脚引入可屏蔽中断,请求触发方式为高电平有效。但由于多数外部设备的I/O传送中断请求都是通过可屏蔽中断引入 的,而CPU的可屏蔽中断请求(INTR)引脚只有一个,不能满足外部设备的需要,因此在80x86 CPU系统中扩展一片或多片中断控制器8259A协 助CPU管理中断,单片8259A可以管理8级外部中断请求IR0~IR7,在多片级连方式下,最多可以管理64级的外部中断请求(8259A的中断管理 功能见6.3节)。
2.异常
异常是指在CPU执行程序过程中,因各种错误引起的中断,如地址非法、校验出错、页面失效、存取访问控制错、结果溢出、除数为0、非法指令等。根据系统对产生异常的处理方法不同,通常分为下列三种类型。
1)故障(Faults)
故障是指某条指令在启动之后真正执行之前,被检测到异常而产生的一种中断。这类异常是在引起异常的指令执行前产生的,待异常处理完成后继续返回该指令, 重行启动并执行完成。例如,在启动某条指令时要访问的数据未找到(存储出错),这种情况下当前指令被挂起,中断处理之后,由挂起指令处重新启动。
2)陷阱(Tra
ps)
陷阱是在中断指令执行过程中引起的中断。这类异常主要是由执行“断点指令”或中断调用指令(INT n)引起,即在执行指令后产生的异常,在中断处理前要保护设置陷阱的下一条指令的地址(断点),中断处理完毕返回到该断点处继续执行。
3)终止(Abort)
终止通常由硬件错误或系统表出现非法数据引起。异常发生后一般无法确定造成异常指令的准确位置,程序无法继续执行,中断处理须重新启动系统。
以上三类异常的差别主要表现在两个方面:一是发生异常的报告方式,二是异常处理程序的返回方式。故障这类异常的报告是在引起异常的指令执行之前发生的, 待异常处理完毕,返回该指令继续执行;陷阱这类异常的报告是在引起异常的指令执行之后发生的,待异常处理完毕,返回该指令的下一条指令继续执行;终止这类 异常的情况比较严重,它是因为系统硬件或参数出现了错误而引起的,引起异常的程序将无法恢复,必须重新启动系统。
80x86 CPU 最多可以管理256种类型的中断与异常,类型及功能。每一种中断赋予一个中断类型号,其中:中断类型0~17分配给内部中断(类型2除外);中断类型 18~31留作备用,为生产厂家开发软硬件使用;中断类型32~255留给用户,可作为外部设备进行输入输出数据传送时的可屏蔽中断(INTR)请求使 用。
前5个中断类型(类型0~类型4):除法错、单步、NMI、断点、溢出,从8086~Pentium的所有CPU都是相同的,其他中断类型适用于286及向上兼容的386、486及Pentium微处理器。
几种异常类型做简要说明。
类型0:除法出错。当CPU进行除法运算时,若除数为0或商溢出时产生该中断。
类型1:单步。当单步执行标志TF1且IF1时,每执行一条指令就引起一次中断。
类型3:断点。这是一个特殊的单字节断点指令INT 3,常用于调试程序时存储程序的断点。当CPU执行该指令时,则产生“断点指令”中断,将下一条指令的地址入栈保存。
类型4:溢出。当执行INTO指令且溢出标志OF1时产生该中断。
类型5:越界。当CPU执行BOUND指令时,检测到操作数超越边界时产生该中断。