您的位置:首页 > 其它

操作系统的运行机制

2016-11-23 15:04 148 查看
在计算机系统中,操作系统处于中间层,向下管理和控制硬件,向上为外层软件和用户编写的程序提供使用方便、功能强大的服务。操作系统的主要功能就是管理CPU、主存、I/O设备和文件,并提供支持程序并发运行的机制。

通常,操作系统提供的主要功能都是由操作系统内核程序实现的,CPU在运行上层程序时,唯一能进入内核程序运行的途径就是中断或异常

中断和异常

中断和异常时操作系统的重要概念,中断的引入是为了实现CPU和通道(或设备)之间的并行操作,当CPU启动通道(或设备)进入I/O后,通道(或设备)就可以独立工作了,CPU可以去做与此I/O不相关的事情。当通道处理完CPU交付的I/O任务之后就必须告知CPU,让CPU继续处理I/O操作以上的事情。在计算机中,通道(或设备)通过中断机制来告知CPU。

由于众多原因,当CPU在执行指令的时候可能会出现错误,这个错误就称为”异常”。例如,CPU在执行指令时,可能会出现算术一出、零作除数、访存越界等错误。此外,在操作系统中,还提供一种异常指令-陷入指令trap(即陷入指令trap是一种会产生异常的指令),用来实现系统调用(用来实现CPU切换到内核程序运行)。

中断和异常的区别

中断和异常都能用来让CPU切换到内核程序运行,但是两者的是有区别的:

调用方不一样:中断是由硬件来产生,而异常则是由CPU当前执行的指令的实现逻辑发生错误而产生。

中断是一种通知机制,异常是一种错误处理机制。故中断可以被屏蔽或者稍后处理,而异常则不能被屏蔽,并且应当立即处理。

中断/异常的响应和处理

处理机在执行任何指令时都可能产生中断或者异常,那么处理机如何响应中断和异常呢?

中断/异常响应

中断信号是由外部设备或者时钟部件发送给CPU的,为了能及时监测中断信号,通过在CPU的控制部件中增加一个能够监测中断信号的机构来完成。该机构能够在每条机器指令执行周期内的最后时刻扫描中断寄存器询问是否含有中断信号。如果没有中断信号或被信号暂时被屏蔽,CPU继续执行程序的后续指令,否则CPU停止执行当前程序的后续指令,无条件地转入操作系统内核的中断处理程序,我们称该过程为中断响应

异常是在执行指令时,由于指令的逻辑错误造成CPU转入执行操作系统内核的异常处理程序。

和CPU在切换程序运行时一样,CPU在执行异常处理程序或中断处理程序时依旧需要涉及到对当前程序的运行现场进行保护。

断点和恢复点

CPU一旦响应中断,立刻开始执行内核中的中断处理程序,当中断处理程序结束后,重新返回中断点执行后续指令。我们称当中断发生时,CPU刚执行完的那条指令的内存地址称为”断点”。一般情况下,断点应为中断的那一瞬间,CPU的PC寄存器(程序计数器)所指指令的前一条指令的内存地址。而中断时,PC寄存器所指指令的内存地址为恢复点

在异常发生时,返回点(即异常处理程序执行完后,CPU要执行的下一条指令的地址)会因为不同的异常而有所区别:

对于大部分由用户程序指令执行出错而引起的异常,操作系统的处理方式是结束所运行的程序,因此就不会回到用户程序。

如果是通过trap指令进行系统调用,则处理完成后trap指令的下一条指令。

对于虚存系统访存指令的缺页异常,异常处理完后则会返回发生异常的指令重新执行该访存指令,以保证这次访存指令能够顺利执行。

现场保护

CPU在执行程序时,主要操作的时寄存器中的值。所谓现场信息,就是值中断那一时刻确保存放程序继续运行的有关信息,例如PC寄存器、通用寄存器以及一些与程序运行相关的特殊寄存器中的内存(即CPU中与程序运行相关的寄存器的状态)。

现场信息的保护和恢复可由硬件、软件共通完成,现场信息通常保存在操作系统中的与被中断程序相关的数据结构中。

中断/异常响应的CPU模式

中断和异常的处理程序都是操作系统的内核程序,都必须在特权模式下运行,因为这些程序需要访问外设等操作系统管理的资源或者设计系统的管理表格。

在操作系统,我们将在监督程序中CPU的两种模式,监督模式和用户模式,分别称为”核心态”和”用户态”。我们通过在CPU的状态字寄存器中设置一个标识位,根据其当前值为1或0来分别表示处理机处在核心态或用户态。

通常CPU执行两种不同的程序,一种是操作系统内核程序(核心态),另一种是用户自行编写的程序(用户态)或系统外层的应用程序(用户态)。前者是后者的服务者和控制者。

中断/异常处理程序的执行

操作系统为每个中断/异常都创建一个处理程序,并把这些处理程序的入口地址放在主存的特定位置(主存单元),并称这些主存单元为中断/异常向量,或称系统控制块

对于不同的操作系统。中断/异常向量中的内存细节也不完全相同。中断/异常向量的每一个单元中出了存储中断/异常处理程序的入口地址外,还常用来保存CPU状态转换的信息。例如,中断/异常处理程序运行需要用到的新PS寄存器值和新PC寄存器值。

在中断/异常向量中,每一个中断信号占用连续的两个单元:一个用来存放中断/异常处理程序的地址(对应PC寄存器的新值),另一个单元用来存放执行中断/异常处理程序时CPU所处的状态(对应PS寄存器的新值)。当响应中断/异常时,硬件首先将当前PC和PS寄存器的值作为程序现场保存起来,然后再从中断/异常向量中的相应单元取出要放入PC和PS寄存器中的值并放入相应的寄存器。最后再根据PC寄存器中的值去执行中断/异常处理程序

中断

在计算机系统中, 多个中断可能在同一时刻产生,并且还会在前一个中断还未处理完的情况下就产生下一个中断。系统为了保存每个中断信号,通常用一些中断寄存器来将它们保存,为了区分不同的信号源,一般对中断寄存器的各位顺序编号,我们称该编号为中断序号,并且规定其值为1时表示有中断信号,其值为0时表示没有中断信号。

在实时系统中,通过将中断分为不同的级别,我们称为中断优先级,以便系统能够立刻处理实时性要求比较高的中断。级别高的中断享有绝对优先处理的权利:

当级别不同的两个以上中断信号同时产生时,首先处理级别高的中断。

级别高的中断可以打断级别低的中断的处理过程。

当两个级别相同的中断产生时,根据中断寄存器中从左至右的顺序来决定处理顺序。(是不是很像四则运算法则)

在实际的操作系统中,有多少中断级别,每个中断应该被划分到那个级别,这些都由操作系统设计者来决定。通常来说,高速设备的中断优先级高,低速设备的中断优先级低。但是作为交互系统,也要考虑到用户的特殊需求,例如用户在输入指令时,该输入设备就应当设置为较高的中断级别。

某小型机的操作系统把中断级别分为如下三种:

时钟中断的中断优先级为6

磁盘中断的中断优先级为5

终端等其它外设中断的中断优先级为4

中断屏蔽(中断过滤)

计算机中有那么多的屏蔽,但是有时候我们希望CPU在执行一些任务的时候可以过滤一些中断信号,让CPU专注于当前的任务,在一点在很多场景下都很有用,譬如当多个程序同时操纵一块内存的时候很有用。

所谓的”中断屏蔽”通常是指禁止响应中断。在可编程中断控制器中,CPU可以执行特权指令来设置可编程中断控制器的屏蔽码,这样即使硬件发现具有屏蔽码的中断产生,也不会通知处理机,但还是会保存此次中断以便将来屏蔽解除时由CPU来处理. 我们称这种方式为软屏蔽

处理器优先级是指当前CPU正在运行程序的中断响应级别。当处理器处于某一处理器优先级时,就会只允许处理响应级别比该级别高的中断,而屏蔽低于或等于该优先级的中断

系统调用(trap指令)

当用户态下的程序通过trap指令进行系统调用的时候,需要进行调用参数,以便根据系统调用表调用相应的系统调用处理程序。

为了方便高级语言程序使用系统调用,通常提供一个系统调用库,其中包含许多系统调用借口函数,这些函数看上去就是一些普通的子程序,但是实则这些函数往往是有为数不多的几条汇编指令实现的,而且这些汇编指令中必须包含一条trap指令,这样才能保证指令trap指令时处理器控制转移至操作系统内核的相应程序。

使用系统提供的系统调用库函数进行系统调用不但可以使用户不必关心系统调用的细节,而且可以避免由用户直接使用trap指令可能引起的错误。

ABI(Application Binary Interface,应用程序二进制接口)

在进行系系统调用时,系统调用库函数需要向操作系统传递什么样的调用型号?该系统调用需要什么参数?以及如何传递参数(显然是通过寄存器来传递)?如何接收系统调用的返回值(显然也是通过寄存器)等这一系列操作都会在操作系统的ABI文档中说明,例如上层用户应该使用哪些寄存器来传递参数。

事实上,我们可以自己基于操作系统的ABI文档来实现一个系统调用库,这在没有与我们使用的高级语言相对应的系统调用库时极为有用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: