第2章 操作系统的结构和硬件支持

2.1 操作系统虚拟机

操作系统管理和控制多个用户对计算机系统的软、硬件资源的共享。多用户对系统资源的共享,必然引起资源竞争的问题。操作系统的资源管理程序负责资源的分配与调度,但由于系统资源与资源的请求者相比,总是相对较少,会造成程序处理或进程需要等待。而每个用户或应用程序都希望独自使用整个计算机系统,不会考虑并发使用系统的其他进程。虚拟的概念可以有效地实现资源共享,它使一个给定的物理资源具有更强的能力。

另一方面,计算机系统为了帮助用户既快又方便地解决各种问题,应该能提供一个良好的工作环境,这一环境是由几个部分有机地结合在一起而形成的。首先,为了执行指令和实施最原始、简单的操作,需要硬件这一物质基础。硬件层(或称裸机)是由CPU、存储器和外部设备等组成的。它们构成了操作系统本身和用户进程赖以活动的物质基础和环境。

用户提出的使用要求是多方面的,所需要的功能是非常丰富的。对用户提出的许多功能,特别是那些复杂而又灵活的功能均由软件完成。为了方便用户使用计算机,通常要为计算机配置各种软件去扩充机器的功能,使用户能以透明的方式使用系统各类资源,能得心应手地解决自己的问题。

配置在裸机上的第一层软件是操作系统。在裸机上配置了操作系统后就构成了操作系统虚拟机。

操作系统的核心在裸机上运行,而用户程序则在扩充后的机器上运行。扩充后的虚拟机不仅可以使用原来裸机提供的各种基本硬件指令,而且还可使用操作系统中增加的许多其他“指令”。这些指令统称为扩充机器的指令系统,又称为操作命令语言。操作系统虚拟机的结构如图2.1所示。

图像说明文字

操作系统虚拟机提供了协助用户解决问题的环境,其功能是通过它提供的命令来体现的,用户也是通过这一组命令和操作系统虚拟机打交道的。系统所提供的全部操作命令的集合称为操作命令语言,它是用户和系统进行通信的手段和界面。这一用户界面分为两个方面:操作命令(又称命令接口)和系统功能调用(又称程序接口)。

1.操作命令

操作命令按用户使用计算机的方式的不同可分为以下3种。

(1)键盘命令
分时系统或个人计算机系统中的用户使用键盘命令通过终端设备(或控制台)向系统提出请求,组织自己的程序运行。
(2)作业控制语言
批处理系统中的用户使用作业控制语言编写作业说明书,组织作业的运行或提出对系统资源的申请。
(3)图形化用户界面
以交互方式提供服务的计算机一般具有图形化用户界面。该界面以菜单驱动、图符驱动等方式为用户提供一个友好的、直观的、图文并茂的视窗操作环境。

2.系统功能调用

在用户程序中可以直接使用系统功能调用请求操作系统提供的服务。 若把操作系统看作一台为用户定义的虚拟机,那么,操作命令语言就给出了虚拟机所能执行的“指令”集合,也刻画了相应的虚拟机的功能。

2.2 操作系统的组织结构

操作系统是一个大型的系统软件,对整个计算机系统实施控制和管理,为用户提供灵活、方便的接口。操作系统包括处理机管理、存储管理、输入/输出管理、文件系统等功能模块。那么,如何将这些模块构成一个完整的操作系统?在操作系统活动过程中,这些模块之间如何调用?另外,这些模块如何对外提供接口?这些就是操作系统的结构问题。在设计操作系统时必须按照一般原则对这一软件系统进行统一的组织。操作系统的组织结构应包括模块结构、接口和运行时的组织结构三个方面:①模块结构:描述组成系统的不同功能如何分组和交互;②接口:与系统内部结构密切相关,由操作系统提供给用户、用户程序或上层软件使用;③运行时的组织结构:定义了执行过程中存在的实体类型及调用方式。

2.2.1 操作系统的结构

操作系统是一个大型的程序系统。每个模块包含程序、数据以及该模块对外提供的接口。任何软件设计者的任务都是设计模块以实现所需的功能,定义接口以实现模块间交互,使系统满足正确性、可维护性和性能的要求。 在操作系统设计中,有如下4种设计方法:一体化结构、模块化结构、可扩展内核结构和层次化结构。图2.2给出了这4种结构的示意图。

图像说明文字

图像说明文字

操作系统由内核(核心层)和其他操作系统功能组成。核心层包括操作系统最重要的功能模块(处理机管理、存储管理、设备管理和文件管理,此外还有中断和俘获的处理)。人们讨论操作系统时,往往涉及的是操作系统的内核。所以,在许多场合,操作系统一般指的是操作系统内核。一个操作系统在具体实现时不会十分清晰地采用某一种方式,但主体上会采用这4种方式中的一种。

1.单体结构

在单体结构中操作系统是一组过程的集合,每一过程都有一个定义好的接口,包括入口参数和返回值。过程间可以相互调用而不受约束。这种结构是许多操作系统采用的结构。它的特点是操作系统运行效率高,但这种结构难以理解、难以维护,验证其正确性也十分困难。某种意义上,单体结构即为无结构的操作系统。

AT&T System Ⅴ和BSD UNIX 内核都是采用一体化结构的最具代表性的例子。

2.模块结构

采用模块化结构的系统,其功能是通过逻辑独立的模块来划分的,相关模块间具有良好定义的接口,模块需要封装,数据抽象允许模块隐藏数据结构的实现细节。采用模块化结构来实现操作系统的好处是系统能作为抽象数据类型或对象方法来实现,这样有利于操作系统的理解和维护,缺点是存在潜在的性能退化。

采用模块化方法研究操作系统的例子是面向对象的Choices操作系统。Choices是一个实验性质的操作系统,它是采用面向对象语言设计和建立的。Choices论证了面向对象技术如何用于操作系统的设计和实现,其目标是通过快速原型方法进行各种实验。而实际的商业化操作系统还没有一个是纯粹采用模块化结构来设计实现的。

3.可扩展内核结构

可扩展内核结构将操作系统内核分为基础核心和其他核心功能两部分,基础核心包括公共必需的基本功能集合。这种结构方法也可为特定操作系统定义策略独立模块和特定策略模块两类模块。

在现代操作系统设计中,常采用机制与策略分离的方法,对实现操作系统的灵活性具有十分重要的意义。机制是实现某一功能的方法和设施,它决定了如何做的问题;而策略则是实现该功能的内涵,定义了做什么的问题。如定时器是一个对CPU进行保护的机制,它是一个装置和设施,但对定时器设置多长时间是策略问题。

策略独立模块用来实现微内核,既为基础核心,又可称为可扩展内核。基础核心的模块功能与机制和硬件相关,是支持上层特定策略模块的共性部分。特定策略模块包含能够满足某种需要的操作系统的模块集合,它依靠策略独立模块的支持以反映特定操作系统的需求。这种体系结构支持操作系统中两个新方向:一是在单一硬件平台上建立具有不同策略的操作系统;二是微内核操作系统。

微内核结构基于客户/服务器模型,由微内核和核外的服务器进程组成。微内核一般包括最小的进程管理、主存管理以及通信功能,提供客户程序和运行在用户空间的各种服务器之间的通信能力,通信方式采用消息传递。例如,客户程序请求访问一个文件,那么它必须与文件服务器进行交互。客户程序和服务器之间的交互是通过微内核的消息交换来实现通信的。

图像说明文字

20世纪80年代中期,卡内基-梅隆大学开发了一个采用微内核结构的Mach操作系统。该系统的微内核提供基础的、独立于策略的功能,其他非内核功能从内核移走,以用户进程方式运行。在上层的策略实现中,设计专门的服务器来进行功能扩充。还有一些现代操作系统使用了微内核结构。Tru64 UNIX向用户提供了UNIX接口,它利用Mach内核实现了一个UNIX服务器。实时操作系统QNX也是基于微内核设计的。QNX微内核处理低层网络通信和硬件中断,提供消息传递和进程调度的服务支持。QNX所有的其他服务是以标准进程(以用户模式运行在内核之外)提供的。

4.层次结构

操作系统由若干层组成,每一层提供一套功能,并且该功能仅仅依赖于该层以内的各层,其最终结构与洋葱头相似。洋葱头的中心是机器硬件提供的各种功能,其他各个层次可以看成是一系列连续的虚拟机,而洋葱头作为整体实现了用户要求的虚拟机。

操作系统的层次结构如图2.4所示。图2.4中,与基本机器硬件紧挨着的是系统核(基础核心)。系统核包括初级中断处理、外部设备驱动、在进程之间切换处理机以及实施进程控制和通信的功能,其目的是提供一种进程可以存在和活动的环境。系统核以外各层依次是存储管理层、I/O处理层、文件存取层、资源分配和调度层,它们具有资源管理功能并为用户提供服务。

操作系统的层次结构在操作系统设计中一般只是作为一种指导性原则,因为如何划分操作系统的功能,如何确定各层的内容和调用顺序是十分困难的。对现代操作系统而言,分层结构的限制过于严格,很少采用这种方法来构造操作系统。然而,在设计操作系统时,分层的思想方法是值得借鉴和参考的。

分层操作系统的经典例子是Dijkstra的THE系统,该系统的设计目标是实现一个可证明正确性的操作系统,分层方法提供了一个隔离操作系统各层功能的模型。

图像说明文字

2.2.2 运行时的组织结构

操作系统是一个大型的系统软件,由程序(或称为例程)所组成。操作系统又是一个服务系统,它根据用户的请求而提供服务。在操作系统对计算机系统实施管理和控制的过程中,操作系统的这些例程是如何被调用并提供服务的呢?

在操作系统运行过程中调用一个给定的操作系统的内部例程有两种方式,图2.5说明了这两种调用方式。

第一种方式是系统功能调用方式,将操作系统服务作为子例程来提供,如图2.5(a)所示。操作系统的服务例程以内核功能调用或库函数方式来提供,库函数方式实际上是隐式的内核功能调用,即将内核功能调用通过包装后,以库函数的形式供用户使用。应用程序需要操作系统某个服务功能时,只需调用对应的内核功能或库函数即可。采用这种方式调用操作系统的服务功能时,操作系统被调用的服务例程作为用户进程的子例程(必须通过陷入内核的方式进入操作系统,将在第3章讨论)。

图像说明文字

第二种方式是客户/服务器方式,将操作系统服务作为系统服务进程来提供,服务请求和服务响应是通过消息传递方式来实现的,如图2.5(b)所示。操作系统通过单独自治的系统进程对外提供服务,这种系统进程被称为服务器进程(或称服务器)。应用程序活动时称为应用进程,它需要操作系统某一服务时,向相应的服务器发出请求服务的消息。服务器接收服务请求后,为这一服务请求执行相关例程,然后也以消息形式将结果返回给调用者。提供服务的进程一般称为服务器(sever),调用进程称为客户端(client)。

以客户端/服务器方式实现系统服务有以下优点。

① 适用于分布式系统。分布式系统由分布在不同地理位置的许多节点组成,具有功能分布的特点。众多的用户进程可以通过客户端/服务器模式向相应的服务器提出申请,一个给定的服务器可以由不同的客户进行调用。
② 这种组织结构便于实现多种不同的服务类型,通过Internet提供的各类服务就是很好的例子。
③ 具有较好的容错性。与基于函数调用的组织形式相比,客户端/服务器方式具有更高的容错能力。当一个服务进程崩溃时,操作系统其他的服务可以继续工作。而在服务作为子例程方式中,若出现崩溃将影响整个操作系统。
④ 客户端/服务器组织方式严格进行了功能特性的分离,与相互调用的大型同类函数集合体相比较,使系统易于理解和维护。 客户端/服务器组织结构存在的缺点是:操作系统必须维持许多持久型的服务进程,这些进程要监听和响应各种不同的请求。

2.2.3 操作系统与计算机系统各层次的接口

操作系统处在计算机系统中硬件层(裸机)和其他所有软件之间的位置,它在裸机上运行,又是系统软件和应用程序运行的基础。它与硬件、应用程序和用户都有接口。

具有一体化结构的操作系统提供的接口如图2.6所示,从图2.6中可以看出操作系统提供的多种接口。

图像说明文字

操作系统的最低层与硬件接口,它包含CPU提供的机器指令。操作系统的程序代码被编译成机器指令并运行在裸机上。操作系统要为上层软件和用户程序提供用户接口,用户以受控方式请求操作系统提供的服务;另外操作系统必须响应系统运行时的并发事件,需要两种硬件机制提供的支持,这两种硬件机制是:①处理机的不同状态;②中断和陷入。

操作系统的用户接口包括程序接口和操作接口两种。程序接口(或称编程接口)供用户程序和系统库使用。用户程序需要请求操作系统服务时,可以直接使用操作系统提供的程序接口,也可以通过系统库中的函数调用,间接得到操作系统提供的服务。用户还可以通过操作接口控制和处理程序的运行,这一操作接口通过操作系统提供的命令处理程序来实现,包括键盘命令和图形用户界面两种形式。

2.3 处理机的特权级

2.3.1 处理机的状态及分类

在计算机系统中运行着大量的程序,这些程序可以分为两大类:一类是操作系统的管理程序(如处理机调度程序、主存分配程序、I/O管理程序等);另一类是用户程序。这两类程序的职责不同,前者是管理和控制者,它负责管理和分配系统资源,为用户提供服务。而用户程序运行时,必须向操作系统提出资源请求,自己不能随意取用系统资源,如不能直接启动外部设备的工作,更不能改变机器状态等。对管理者而言,它的工作应该得到保护,操作系统的管理程序不能被破坏,即必须为操作系统提供一个保护环境。

操作系统的管理程序和用户程序在处理机上执行时,二者的职责不同,权限也应不同。为此,根据对资源和机器指令的使用权限,将处理执行时的工作状态区分为不同的状态(或称为模式)。所谓处理机的态,就是处理机当前处于何种状态,正在执行哪类程序。为了保护操作系统,至少需要区分两种状态:管态和用户态。

管态(Supervisor mode):又称为系统态,是操作系统的管理程序执行时机器所处的状态。在此状态下中央处理机可以使用全部机器指令,包括一组特权指令(例如,涉及外部设备的输入/输出指令、改变机器状态或修改存储保护的指令),可以使用所有的资源,允许访问整个存储区。

用户态(User mode):又称为目态,是用户程序执行时机器所处的状态。在此状态下禁止使用特权指令,不能直接取用资源与改变机器状态,并且只允许用户程序访问自己的存储区域。

有的系统还将管理程序执行时的机器状态进一步分为核态和管态,这时,核态(Kernel mode)就具有上述管态所具有的所有权限。管态的权限有所变化,管态允许使用一些在用户态下所不能使用的资源,但不能使用修改机器的状态指令。而无核态的系统,管态执行核态的全部功能。管态比核态权限要低,用户态更低。

为了区分处理机的工作状态,需要硬件的支持。在计算机状态寄存器中需设置一个系统状态位(或称模式位)。若状态位是一位,可以区分两态;若状态位是二位,足以区分三态。若用户程序执行时,超出了它的权限(例如,企图访问操作系统核心数据或企图执行一个特权指令)都将发生中断(程序性中断类型),系统从用户态转为管态,由操作系统得到CPU控制权,处理这一非法事件。这样可以有效地保护操作系统不受破坏。

用户程序请求操作系统服务的正确方式是通过系统功能调用。用户程序执行时,若需要请求操作系统服务,则通过一种受控方式进入操作系统,将用户态转为核态,由操作系统得到控制权,在核态下执行其相应的服务例程,服务完毕后,返回到用户态,让用户继续执行。

2.3.2 特权指令

在核态下操作系统可以使用所有指令,包括一组特权指令。这些特权指令涉及如下几个方面。

① 改变机器状态的指令;
② 修改特殊寄存器的指令;
③ 涉及外部设备的输入/输出指令。

在下列情况下,由用户态自动转向管态。

① 用户进程访问操作系统,要求操作系统的某种服务,这种访问称为系统功能调用;
② 在用户程序执行时,发生一次中断(如I/O完成中断);
③ 在一个用户进程中产生一个错误状态,这种状态被处理为程序性中断;
④ 在用户态下企图执行一条特权指令,作为一种特殊类型的错误,并按情况③处理。

从管态返回用户态是用一条指令实现的,这条指令本身也是特权指令。

2.4 中断及其处理

2.4.1 中断概念及类型

1.中断概念

现代操作系统提供多用户、多任务运行环境,具备处理多个同时性活动的能力。多个应用程序为完成各自的任务都需要获得中央处理机的控制权,它们会在CPU上轮流地运行。系统必须具有能使这些任务在CPU上快速转接的能力,具有自动处理计算机系统中发生的各种事故的能力,还需解决外设和中央处理机之间的通信问题。例如,当外部设备传输操作完毕时,通过发信号通知主机,使主机暂停对现行工作的处理,立即转去处理这个信号所指示的工作。又如当电源故障、地址错误等事故发生时,立即产生信号,通过中断机构引出处理该事故的程序来处理这一事故。当操作员请求系统完成某项工作时,通过发信号的办法通知主机,使它依照信号及相应的参数要求完成这一工作等。总之,为了实现并发活动,为了实现计算机系统的自动化工作,系统必须具备处理中断的能力。

所谓中断,是指某个事件(例如电源掉电、定点加法溢出或I/O传输结束等)发生时,系统中止现行程序的运行、引出处理该事件的程序进行处理,处理完毕后返回断点,继续执行。中断概念如图2.7所示。

图像说明文字

整个中断过程涉及用户程序和操作系统的中断程序这两类程序(中断嵌套除外)。整个过程包括由硬件实现的中断进入、软件的中断处理过程、中断返回(由中断返回指令实现)这几个步骤。而中断过程是由一个中断信号引发的。

2.中断类型

引起中断的事件(或称中断源)有多种,每一个中断事件称为一个中断类型。不同计算机的中断源不尽相同。由于中断类型太多,为了便于管理,操作系统将众多的中断分类,一般按中断功能、中断方式、中断来源不同进行分类。

(1)按中断功能分类

按中断功能不同可以分为下列五类。

① 输入输出中断
输入输出中断是当外部设备或通道操作正常结束或发生某种错误时所发生的中断。例如I/O传输出错、I/O传输结束等。

② 外中断
对某台中央处理机而言,它的外部非通道式装置所引起的中断称为外部中断。例如,时钟中断、操作员控制台中断、多机系统中CPU到CPU的通信中断等。

③ 机器故障中断
当机器发生故障时所产生的中断叫硬件故障中断。例如,电源故障、通道与主存交换信息时主存出错、从主存取指令错、取数据错、长线传输时的奇偶校验错等。

④ 程序性中断
在现行程序执行过程中,发现了程序性质的错误或出现了某些程序的特定状态而产生的中断称为程序性中断。这种程序性错误有定点溢出、十进制溢出、十进制数错、地址错、用户态下用核态指令、越界、非法操作等。程序的特定状态包括逐条指令跟踪、指令地址符合跟踪、转态跟踪、监视等。

⑤ 访管中断
对操作系统提出某种需求(如请求I/O传输、建立进程等)时所发出的中断称为访管中断。

(2)按中断方式分类

在上述这些中断类型中,有些中断类型是随机发生的,并不是正在执行的程序所希望发生的,而有些中断类型是正在执行的程序所希望发生的。从这一角度来区分中断,可以分为强迫性中断和自愿中断两类。

① 强迫性中断
这类中断事件不是正在运行的程序所期待的,而是由某种事故或外部请求信号所引起的。

② 自愿中断
自愿中断是运行程序所期待的事件,这种事件是由于运行程序请求操作系统服务而引起的。
按功能所分的五大类中断中,输入输出中断、外中断、机器故障中断、程序性中断属于强迫性中断类型,访管中断属于自愿中断类型。

(3)按中断来源分类

分析触发不同中断事件的来源,有些来自处理机内部,有些则来自处理机外部。例如,I/O中断和外中断是发生在CPU以外的某种事件,而机器故障中断、程序性中断和访管中断是由CPU内部出现的一些事件引起的。如程序运行时发生了非法指令的错误,程序再运行下去已没有意义。这时CPU产生一个中断迫使当前程序中止执行,转去处理这一事件。这类事件往往与运行程序本身有关。所以,中断类型还可以根据发生中断的来源不同分类,按这种方式分类可以分为中断与俘获两类,或称为外中断与内中断。

① 中断
由处理机外部事件引起的中断称为外中断,又称为中断,在x86中称之为异步中断,它是随着CPU的时钟随机产生的,可能发生在一条指令执行过程中,也可能发生在一条指令执行后。包括I/O中断、外中断。

② 俘获
由处理机内部事件引起的中断称为俘获,在x86中称为异常,也称为同步中断,包括访管中断、程序性中断、机器故障中断。同步中断指的是由CPU控制单元产生,是在一条指令执行完毕后才会发出中断,如执行了一条INT指令。
现代的一些小型机和微型机系统将所有中断按中断来源分为中断和俘获(或称异常)。在同时发生中断和俘获请求时,俘获总是优先得到响应和处理,所以它也称为高优先级中断。中断和俘获除了来源和响应的先后次序不同以外,一般机器处理中断和俘获所使用的机构和方式基本上是相同的。

图像说明文字

2.4.2 向量中断和探询中断

当中断发生时,由中断源自己引导处理机进入中断服务程序的中断过程称为向量中断。微型机一般采用向量中断机制。这一中断过程是自动处理的。为了提高中断的处理速度,在向量中断中,对于每一个中断类型都设置一个中断向量。中断向量就是该类型中断的中断服务例行程序的入口地址和处理器状态字。每一个中断向量包含两个字:第一个字含有中断服务例程入口地址;第二个字是服务程序所用的处理器状态字。

系统中所有中断类型的中断向量放在一起,形成中断向量表。每台计算机的主存地址区有一组存储单元,用于存放中断向量表。在中断向量表中,存放每一个中断向量的地址称为中断向量地址。在向量中断中,由于每一个中断都有自己的中断向量,所以当发生某一中断事件时,可直接进入处理该事件的中断处理程序。

有两类不同的中断机制:向量中断和探询中断。在向量中断中,由于对应每一个中断都有一个独特的标识,所以不需要再经过分析就可直接转到处理该中断的处理程序。而探询中断机制是将系统中的所有中断类型分为几大类,每一大类中都包含若干个中断类型。当产生一个中断信号时,在探询中断机制下,由中断响应转入的是某一大类中断的处理程序入口,例如,转入到I/O中断处理程序入口。对于各种不同的外设发来的中断都会转到这一中断处理程序来。在这一中断处理程序中有一个中断分析例程用来分析、判断应转入哪个具体的设备中断例程。所以,向量中断和探询中断相比,在处理中断时间上可以大大缩短。当然,这一好处是由消耗存储中断向量所占的主存换来的。

2.4.3 中断进入

发现中断源而产生中断过程的设备称为中断装置,又称为中断系统。中断系统的职能是实现中断的进入,也就是实现中断响应的过程。

当中断信号打断了某个用户程序的执行时,即开始了中断进入过程。这时,必须终止当前用户程序的执行,自动地引出处理这一事件的中断处理程序。为了保证用户程序以后还能正确地恢复执行,必须保留该程序的现场信息。为了能自动地引出处理这一事件的中断处理程序,要依据中断类型,通过中断向量表找到该中断处理程序的执行地址。

1.保护现场和恢复现场

现场是指在中断的那一时刻能确保程序继续运行的有关信息。现场信息主要包括:后继指令所在主存的单元号、程序运行所处的状态(是用户态还是管态)、指令执行情况以及程序执行的中间结果等。对多数机器而言,这些信息存放在指令计数器、通用寄存器(或累加器和某些机器的变址寄存器)以及一些特殊寄存器中。当中断发生时,必须立即把现场信息保存在主存中,这一工作被称为保护现场。此工作应由硬件和软件共同完成,但二者各承但多少任务,则因具体机器而异。

由于中断的出现是随机的,而中断扫描机构是在中央处理机每执行完一条指令后,在固定的节拍内去检查中断触发器状态的,因此,中断一个程序的执行只能发生在某条指令周期的末尾。所以,中断装置要保存的应该是确保后继指令能正确执行的那些现场状态信息。

为了确保被中断的程序能从恢复点继续运行,必须在该程序重新运行之前,把保留的该程序现场信息从主存中送至相应的指令计数器、通用寄存器或一些特殊的寄存器中。完成这些工作称为恢复现场。一般系统是在处理完中断之后,准备返回到被中断的那个程序之前,通过执行若干条恢复通用寄存器的指令和一条iret指令来完成这一工作的。

2.程序状态字

程序运行时,它的运行状态不断地发生变化,如程序运行所处的状态(是用户态还是管态)、后继指令的地址、指令执行情况等,这些信息基本上反映了程序运行过程中指令一级的瞬间状态。这些信息是动态变化的、十分重要的。为此,操作系统将这一组信息组织在一起,称为程序状态字,并存放在特定的寄存器中。当程序的执行被打断时,系统能方便地得到这些信息。

程序状态字是反映程序执行时机器所处的现行状态的代码。它的主要内容包括:①程序当前应执行的指令;②当前指令执行情况;③处理机所处的状态;④程序在执行时应屏蔽的中断;⑤寻址方法、编址、保护键;⑥响应中断的内容。

程序状态字如何存放,不同的机器有不同的做法。大型机(如IBM 370机)将程序状态字放在一个称为程序状态字(双字)寄存器中。而小型机或微机则将程序状态字放在两个寄存器中,一个是指令计数器(PC,x86中为CS:IP),一个是处理器状态寄存器(PS,x86中为FLAGS)。

3.中断响应

中断响应是当中央处理机发现已有中断请求时,中止现行程序执行,并自动引出中断处理程序的过程。当发生中断事件时,中断系统必须立即将程序状态字寄存器的内容存放到主存约定单元保存(小型机和微型机一般存放到堆栈中),然后会存放到被打断的程序对应的进程控制块(pcb)中,以备以后需要返回原来被中断的程序时,用它来重新设置指令计数器和处理器状态寄存器,使被中断的程序返回断点继续执行。与此同时,中断系统要自动地找到相应的中断处理程序的程序状态字,并将中断处理程序的指令地址和处理器状态送入相应的寄存器中,于是引出了处理中断的程序。

中断响应的实质是交换用户程序和处理该中断事件的中断处理程序的指令执行地址和处理器状态,以达到如下目的:

① 保留程序断点及有关信息;

② 自动转入相应的中断处理程序执行。

中断响应所需的硬件支持包括指令计数器、处理器状态寄存器、中断向量表和系统堆栈。

下面,举一例说明中断响应过程。设某机器,打印机中断处理程序的向量地址是200、202号单元,分别存放着中断处理程序的入口地址和中断处理时的处理机状态字。系统还提供处理器堆栈和两个专用寄存器,第一个寄存器是指令计数器(PC),其内容是当前运行的程序下一条应执行的指令地址;第二个寄存器是处理机状态字寄存器(PS),其内容是当前正在运行程序的处理机状态字。当发生中断时,指令计数器(PC)和处理机状态字(PS)中的内容自动压入处理器堆栈,同时新的PC和PS的中断向量也装入各自的寄存器中。这时,PC中包含的是打印机中断处理程序的入口地址,它控制程序转向相应的处理。当打印机中断处理程序执行完毕,该程序的最后一条指令是iret(从中断返回),它控制恢复调用程序的环境。中断响应的过程如图2.9所示。这里要说明的一点是,中断和俘获是按中断源的不同(来自处理机内部,还是外部)来区分的。俘获发生时进入操作系统的这一行为习惯上被称为自陷,其处理程序被称为自陷处理程序。虽然中断和俘获的中断来源不同,但中断响应过程是相同的。

整个中断处理的功能是由硬件和软件配合完成的。硬件负责中断响应过程,即发现和响应中断请求,把中断的原因和断点记下来供软件处理时查用,同时负责引出中断处理程序。而中断分析、中断处理等工作则由软件的中断处理程序来完成。

图像说明文字

2.4.4 软件中断处理过程

当硬件完成了中断响应后,由相应的中断处理程序(或自陷处理程序)得到控制权,进入软件的中断处理(自陷处理过程)。这一过程主要有3项工作:

① 保护现场和传递参数;
② 执行相应的中断(或自陷)服务例程;
③ 恢复和退出中断。

图2.10所示为中断处理的一般过程。当程序执行完k+0条指令时发生中断,由中断装置自动记忆断点,并转入虚线方框内的软件中断处理程序进行处理。

图像说明文字

值得一提的是,软件中断处理的首要任务是保护被中断程序的现场,但在中断响应时已保存了被中断程序的PC和PS值,此处还需保护什么? 为什么要分为两个步骤? 这些问题请读者考虑。

中断处理过程中的中断服务这一步是最为庞杂的。因为中断类型是多种多样的,对于每一个中断都应有相应的中断服务例程。下面简单介绍硬件故障中断、程序性中断、外中断、输入输出中断的中断服务的主要内容。

1.硬件故障中断的处理

由硬件故障而引起的中断,往往需要人为干预去排除故障,而操作系统所做的工作一般只是保护现场,防止故障蔓延,向操作员报告并提供故障信息。这样做虽然不能排除故障,但是有利于恢复正常和继续运行。

例如,对于主存故障可做如下处理。主存的奇偶校验装置发现主存读写错误时,产生读主存错的中断事件。操作系统首先停止发生该错误的程序的运行,然后向操作员报告出错单元的地址和错误性质(处理器访问主存错还是通道访问主存错)。

2.程序性中断事件的处理

处理程序性中断事件一般有两种办法。其一,对于那些纯属程序错误而又难以克服的事件,例如地址越界、非管态时用了管态指令、企图写入半固定存储器或禁写区等。操作系统只能将出错的程序名,出错地点和错误性质报告给操作员,请求干预。其二,对于其他一些程序性中断事件,例如溢出、跟踪等,不同的用户往往有不同的处理要求。所以,操作系统可以将这些程序性中断事件交给用户程序,让它自行处理。这时就要求用户编制处理该类中断事件的处理程序。

3.外部中断事件的处理

外部中断是由外部非通道式装置所引起的中断,有时钟中断、操作员控制台中断、多机系统中CPU到CPU的通信中断等。现举两例说明。

(1)时钟中断事件的处理
时钟是操作系统进行调度工作的重要部件。时钟可以分成绝对时钟和间隔时钟(即闹钟)两种。为提供绝对时钟,系统可设置一个寄存器,每隔一定时间间隔,寄存器值加1,例如,每隔20ms将一个32bit长的寄存器的内容加1。如果开始时这个寄存器的内容为0,那么只要操作员告诉系统开机时的年、月、日、时、分、秒,以后就可以知道当时的年、月、日、时、分、秒了。当这个寄存器记满溢出时,即经过232×20ms后,就产生一次绝对时钟中断。此时,系统只要将主存的一个固定单元加1就行了。这个单元记录了绝对时钟中断的次数。
间隔时钟是每隔一定时间(例如20ms)将一个寄存器内容减1(一般用一条特殊指令将指定之值预先置入这个寄存器中),当该寄存器内容为0时,发出间隔时钟中断。这就起到了一个闹钟的作用。例如,某个进程需要延迟若干时间,它可以通过一个系统调用发出这个请求,并将自己挂起,当间隔时钟到来时,产生时钟中断信号,时钟中断处理程序叫醒被延迟的进程。

(2)控制台中断事件的处理
当操作员企图用控制开关进行控制时,可通过控制台开关产生中断事件通知操作系统。系统处理这种中断就如同接受一条操作命令一样。因此,往往是由系统按执行操作命令那样来处理这种中断事件。

4.外部设备中断的处理

外部设备中断一般可分为传输结束中断、传输错误中断和设备故障中断,分别做如下处理。

(1)传输结束中断的处理
传输结束中断的处理主要包括:决定整个传输是否结束,即决定是否要启动下一次传输。若整个传输结束,则置设备及相应的控制器为闲状态;然后,判定是否有等待传输者,若有,则组织等待者的传输工作。

(2)传输错误中断的处理
传输错误中断的处理应包括:置设备和相应控制器为闲状态;报告传输错误;若设备允许重复执行,则重新组织传输,否则为下一个等待者组织传输工作。

(3)故障中断的处理
故障中断的处理主要包括:将设备置成闲状态;并通过终端打印,报告某台设备已出故障。

中断是实现操作系统功能的基础,是构成多道程序运行环境的根本措施。例如,外设完成中断的出现,将导致I/O管理程序工作;申请主存空间而发出的访管中断,将导致在主存中建立一道程序而且开始运行;时钟中断或I/O完成中断,可导致处理机调度程序的执行;只有操作员发出键盘命令,命令处理程序才能活跃……所以,中断是程序得以运行的直接或间接的“向导”,是程序被激活的驱动源。只有透彻地了解中断的机理和作用,才能深刻体会操作系统的内在结构。

目录

同系列书

人邮微信
本地服务
教师服务
教师服务
读者服务
读者服务
返回顶部
返回顶部