CoderMrWu

生活诚可期,爱情价更高!

操作系统的中断机制是什么原理呢?

中断机制操作系统中极为重要的一个部分。操作系统在管理输入输出设备时,在处理外部的各种事件时,都需要通过中断机制进行处理。所以也有人把操作系统称为是由“中断驱动”或者“(中断)事件驱动”的。

由于中断机制的实现必须依靠相关的硬件支持,所以硬件中断装置是操作系统运行环境中的一个极为重要的组成部分。中断的实现是硬件中断装置和相应的中断处理软件共同完成的。在本节中,首先介绍中断的概念,然后叙述中断系统的工作原理,最后分析中断处理的过程。

一、中断与异常的概念

1、中断与异常

(1)中断的概念

所谓中断是指处理器对系统中或系统外发生的异步事件的响应。异步事件是指无一定时序关系的随机发生的事件,如外部设备完成了数据传输任务,某一实时控制设备出现异常情况等。

“中断”这个名称来源于:当发生某个异步事件后,中断了处理器对当前程序的执行,而转去处理该异步事件(称作执行该事件的中断处理程序)。在该异步事件处理完了之后,处理器再转回原程序的中断点继续执行。这种情况很像我们日常生活中的一些情况。例如,某人正在看书,此时电话响了(异步事件),于是用书签记住正在看的那一页(中断点),再去接电话(响应异步事件并进行处理),接完电话后再从被打断那页继续向下看(返回原程序的中断点执行)。

最初,中断技术是用于向处理器报告某个“设备已完成操作”的一种手段,以免处理器不断地测试设备状态而消耗大量宝贵的处理器时间,后来,中断技术的应用越来越广泛。中断是所有要打断处理器的正常工作次序,并要求其去处理某一事件的一种常用手段。我们把引起中断的事件称为中断事件或中断源;中断源向处理器发出的请求信号称为中断请求;而把处理中断事件的程序称为中断处理程序;发生中断时正在执行的程序的暂停点叫作中断断点;处理器暂停当前程序转而处理中断的过程称为中断响应中断处理结束之后恢复原来程序的执行被称为中断返回

一个计算机系统提供的中断源的有序集合一般被称为中断字,这是一个逻辑结构,在不同的处理器有着很不相同的实现方式。在一台计算机中有多少中断源,是根据各个计算机系统的需要安排的。 Intel的x86微处理器能处理256种不同的中断。

为了使得中断装置可以找到恰当的中断处理程序,专门设计了中断处理程序入口地址映射表,又称中断向量表。表中的每一项称为一个中断向量,主要由程序状态字PSW和指令计数器PC的值组成。不同性质的中断源需要用不同的中断处理程序来处理,也就是对应不同的中断向量。通过中断向量,可以找到中断处理程序在内存中的位置。

中断技术解决了主机和外设并行工作的问题,消除了因外设的慢速而使得主机等待的现象,为多机操作和实时处理提供了硬件基础。一般来说中断具有以下作用。

能充分发挥处理器的使用效率。因为输入输出设备可以用中断的方式同处理器通信,报告其完成处理器所要求的数据传输的情况和问题,这样可以免除处理器不断地査询和等待,从而大大提高处理器的效率。

提高系统的实时能力。因为具有较高实时处理要求的设备,可以通过中断方式请求及时处理,从而使处理器立即运行该设备的处理程序(也是该中断的中断处理程序)。所以目前的各种微型机、小型机及大型机均有中断系统。

从用户的角度来看,中断正如字面的含义,即正常执行的程序被打断,当完成中断处理后再恢复执行。这完全由操作系统控制,用户程序不必做任何特殊处理。这一过程可以用图24示意。

(2)异常

最早中断和异常并没有区分,都把它们叫作中断。随着它们的发生原因和处理方式的差别愈发明显,才有了现在的中断和异常之分。

中断是由外部事件引发的,而异常则是由正在执行的指令引发的

2、中断与异常的分类

无论是哪种计算机都有很多中断源,不同的系统依据这些中断源引起的中断特点等方面的不同,划分为若干个不同中断类型。这种分类在不同的系统中往往差异比较大。

典型的中断包括

1)时钟中断,由处理器内部的计时器产生,允许操作系统以一定规律执行函数,如时间片到时、硬件实时钟到时等;

2)输人输出(IO)中断,由LO控制器产生,用于通知一个L/O操作的正常完成或者发生的错误;

3)控制台中断,如系统操作员通过控制台发出命令等;

4)硬件故障中断,由掉电、存储器校验错等硬件故障引起等

异常发生的时间以及位置具有确定性,典型的异常包括:

1)程序性中断,在某些条件下由指令执行结果产生,例如算术溢出、被零除、目态程序试图执行非法指令、访问不被允许访问的存储位置、虚拟存储中的缺页等;

2)访管指令异常,目的是要求操作系统提供系统服务。

由于中断与异常的硬件机制工作原理类似,为方便起见,之后的叙述中以中断涵盖两个概念

二、中断系统

中断系统是现代计算机系统的核心机制之一,它不是单纯的硬件或者软件的概念,而是硬件和软件相互配合、相互渗透而使得计算杋系统得以充分发挥能力的计算模式。

中断的发生会激活很多事件,这包括硬件和软件的方面的事件,所以对于整个中断事件的接收、响应和处理需要有计算机的硬件和软件两方面的配合,共同完成。

可以把中断系统分为两大组成部分:中断系统的硬件中断装置和软件中断处理程序。硬件中断装置负责捕获中断源发出的中断请求,并以一定的方式响应中断源,然后将处理器的控制权移交给特定的中断处理程序。中断处理程序则针对对中断事件的性质而执行相应的系列操作。

1、中断请求的接收

中断系统如何接收中断源的中断请求,这往往因机器而异。不过从原理上讲,它们是通过在计算机硬件的中断逻辑线路和中断寄存器实现的

中断逻辑线路用于接收中断信号,并把收到的中断信号寄存在线路中的硬件触发器中。在中断逻辑线路中有若干个专门接受中断信号的触发器,每个触发器称为一个中断位。通常规定,一个触发器的值为1时,表示该触发器收到中断信号,为0时表示无中断信号。这些触发器的全体称为中断寄存器,所以中断寄存器是由若干个中断位组成的。

在有的计算机中,为了不丢失和区分每个中断信号,对每个中断源都用一个固定的触发器来寄存中断信号。而在有的计算机中,对某些没有得到响应的、不重要的中断信号,就不予保存下来,而把它丢弃掉。

2、中断响应

中断请求的响应机制如下。处理器的控制部件中设置有中断信号扫描结构,它在每条指令执行周期内的最后时刻扫描中断寄存器,查看是否有中断信号到来。若无中断信号,处理器就继续执行下一条指令。若有中断到来,处理器接收由硬件中断装置发来的中断向量代号。

接着,处理器开始为后续的软件处理中断做必要的准备工作:保存中断点的程序执行上下文环境(又称保存现场)。这是因为中断处理结束之后,处理器还要继续被中断程序的执行,所以原有中断点程序执行的所有必要信息都必须保存下来。这个上下文环境通常包括程序状态字PSW、程序计数器PC中的下一条指令位置和一些寄存器的值。它们一般保存在个专门的系统堆栈中。处理器状态此时被切换到管态。

处理器根据中断向量代号查询中断向量表,获得与该中断源相联系的中断处理程序的入口地址,并将PC置成该地址。随后控制权转移到中断处理程序。

整个中断请求的响应过程,如图25所示。

图25中的中断请求响应的工作过程是:

①处理器接收中断信号;

②保护现场,将中断断点的程序状态字PSW和程序计数器PC值存入系统堆栈;

③分析中断向量,取得中断处理程序的入口地址;

④将处理器的PC值置为中断处理程序的入口地址;

⑤调用中断处理程序。

3、中断处理

这里讨论在中断信号已经被中断系统的硬件中断装置接收和响应之后,对应的软件中断处理程序进行中断处理的具体过程

在处理器的控制权转移到中断处理程序之后,中断处理程序开始工作,其中包括检查I/O相关的状态信息,操纵I/O设备或者在设备和内存之间传送数据等。具体的中断处理程序的内容,完全是依据中断请求的类别和要求的不同,而分别设计的。

在中断处理程序结束工作之后,处理器会检测到一条中断返回指令。在执行中断返回指令时,处理器会把原先被中断的程序的上下文环境从系统堆栈中恢复。处理器状态也从管态恢复成被中断时的目态。整个中断处理结束。处理器开始一个新的指令周期,继续执行原来被中断的程序。

上述整个中断信号的接收、响应和处理过程,可以简要地归纳为:接收和响应中断,保护中断断点现场,分析中断向量,调用中断处理程序,中断处理结束恢复现场,原有程序继续执行

4、几种典型中断的处理

这里介绍几种计算机系统中比较典型的中断处理,包括I/O中断、时钟中断、硬件故障中断、程序性中断和系统服务请求(自愿性中断)

(1)I/O中断

I/O中断一般由I/O设备的控制器或者通道发出。I/0中断通常可分成两大类:I/O操作正常结束以及I/O异常。对于前者来说,如果要继续进行I/O操作,则需要在准备好以后重新启动I/O。若请求I/O的程序正处于等待I/O的状态,则应该将其唤醒。对于后者,常常需要重新执行失败的I/O操作,不过这个重试的次数常常有一个上限,因为错误可能由硬 件损伤引起,当重试次数过大的时候,系统将判定硬件故障,并通知管理员。

比如,我们平常在PC上用 CD-ROM观看VCD或DVD的碟片时,有时会碰到读碟出错。在重复读碟几次之后,如果读碟岀错继续,系统就会停止读碟,并报告岀错,甚至退岀碟片。

(2)时钟中断

时钟中断是计算机系统多道能力的重要条件之一(有关时钟的概念,参看本章的后面部分)。时钟中断处理程序通常要做较多的与系统运转、管理和维护相关的工作,它们对于整个系统是非常重要的,主要内容如下。

维护软件时钟。系统有若干个软件时钟,控制着定时任务以及进程的处理器时间配额,时钟中断需要维护,定时更新这些软件时钟。

处理器调度。维护当前进程的时间片软件时钟,并在时间片到时后运行调度程序选择下一个被调度的进程。

控制系统定时任务。通过软件时钟和调度程序定时激活一些系统任务,例如监测死锁、进行系统记账、对系统状况进行审计等。

实时处理,例如产生系统“心跳”,激活系统看门狗等。

当然,在不同的操作系统设计中,时钟中断处理的内容也不一样。很多系统的时钟中断通常只处理软件时钟,并在一定条件下激活系统调度程序。

一般来说,调度程序并不在时钟中断里,因为时钟中断的优先级往往比较高,而且频繁发生,如果时钟中断处理时间过长,就会使一些较低优先级的中断丢失。

(3)硬件故障中断

硬件故障一般是由硬件的问题引起的,排除此类故障通常需要人工的干预,例如复位硬件或者更换设备等。

硬件故障中断处理程序需要做的工作是保存现场,使用一定的手段警告管理员并提供些辅助的诊断信息。此外在高可靠的系统中,中断处理程序还需要评估系统的可用性,并尽可能地恢复系统。

例如,使用 WindowsXP的系统在关键硬件发生故障时,会出现系统蓝屏死机。这时操作系统实际上进入了相应的故障处理程序,并发现这个故障是不可恢复的,于是在屏幕上打印出了发生故障时的程序位置(通常在某个管态驱动程序中),并且开始进行内存转储(将定范围的内存内容写到磁盘上去,实际上是系统发生故障时的全系统“快照”),以备日后进行程序调试级故障诊断。

(4)程序性中断

程序性中断多数是程序指令出错、指令越权或者指令寻址越界而引发的系统保护。它的处理方法可以依据中断是否可以被用户程序自行处理,而分成两类。

第一类为程序性中断,只能由操作系统完成。这种情况多为程序试图做自己不能做的操作引起的系统保护,例如访问合法的但是不在内存的虚地址引发的缺页中断等。这时候的处理一般由操作系统的相关扩展功能模块完成。

第二类为程序性中断,可以由程序自己完成。例如一些算术错误。因为不同的程序可能有不同的处理方法,所以很多操作系统提供由用户自行处理这类中断的“绿色通道”。一般来说,系统调试中断,如断点中断、单步跟踪等,用以支持各种程序的调试,是可以被用户程序处理的。

(5)系统服务请求(自愿性中断)

系统服务请求一般由处理器提供的专用指令(又称访管指令)来激发。例如x86处理器提供int指令,用来激发软件中断,其他的不少处理器则专门提供系统调用指令 syscall执行这些指令的结果是系统被切换到管态,并且转移到一段专门的操作系统程序处开始执行。这种指令的格式通常是指令名加上请求的服务识别号(有时是中断号)。操作系统利用处理器提供的这种接口建立自己的系统服务体系。处理器一般不负责定义系统调用所传递的参数格式。因为不同的系统会提供不同的系统调用,而不同的系统调用需要不同的参数,所以给系统服务例程传递什么样的参数,以及如何传递这些参数都由操作系统规定。

这方面的实例可以看一下 MS-DOS定义的2h号中断的系统服务功能以及参数列表,这可以在有关MS-DOS程序设计的书的附录中查到。

现代操作系统一般不会提供直接使用系统调用指令的接口,通常的做法是提供一套方便、实用的应用程序函数库(又称为应用程序设计接口API。这些函数从应用的较高层面重新封裝了系统调用,一方面屏蔽了复杂的系统调用传参问题(用汇编语言传参),另一方面是高级语言接口,有助于快速开发。还有的系统在更高层面提供了系统程序设计的模板库和类库。

三、中断优先级、中断屏蔽与中断嵌套

1.多级中断与中断优先级

现代的微处理器都提供有多级中断系统,从硬件上看,多级中断系统表现为有多根中断请求线从不同设备连接到中断逻辑线路上。连接在不同中断请求线上的中断信号,表示它们有不同的中断级别。中断信号的级别代表了该中断信号是否具有被优先处理的特权,以及这个特权的大小。可见,在多级中断系统中,硬件决定了各个中断的优先级别。

多级中断的第一个作用是,对各类中断信号依据其紧急程度和重要性划分级别。在需要处理的各类中断信号中,它们的紧急程度和重要性是不同的。系统当然应该优先处理最紧急的或者最重要的中断信号。而中断信号本身的紧急或重要性,则由该中断的级别的高低来标识。在多级中断系统中,在同时有多个中断请求时,处理器接收中断优先级为最高的中断(如果其中断优先级高于当前运行程序的中断优先级时),而忽略其中断优先级较低的中断。比如,计算机的电池即将没有电了,这种掉电中断显然应该有非常高的优先级别。

多级中断的第二个作用是,解决如果有重要程度相当的多个中断信号同时到达时,如何选择首个被处理的中断信号的问题。比如,在一套计算机系统上接有一台打印机和一台扫描仪,在打印机发出了打印完毕的信号的同时,扫描仪也发出了扫描完毕的信号。在一般情况下,这两个中断信号具有同等的优先级。

如果在同一中断级中的多个设备接口中同时都有中断请求时,一般有两种办法可以采用

1)固定的优先数:给每个设备接口安排一个不同的、固定的优先顺序。比如以该设备在总线中的位置来定优先顺序,离处理器近的设备,其优先数高于离处理器远的设备。

2)轮转法:用一个表格,依次轮转响应,这是一个较为公平合理的方法。

2、中断屏蔽

在整个中断系统中,可以允许或者禁止中断系统对某些类别中断的响应。我们已经知道,在程序状态字PSW中设计有中断屏蔽位,主机是否允许响应或禁止某些中断,则由PWS中的中断屏蔽位决定,这些屏蔽位标识了被屏蔽的中断类或者中断。

一旦某个I/O中断被程序状态字PSW中的中断屏蔽位加以屏蔽,那么此时即使有I/O中断信号,处理器也不予响应。

对于被屏蔽的中断信号,通常仍然保存在中断寄存器中,有些可以在以后继续响应,而有些将被简单地丢弃。

很显然,有了中断屏蔽,中断系统中原先由硬件事先给定的中断优先级,就可能发生改变。例如,在一个计算机系统中,由CD-ROM到硬盘的数据传送的优先级别低于硬盘内部的数据操作。但是,如果一旦机器正在进行 CD-ROM到硬盘的数据传送,对硬盘内部的其它数据操作就被暂时屏蔽,这些硬盘操作必须在该 CD-ROM到硬盘的数据传送结束之后才能进行。换句话说,此时 CD-ROM到硬盘的数据传送的优先级别高于硬盘内部的数据操作。

还有一类中断信号是不可屏蔽的,一般这类中断信号属于机器故障中断。比如内存奇偶校验错,以及掉电等使得机器无法继续操作一类的故障。一旦发生这类不可屏蔽的中断,不管程序状态字中的屏蔽位是否建立,处理器都要立即响应这类中断,并进行处理。

3、中断嵌套

一般的计算机系统中都有多个中断源,在这样的系统中,如果一个中断的处理过程中又发生了中断,那么将引起多个中断处理问题。对多个中断的处理策略一般有如下两种。

对于多个中断进行处理的第一种策略是,正当处理一个中断时禁止其他中断,此时系统将对任何新发生的中断置之不理。在这期间发生的中断将保持挂起状态。当处理器再次允许中断时,这个新的中断信号会被处理器检测到,并做出处理。

这种处理方法可以用软件简单地实现,只要在任何中断处理之前使用禁止中断指令,在处理结束之后,再使用开放中断指令就可以了。这样,所有的中断将严格地按照发生的顺序被处理。不过,这样的处理策略没有考虑到中断信号的紧急程度,无法达到比较严格的中断处理时间要求。

对于多个中断进行处理的第二种策略是中断嵌套。即中断按照优先度分级,允许优先级较高的中断打断优先级较低的中断处理过程,于是引起中断处理的嵌套,如图26所示。

只要合适地定义中断的优先级别,第一种策略的弊端大都可以被第二种中断嵌套策略所克服。

由于在中断嵌套中优先级较高的中断可以打断优先级较低的中断处理过程,因此必须把优先级较低的中断处理过程的现场也保存起来。这些被保护现场的次序,与恢复现场的次序正好相反,所以应该采用堆栈作为现场保护区 域。堆栈应该处于系统空间中,以防止被破坏,又称为系统堆栈。

在中断发生时,硬件中断装置将程序状态字PSW、指令计数器PC的值以及其他重要现场信息压入系统堆栈。如果发生中断嵌套,被中断的处理的程序状态字PSW、指令计数器PC的值,以及其他重要现场信息也被压入系统堆栈。

每发生中断嵌套一次,就保护一次被中断的处理过程的现场,进行相关的压栈操作。而每结束一层嵌套的处理时,就从系统堆栈中弹出对应的程序状态字PSW、指令计数器PC的值以及其他重要现场信息,逐层恢复现场。

作为中断嵌套策略的一个例子,考虑在一个系统中存在总线、硬盘以及扫描仪三个设备同时操作时的处理情况。假定三者的中断优先级依次分别为9、5、3,其中数字大的具有较高的优先级。扫描动作的处理从某个时间开始,它的处理时间较长,其间发生了一次网络数据的传送请求,于是扫描仪中断处理被打断,处理器转而去处理网络通信时的总线服务请求。在处理网络通信的总线服务请求期间,用户恰好提交了一个硬盘存储文件的请求。但是因为硬盘中断优先级较低,于是硬盘中断的处理就被推迟到总线请求处理完之后,同时由于它的优先级高于扫描仪的中断,所以对硬盘中断的处理优先于对扫描仪中断的处理。在硬盘中断处理完毕之后,处理器才回到原先对扫描仪中断处理的程序上。这个中断处理的过程中发生了三重中断嵌套。

点赞