操作系统(二)——操作系统的运行环境

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Alexshi5/article/details/87927273

一、处理器

1、处理器的构成与基本工作方式

        处理器一般由运算器、控制器、一系列的寄存器以及高速缓存构成。其中运算器实现指令中的算术和逻辑运算;控制器负责控制程序运行的流程,包括取指令、维护处理器状态、处理器与内存的交互等;寄存器是一种暂时存储器件,用于处理器执行指令的过程中暂存数据、地址以及指令信息。在计算机的存储系统中,寄存器具有最快的访问速度,但因为寄存器集成在微处理器芯片中,所以它的造价比较高,存储容量也比较小。

(1) 处理器中的寄存器

        在处理器内通常有两类寄存器:一类称为用户可见寄存器。对于高级语言来说,编译器通过一定的算法分配并使用这些寄存器,以最大限度地减少程序运行时访问内存储器的次数,这对程序的运行速度影响很大。第二类称为控制和状态寄存器,它们用于控制处理器的操作,一般由具有特权的操作系统代码使用,以控制其他程序的运行。

        通常用户可见寄存器对所有程序都是可用的,由机器语言直接引用,它一般包括数据寄存器、地址寄存器以及条件码寄存器。数据寄存器主要用于各种算术逻辑指令和访存指令;地址寄存器用于存储数据及指令的物理地址、线性地址或者有效地址,用于某种特定方式的寻址;条件码寄存器保存处理器操作结果的各种标记位,如算术运算产生的溢出、符号等,这些标记在条件分支语句中被测试,以控制程序指令的流向。

        处理器中有很多寄存器用于控制处理器的操作,这些寄存器大部分对于用户是不可见的,但可以在某种特权状态下访问,由操作系统使用。最常见的控制和状态寄存器有程序计数器,它记录了将要取出的指令的地址;指令寄存器,它包含了最近取出的指令;程序状态字(PSW),它记录了处理器的运行模式等。

(2) 指令执行的基本过程

      最简单的处理指令方式包括两个步骤:首先,处理器每次从存储器中读取一条指令,并在取指令完成后,根据指令类别自动将程序计数器的值变成下一条指令的地址,通常是自增1;其次,取到的指令被存储在处理器的指令寄存器中,处理器于是解释并执行这条指令。一个这样的指令处理过程被称为一个指令周期。

        指令大致可以分为五类:访问存储器指令,它们负责处理器和存储器之间数据传送;I/O指令,它们负责处理器和I/O模块之间的数据传送以及命令发送;算术逻辑指令,有时又称为数据处理指令,用以执行有关数据的算术和逻辑操作;控制转移指令,这种指令可以指定一个新的指令的执行起点;处理器控制指令,这种指令用于修改处理器状态,改变处理器的工作方式等。

2、特权指令和非特权指令

        在多用户和多任务的多道程序设计环境中,它的指令系统中的指令必须区分为两个部分:特权指令和非特权指令。特权指令,是指在指令系统中那些只能由操作系统使用的指令;非特权指令是指用户使用的指令。

        只有操作系统才能使用所有指令(特权指令和非特权指令),如果一个用户程序需要使用特权指令,一般将引起一次处理器状态的切换,这时处理器通过特殊的机制,将处理器状态切换到操作系统运行的特权状态,然后将处理权移交给操作系统中的一段特殊代码,这个过程被称为陷入。

3、处理器的工作状态

(1) 管态和目态

        多数操作系统将处理状态划分为管态和目态。前者一般指操作系统管理程序运行的状态,具有较高的特权级别,又称为内核态、特权态、系统态;后者一般指用户程序运行时的状态,具有较低的特权级别,又称为用户态、普通态。

        当处理器处于管态时全部的指令都可以执行,可使用所有资源,并具有改变处理器状态的能力。当处理器处于目态时,就只有非特权指令才能够执行。不同处理器状态之间的区别就在于赋予运行程序的特权级别不同,可以运行的指令集合也不相同。一般来说,特权级别越高,可以运行的指令集合越大,而且高特权级别对应的可运行指令集合包含低特权级别。

(2) 处理器工作状态的转换

① 目态到管态的转换

        其转换的唯一途径是通过中断。中断响应时交换中断向量,新的中断向量中的PSW的处理器状态位标志为管态。

② 管态到目态的转换

        可通过设置PSW指令(修改程序状态字),实现从操作系统向用户程序的转换。系统在启动时,处理器的初始状态为管态,然后装入操作系统程序,当操作系统退出执行时,让用户程序在目态执行。

(3) 限制用户程序执行特权指令

        用户程序中不能使用特权指令,所以当用户程序占用处理器时,应让处理器在目态下工作。若此刻取到了一条特权指令,则处理器将拒绝执行该指令,并形成一个“非法操作”事件。中断机制识别到该事件后,转交给操作系统去处理,由操作系统通知用户:“程序中有非法指令”。

4、程序状态字(PSW)

        为了解决处理器当前工作状态的问题,所有的处理器都有一些特殊的寄存器,用以表明处理器当前的工作状态。比如用一个专门的寄存器来指示处理器状态,称为程序状态字(PSW);用程序计数器(PC)这个专门的寄存器来指示下一条要执行的指令。

        处理器的状态字(PSW)通常包括以下状态代码:

① CPU的工作状态代码 —— 指明当前处理器的工作状态是管态还是目态;

② 条件码 —— 反映指令执行后的结果特征;

③ 中断屏蔽码 —— 指出是否允许中断。

二、计算机系统硬件部件

1、存储系统

(1) 存储器的类型

① 类型

        在微型计算机中使用的半导体存储器基本上可以划分为两类:一种是读写型的存储器,另一种是只读型的存储器。

        所谓读写型的存储器,是指可以把数据存入其中任一地址单元,并且可以在以后的任意时候把数据读出来,或者重新存入新的数据的一种存储器,这种类型的存储器通常被称为随机访问存储器(RAM)。

        另一种是只读型的存储器,只能从其中读取数据,但不能随意的用普通的方法向其中写入数据,如果要向其中写入数据只能使用特殊的方法进行,这种类型的存储器被称为只读存储器(ROM)。

② 存储分块

        存储的最小单位为“二进位”,它包含的信息为0或1。存储器的最小编址单位是字节,一个字节包括8个二进位。1024个字节被称为1KB,1024KB被称为1MB,1024MB被称为1GB,等等。

        为了简化对存储器的分配和管理,在不少计算机系统中把存储器分成块,在为用户分配内存空间时,以块为最小单位,这样的块有时被称为物理页。而块的大小随机而异,512B、1KB、4KB、8KB的都有,也有其他大小的。

(2) 存储器的层次结构

① 容量、速度和成本的匹配

        计算机存储系统的设计主要考虑三个问题:容量、速度和成本。一般来说,这三个目标不可能同时达到最优,需要做权衡。为了解决这个设计问题,可以采用层次化的存储体系结构。从整个系统来看,在计算机系统中的层次化存储体系是由寄存器、高速缓存、内存储器、硬盘存储器、磁带机和光盘存储器等装置构成。当沿着层次下降时,每比特的价格将下降,容量将增大,速度将变慢,而处理器的访问频率也将下降。

② 存储访问局部性原理

        在程序执行时,处理器为了获取指令和数据而访问存储器,由于现代程序设计技术很注重代码的复用,于是程序中会有很多的循环和子程序调用,一旦进入这样的程序段,就会重复存取相同的指令集合,对数据存取也有类似的局部现象。在经过一段时间以后,使用到的代码和数据的集合会改变,但在较短的时间内它们能比较稳定的保持在一个存储器的局部区域中,处理器也主要和存储器的这个局部打交道。

(3) 存储器保护

        要实现存储器保护,必须要有硬件的支持。界地寄存器是一种被广泛使用的存储保护技术,其方法是在处理器设置一对界限寄存器来存储该用户作业在内存中的下限和上限地址,分别称为下限寄存器和上限寄存器。每当处理器要访问内存时,硬件自动将被访问的内存地址与界限寄存器的内容进行比较,以判断是否越界。如果发生了越界,将产生程序中断 —— 越界中断或称为存储保护中断。

2、I/O部件

(1) I/O结构

        在早期的计算机系统中,外部设备的控制器通过I/O硬件结构与中央处理器进行连接,对设备控制器的操作是通过直接发出I/O指令来实现的。在这种方法中,中央处理器定期轮询各个I/O设备控制器的状态,如果有I/O处理请求,中央处理器就处理I/O操作,直到该I/O处理完毕。这种工作方法的缺陷是,处理器为了关注I/O设备控制器的状态,必须耗费大量的时间轮询各个外部设备以获取信息,这严重降低了整个系统的性能。

(2) 通道

        通道是独立于中央处理器的,专门负责数据I/O传输工作的处理单元。从现代计算机系统的结构上看,各种外部设备均配有相应的设备控制器,这些设备再通过通道连接在计算机系统的公共系统总线上。而通道则对外部设备实行统一的管理,它代替处理器对I/O操作进行控制,从而使用处理器和外部设备可以并行工作。所以,通道又被称为I/O处理器。

        在外部设备工作结束后,会产生一个I/O中断事件,然后由操作系统的处理程序来处理这个I/O中断事件,操作系统进行分析后,就可以知道外部设备的具体工作情况。

        采用通道这种I/O结构的最大优点,就是可以实现中央处理器与外部设备并行工作。

(3) DMA技术

        直接存储器访问(DMA)技术通过系统总线中的一个独立控制单元——DMA控制器,自动地控制成块数据在内存和I/O单元之间的传送。当处理器需要读写一整块的数据时,它给DMA控制单元发送一条命令,在命令中通常包含了I/O设备的编址、开始读或写的内存编址、需要传送的数据长度、是否请求一次读或写信息。处理器在给DMA控制单元发送完一条命令之后,就可以处理其他的事情了,而DMA控制器将自动管理整块数据的传送。当这个传送过程完成后,它会给处理器发一个中断,这样处理器只需要在整块数据开始传送和传送结束时关注一下就可以了。因此,DMA技术大大提高了处理I/O的效率。

(4) 缓冲技术

        缓冲技术是用在外部设备和其他硬件设备之间的一种数据暂存技术,它利用存储器件在外部设备中设置了一个数据存储区域,称为缓冲区。

        缓冲技术主要有两种用途:一是用在外部设备与外部设备之间的通信上,二是用在外部设备与处理器之间。采用缓冲技术最根本的原因是:处理器处理数据速度与数据传输速度不匹配,需要用缓冲区来缓解其间的速度矛盾。比如,当我们从键盘输入设备输入数据时,通常是先把数据送入到键盘数据缓冲区,然后处理器再把数据从缓冲区读入用户工作区中进行处理。

        为了提高设备利用率,通常会使用两个或多个缓冲区。

3、时钟部件

        在计算机系统中,设置时钟的作用如下:

① 在多道程序的运行环境中,时钟可以为系统发现一个陷入死循环的作业,从而防止机时的浪费;

② 在分时系统中,用时钟间隔来实现各个作业按时间片轮转运行;

③ 在实时系统中,按要求的时间间隔输出正确的时间信号给相关的实时控制设备;

④ 定时唤醒按照事先给定的时间执行的各个外部事件;

⑤ 记录用户使用各种设备的时间和记录某个外部事件发生的时间间隔;

⑥ 记录用户和系统所需要的绝对时间,即年、月、日。

        时钟一般分为硬件时钟和软件时钟。

        硬件时钟的工作原理是,在电路中的晶体振荡器,每隔一定的间隔产生固定的脉冲频率,时钟电路中的时钟寄存器依据时钟电路所产生的脉冲数,对时钟寄存器进行加1的工作。

        软件时钟的工作原理是,利用内存单元模拟时钟寄存器,并采用一段程序来计算相应的脉冲数,对内存时钟寄存器进行加1或减1的工作,从而模拟了时钟的功能。

三、中断机制

1、中断与异常的概念

(1) 中断与异常

        所谓中断是指处理器对系统中或系统外发生的异步事件的响应。异步事件是指没有时序关系的随机发生的事件。当发生某个异步事件后,中断了处理器对当前程序的执行,而转去处理该异步事件,在该异步事件处理完了之后,处理器再转回原程序的中断点继续执行。

        我们把引起中断的事件称为中断事件或中断源;中断源向处理器发出的请求信号称为中断信号;把处理中断事件的程序称为中断处理程序;把发生中断时正在执行的程序的暂停点称为中断断点;处理器暂停当前程序转而处理中断的过程称为中断呼应;中断处理之后恢复原来程序的执行称为中断返回。

        一个计算机系统提供的中断源的有序集合一般称为中断字,这是一个逻辑结构,在不同的处理器有着不同的实现方式。

        为了使得中断装置可以找到恰当的中断处理程序,专门设计了中断处理程序入口地址映射表,又称中断向量表。表中的每一项称之为中断向量,主要由程序状态字PSW和指令计数器PC的值组成。

        中断技术解决了主机和外设并行工作的问题,消除了因外设的慢速而使得主机等待的现象,为多机操作和实时处理提供了硬件基础,它能够充分发挥处理器的使用效率,提高系统的实时能力。

        中断是由外部事件引发的,而异常则是由正在执行的指令引发的。它们的硬件机制工作原理非常类似。

(2) 中断与异常的分类

典型的中断包括:

① 时钟中断,它是由处理器内部的计时器产生,它允许操作系统以一定规律执行函数;

② I/O中断,它由I/O控制器产生,用于通知一个I/O操作的正常完成或发生的错误;

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

④ 硬件故障中断,如断电、存储器检验错误等。

典型的异常包括:

① 程序性中断,它在一定条件下由指令执行结果产生,如算术溢出、被零除等;

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

2、中断系统

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

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

(1) 中断请求的接收

        中断系统接收中断源的中断请求,是通过在计算机硬件中的中断逻辑线路和中断寄存器来实现的。中断逻辑线路用于接收中断信号,并把收到的中断信号寄存在线路的硬件触发器中,每个触发器称为一个中断位,一个触发器的值为1时,表示该触发器收到中断信号,为0时表示无中断信号。这些触发器的全体称为中断寄存器,所以中断寄存器是由若干个中断位组成的。

(2) 中断响应

        处理器的控制部件中设置有中断信号扫描结构,它在每条指令执行同期的最后时刻扫描中断寄存器,查看是否有中断信号到来。若无中断信号,处理器就继续执行下一条指令。若有中断到来,处理器接收由硬件中断装置发来的中断向量代号。然后,处理器保存中断点的程序执行上下文环境,一般保存在一个专门的系统堆栈中。处理器状态此时被切换到管态。之后,处理器根据中断向量代号查询中断向量表,获得与该中断源相联系的中断处理程序的入口地址,并将PC置成该地址,随后控制权转移到中断处理程序。

(3) 中断处理

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

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

 

 综上所述,整个中断信号的接收、响应和处理过程,可以归纳为:

① 接收和响应中断;

② 保护中断断点现场;

③ 分析中断向量;

④ 调用中断处理程序;

⑤ 中断处理结束恢复现场;

⑥ 原有程序继续执行。

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

(1) 多级中断与中断优先级

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

        多级中断的第一个作用是,对各类中断信号依据其紧急程度和重要性划分级别。在多级中断系统中,同时有多个中断请求时,处理器接收中断优先级为最高的中断,而忽略中断优先级比较低的中断。

        多级中断的第二个作用是,解决如果有重要程度相当的多个中断信号同时到达时,如何选择首个被处理的中断信号的问题。一般有两种方法来解决:一是设置固定的优先数,即给每个设备接口安排一个固定的优先顺序;二是轮转法,即用一个表格,依次轮转响应。

(2) 中断屏蔽

        在整个中断系统中,可以允许或禁止中断系统对某些类别中断的响应。在程序状态字PSW中设计有中断屏蔽位,这些屏蔽位标识了被屏蔽的中断类或中断。一旦某个I/O中断被程序状态字PSW中的中断屏蔽位加以屏蔽,那么此时即使有I/O中断信号,处理器也不予以响应。对于被屏蔽的中断信号,通常仍然保存在中断寄存器中,有些可以在以后继续响应,而有些则被简单地丢弃。

        还有一类中断信号是不可屏蔽的,一般这类中断信号属于机器故障中断。一旦发生这类不可屏蔽的中断,不管程序状态字中的屏蔽位是否建立,处理器都要立即响应这类中断,并进行处理。

(3) 中断嵌套

        一般的计算机系统中都有多个中断源,如果一个中断的处理过程中又发生了中断,那么将引起多个中断处理问题。

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

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

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

四、系统调用

1、系统调用简介

        所以系统调用,就是用户在程序中调用操作系统所提供的一些子功能,这种调用通常由特殊的机器指令实现,这条指令将系统转入特权方式(管态)。因此,系统调用被看作是一个低级的过程,只能由汇编语言直接访问,系统调用是操作系统提供给编程人员的唯一接口。编程人员利用系统调用,动态请求和释放系统资源,调用系统中已有的系统功能来完成与计算机硬件部分相关的工作以及控制程序的执行程度等。

        系统调用命令是扩充机器指令,被称为“广义指令”,它与机器指令在性质上是不同的。机器指令是由硬件线路直接实现的,而“广义指令”则是由操作系统所提供的一个或多个子程序模块,即软件实现的。但从用户的角度来看,这些广义指令就好像扩大了机器的指令系统,增强了处理器的功能,即实现了处理器性能上的扩充。为了区别于真实的物理处理器,我们又称它为“虚处理器”。

(1) 系统调用与函数调用的区别

        系统调用在本质上是应用程序请求操作系统核心,完成某一特定功能的一种函数调用,是一种特殊的函数调用。它与一般的函数调用有以下几个方面的区别:

① 运行在不同的系统状态

        一般的函数调用,其调用程序和被调用程序都运行在相同的状态:管态或目态;而系统调用与函数调用的最大区别就在于:调用程序运行在目态,而被调用程序运行在管态。

② 状态的转换

        一般的函数调用不涉及系统状态的转换;但系统调用时,由于调用程序和被调用程序各自运行在不同的系统状态,所以需要进行状态的转换。

③ 返回问题

        一般的函数调用在调用过程执行完后,将返回到调用过程继续执行;但是,在采用抢占式调度方式的系统中,被调用过程执行完后,系统将对所有要运行的进程进行优先级分级,如果调用进程具有较高的优先级,则返回到调用进程继续执行。否则,将引起重新调度。

④ 嵌套调用

        像一般过程一样,系统调用也允许嵌套调用。但每个系统对嵌套调用的深度都有一定的限制。

(2) 系统调用的分类

        对于通用的操作系统,可以将其提供的系统调用分为以下几个方面:

① 进程控制类系统调用;

② 文件操作类系统调用;

③ 进程通信类系统调用;

④ 设备管理类系统调用;

⑤ 信息维护类系统调用。

(3) 系统调用与库函数、API、内核函数的关系

        库函数是在C语言程序设计中,所有匹配标准的头文件的集合,以及常用的函数库实现程序。API(应用程序接口),又称为应用编程接口,就是软件系统不同组成部分衔接的约定,它是提供给应用程序调用使用的代码。它们相当于是系统调用的封装。

2、系统调用的处理过程

        在系统中控制系统调用服务的机构称为陷入机构或异常处理机构,把由于系统调用引起处理器中断的调用指令称为陷入指令或访管指令。在操作系统中,每个系统调用都对应一个事先给定的功能号,在陷入指令中必须包括对应系统调用的功能号。为了实现系统调用,系统设计人员还必须为实现各种系统调用功能的子程序编造入口地址表,每个入口地址都与相应的系统程序名对应起来。然后,陷入处理程序把陷入指令中所包含的功能号与该入口地址表中的有关项对应起来,从而由系统调用功能号驱动有关子程序的执行。最后,系统调用处理结束之后,还要恢复处理器现场。

        系统调用的处理流程是:当处理器执行到特殊的陷入指令时,首先会调用中断,通过查中断向量表把控制权转给系统调用总入口程序,该程序会对现场进行保存,包括将参数保存在内核堆栈里,通过查系统调用表把控制权转给相应的系统调用处理例程或内核函数,然后执行系统调用例程,完成后恢复现场并返回应用程序。

        系统调用过程中如何传递参数呢?有三种方法:一是由陷入指令自带参数;二是通过通用寄存器来传递参数;三是在内存中开辟专用堆栈区来传递参数。

        

猜你喜欢

转载自blog.csdn.net/Alexshi5/article/details/87927273