中断
中断是指计算机在执行程序的过程中,当出现异常情况或特殊请求时,中断系统将迫使CPU暂停正在执行的程序,转而去进行中断事件的处理,中断处理完毕后,再返回被中断程序的间断处,继续执行原程序。
硬件中断导致处理器通过一个上下文切换(context switch)来保存执行状态(以程序计数器和程序状态字等寄存器信息为主);
软件中断则通常作为CPU指令集中的一个指令,以可编程的方式直接指示这种上下文切换,并将处理导向一段中断处理代码。中断在计算机多任务处理,尤其是实时系统中尤为有用。
问题的提出
如果计算机系统没有中断,则处理器与外部设备通信时,它必须在向该设备发出指令后进行忙等待(Busy waiting),反复轮询该设备是否完成了动作并返回结果,这就造成了大量处理器周期被浪费。
问题的解决
引入中断以后,当处理器发出设备请求后就可以立即返回以处理其它任务,而当设备完成动作后,该设备发送中断信号给处理器,处理器就可以再回过头获取处理结果。这样,在设备进行处理的周期内,处理器可以执行其它一些有意义的工作,而只付出一些很小的、切换上下文所引发的时间代价。
中断向量表
中断向量即中断源的识别标志,可用来存放中断服务程序的入口地址或跳转到中断服务程序的入口地址。
<1> 存放中断服务程序的入口地址
在PC/AT机中,中断向量是指中断服务程序的入口地址,每个中断向量分配4个连续的字节单元,两个高字节单元存放入口的段地址CS,两个低字节单元存放入口的段内偏移量IP。
在PC/AT中,规定内存储器的最低1 KB用来存放中断向量(共256个),称这一片内存区为中断向量表,地址范围是0~3FFH,如图所示:
在PC/AT中由硬件产生的中断标识码被称为中断类型号(当然,中断类型号还有其他的产生方法,如指令中直接给出、CPU自动形成等),即在中断响应期间8259A产生的是当前请求中断的最高优先级的中断源的中断类型号。
中断类型号和中断向量之间有下面的关系:
中断类型号×4 == 存放中断子程序的首地址 == 中断向量
有了存放中断向量的首地址,从该地址开始的4个存储单元中取出的就是中断服务程序的入口。
<2> 跳转到中断服务程序的入口地址 在AVR或ARM微处理器中,中断向量的大小也是4个字节,但其中存放的不是中断服务程序的入口地址,而是可执行的代码。当响应中断时,硬件自动执行相应中断向量处的跳转代码,然后跳转到具体的中断服务程序的入口地址。
中断处理过程
CPU得到中断类型码后,先进行现场保护,主要包括:
<1> 状态寄存器FLAGS压栈
<2> 关闭中断
<3> 将当前代码段寄存器CPSR和程序计数器PC压栈
<4> 现场保护完成后,CPU开始骤翻译中断程序入口地址。在得到中断处理程序地址之后但调用中断处理程序之前,CPU会再检查一下NMI引脚是否有信号,以防在刚才的处理过程中忽略了可能的NMI中断。
<5> 恢复现场
<6> 开中断
中断的屏蔽
中断屏蔽也是一个十分重要的功能,所谓中断屏蔽是指通过设置相应的中断屏蔽位,禁止响应某个中断。这样作的目的,是保证在执行一些重要的程序中不响应中断,以免造成迟缓而引起错误。例如,在系统启动执行初始化程序时,就屏蔽键盘中断,使初始化程序能够顺利进行。这时,敲任何键,都不会响应。当然对于一些重要的中断是不能屏蔽的,例如重新启动、电源故障、内存出错、总线出错等影响整个系统工作的中断是不能屏蔽的。因此,从中断是否可以被屏蔽来看,可分为可屏蔽中断和不可屏蔽中断两类。
中断源
凡是能够引起中断原因或提出中断请求的设备和异常故障均称被称为“中断源”。通常中断源有以下几种:
<1> 外部设备请求中断。一般的外部设备(如键盘、打印机和A / D转换器等)在完成自身的操作后,向CPU发出中断请求,要求CPU为他服务。由计算机硬件异常或故障引起的中断,也称为内部异常中断。
<2> 故障强迫中断。计算机在一些关键部位都设有故障自动检测装置。如运算溢出、存储器读出出错、外部设备故障、电源掉电以及其他报警信号等,这些装置的报警信号都能使CPU中断,进行相应的中断处理。
<3> 实时时钟请求中断。在控制中遇到定时检测和控制,为此常采用一个外部时钟电路(可编程)控制其时间间隔。需要定时时,CPU发出命令使时钟电路开始工作,一旦到达规定时间,时钟电路发出中断请求,由CPU转去完成检测和控制工作。
<4> 数据通道中断。数据通道中断也称直接存储器存取(DMA)操作中断,如磁盘、磁带机或CRT等直接与存储器交换数据所要求的中断。
<5> 程序自愿中断。CPU执行了特殊指令(自陷指令)或由硬件电路引起的中断是程序自愿中断,是指当用户调试程序时,程序自愿中断检查中间结果或寻找错误所在而采用的检查手段,如断点中断和单步中断等。
中断分类
<1> 按中断处理方式,可分为简单中断和程序中断。
l 简单中断采用周期窃用的方法来执行中断服务,有时也称数据通道或DMA;
l 程序中断不是窃用中央处理机的周期来进行中断处理,而是中止现行程序的执行转去执行中断服务程序。
<2> 按中断产生的方式,中断可分为自愿中断和强迫中断。
l 自愿中断即通过自陷指令引起中断,或称软件中断,例如程序自愿中断;
l 强迫中断是一种随机发生的实时中断,如外部设备请求中断、故障强迫中断、实时时钟请求中断和数据通道中断等。
<3> 按引起中断事件所处的地点,中断可分为内部中断和外部中断。
l 外部中断也称为外部硬件实时中断,他由来自CPU某一引脚上的信号引起;
l 内部中断也称软件指令中断,他是为了处理程序运行过程中发生的一些意外情况或调试程序而提供的中断。
<4> 根据微处理器内部受理中断请求的情况,中断可分为可屏蔽中断和不可屏蔽中断。
l 可屏蔽中断(maskable interrupt),硬件中断的一类,可通过在中断屏蔽寄存器中设定位掩码来关闭。
l 非可屏蔽中断(non-maskable interrupt,NMI):硬件中断的一类,无法通过在中断屏蔽寄存器中设定位掩码来关闭。典型例子是时钟中断(一个硬件时钟以恒定频率—如50Hz—发出的中断)。
中断系统的功能
中断系统应具有的功能可归结为中断处理和中断控制。
<1> 中断处理。中断处理包括发现中断请求、响应中断请求、中断处理和中断返回。
<2> 中断控制。中断控制主要是实现中断优先级的排队和中断嵌套。
中断的优先级
一个形象的例子:如果在电话铃响的同时,门铃也响了,那么你将在“接电话”和“开门”这两个中断请求中选择,先响应哪一个请求。这就有一个谁优先的问题。如果“开门”比“接电话”重要(或者说“开门”比“接电话”的优先级高),那么就应该先开门,然后再接电话,接完电话后再回头来继续写信。这就是说,当同时有多个中断请求时,应该先响应优先级较高的中断请求。
此外,如果在响应一个中断,执行中断处理的过程中,又有新的中断事件发生而发出了中断请求,应该如何处理也取决于中断事件的优先级。当新发生的中断事件的优先级高于正在处理的中断事件时,又将中止当前的中断处理程序,转去处理新发生的中断事件,处理完毕才返回原来的中断处理。在上面的例子中,我们假设“开门”比“接电话”的优先级高。在你写信时,电话铃响了,你去接电话,在通话的过程中,门铃又响了。因为“开门”的优先级高,你只能让通话的对方稍等,放下电话去开门。开门之后再回头继续接电话,通话完毕再回去继续写信。而如果“开门”比“接电话”的优先级低,那么在通话的过程中门铃响了也可以不予理睬,通话结束再去开门。
当然,在日常生活中,谁也不会为“开门”和“接电话”规定一个优先级别的高低。但是在计算机中,各种中断事件很多,其优先级都有规定,否则就会乱套。在计算机中,中断事件的优先级是根据事件的实时性、重要性和软件处理的方便性来安排的。