【操作系统】操作系统的运行环境

提出问题:

1.什么是指令?

2.特权指令和非特权指令有什么本质区别?

3.中断和异常到底有什么区别,从触发条件和处理方式两个角度理解呢?

4.系统调用的过程?

目录

特权指令和非特权指令

操作系统内核程序和用户自编程序(应用程序)

用户态和内核态

用户态和内核态之间的转换

操作系统内核

中断和异常的概念

系统调用


计组知识回顾:

        我们都知道,我们编写代码使用的高级语言是无法被CPU直接看懂的(不知道的你现在知道了),需要先将我们编写的程序“翻译”成CPU能看懂的机器语言,就是一条条的指令,执行程序就是CPU顺着这一条条指令来执行具体的操作。

CPU执行一个程序的具体过程(简化版):

具体可以看看这篇博文,很详细:

http://t.csdnimg.cn/0y7DH

由此,我们可以给指令下定义:

指令是指挥计算机完成各种操作的基本命令。一般来说,一条指令包括两个组成部分:操作码和地址码。(这里不展开)

特权指令和非特权指令

        根据我们上面对指令的了解,能知道指令也得分个轻重缓急,一些重要的指令例如IO指令、内存清零指令是 不能让用户直接接触到的;一些简单的指令,例如普通的运算指令,用户可以随便使用。

特权指令:不允许用户直接使用的指令;

非特权指令:允许用户直接使用的指令。

对于特权指令和非特权指令到底有什么区别,看了一篇佬的理解,大呼豁然开朗,以下用自己的理解简述一下:

对共享资源的访问和操作,必须为特权指令;对独占资源的访问和操作,为非特权指令。

        在这里我举一个不恰当的例子,假设在游乐场内,你(一个进程)在排队等待游玩鬼屋(进入CPU运行),这时候你还没进入到鬼屋(CPU)内游玩(执行),鬼屋对你来说就是共享资源,因为有很多人都要进去游玩,你只是其中之一。当轮到你进入鬼屋中了,这时鬼屋对你来说就是独占资源,其他游客不能干扰你的游玩体验,你在里面进行的操作都是你的个人行为,即为非特权指令。但你一个游客是无法指挥鬼屋开灯的,必须把工作人员喊来才能开灯,鬼屋开灯对你来说就是特权指令,是对鬼屋这一共享资源的操作。

当然这个例子很粗糙,大家能稍微理解含义即可。

具体的理解细看这位佬的文章!!!

http://t.csdnimg.cn/GB4wD

操作系统内核程序和用户自编程序(应用程序)

简单理解,可以这么定义:

内核程序:执行了一些特权指令的程序;通常与IO操作,内存管理等有关。

用户自编程序(应用程序):不能执行特权指令的程序。

用户态和内核态

由此,我们可将CPU的运行模式分为用户态和内核态。

用户态:当CPU处于用户态,CPU只能执行非特权指令;

内核态:此时CPU可以执行特权指令,操作系统内核程序就运行在这种状态下。

CPU如何区分此时处于哪个状态?

程序状态字PSW:PSW为0时,处于内核态;PSW为1时,处于用户态

用户态和内核态之间的转换

核心态---->用户态:调用特权指令,设置程序状态字PSW为1;

用户态---->内核态:途径非常少且单一,只能通过中断、异常(后续详细介绍)

操作系统内核

先来看一段超长的定义:

“内核”指的是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件。内核是操作系统最基本的部分。它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并且内核决定一个程序在什么时候对某部分硬件操作多长时间。直接对硬件操作是非常复杂的,所以内核通常提供一种硬件抽象的方法来完成这些操作。硬件抽象隐藏了复杂性,为应用软件和硬件提供了一套简洁,统一的接口,使程序设计更为简单。

现代操作系统几乎都是分层式的结构,操作系统的各项功能分别设置在不同的层次上:

(有关操作系统结构的内容又是个要点。。。暂时还没写,这里简单理解就行)

与硬件关联紧密的模块,例如时钟管理、中断处理、设备驱动等处于最底层;

运行频率较高的程序,例如进程管理、存储器管理和设备管理;

这两部分的内容构成了操作系统的内核。由此我们可知,特权指令只允许操作系统内核使用。

        内核是操作系统的核心。内核是操作系统执行的第一道程序,被率先加载到内存中开始系统行为。内核始终保持在主内存中直到系统被关闭。内核将用户输入的命令转换成计算机硬件能理解的机器语言。

        内核是系统应用软件和硬件的桥梁。内核直接与硬件联系,并告之它由应用软件发起的请求。操作系统不能脱离内核工作,内核是系统正常运行最重要的程序。

大部分操作系统内核包括以下四个方面的内容:

1.时钟管理

2.中断机制

3.原语

4.系统控制的数据结构及处理:进程管理、存储器管理、设备管理

我认为这里不需要详细理解这几个概念,只需要大致理解,后续都会深入了解。

中断和异常的概念

tips:这一部分的内容非常的繁杂,仅从操作系统角度进行说明,和计组强相关!!!

由前面的概念我们了解到,内核态是十分强大和重要的,当我们用户想使用一些只能在内核态实现的功能又该怎么办呢?

这时我们就需要一个功能实现从用户态转向内核态,即为中断或异常;

通过中断或异常,运行用户态的CPU会立即进入内核态,这一功能非常特殊,是通过硬件实现的;

中断(外中断)

是指由于外部设备事件引起的中断,,如磁盘中断,打印机中断,时钟中断等。

中断和CPU当前执行的指令无关!!是由外部事件引起的,通常和信息的输入输出有关。

外中断分为可屏蔽中断和不可屏蔽中断:

可屏蔽中断:就是CPU可以不响应这个中断。CPU是否要响应这个中断要看标志寄存器中的IF标志位的值。如果IF标志位等于0,那么CPU则不响应这个中断,如果IF标志位为 1 ,CPU则响应这个中断,所以每次的中断过程中都一个把IF设置为0的动作,就是让CPU在进入中断处理后禁止其他的可屏蔽中断。可屏蔽中断是通过INTR线发出的中断请求。

不可屏蔽中断通过NMI线发出的中断请求,通常是紧急的硬件故障,如硬件掉电等。(想想也知道这种中断肯定不能屏蔽,掉电了还屏蔽不死翘翘了)

tips:这里介绍一下,CPU一般设置两根中断请求输入线:可屏蔽中断请求INTR(Interrupt Require)和不可屏蔽中断请求NMI(Nonmaskable Interrupt),外部设备根据情况选择使用那根线。

具体的实现过程和汇编强相关,不展开,想给自己上上难度的可以看看这篇(http://t.csdnimg.cn/c5gTp

异常(内中断)

是指由于 CPU 内部事件所引起的中断,如程序出错(非法指令、地址越界)。异常是不能被屏蔽的!!

异常可分为故障(Fault)、自陷(Trap)和终止(Abort):

故障(fault):错误是一种可以被修复的异常,只要错误被修正,CPU就可以将进程或任务的运行环境恢复到这条语句的执行地址,继续执行。通常是由指令执行引起的异常,如非法操作码、缺页故障、除数为0
自陷(trap):一条指令产生了异常,其状态同样可以恢复,但是执行异常处理程序之后恢复的位置是异常指令的下一条指令。自陷是一种事先安排好的“异常”事件,用于在用户态下调用操作系统内核程序,如条件陷阱指令系统调用指令等。           
终止(abort):出现了使得CPU无法继续执行的硬件故障,异常原因无迹可循,会终止程序或任务的执行,无法恢复。例如控制器出错,存储器校验错等。

上述分类方法是根据异常和中断的触发条件进行分类,我们也可以根据对异常和中断的实现机制进行分类:

硬件中断:终止、外中断;由CPU这个硬件实现的中断机制,但它的触发可以通过外部硬件,也可以通过软件的 INT 指令。

软件中断(程序性异常):故障、自陷。由软件实现的中断,是纯粹由软件实现的一种类似中断的机制,实际上是模仿硬件,在内存中存储着一组软中断的标志位,然后由内核的一个守护线程不断轮询这些标志位,如果有哪个标志位有效,则再去执行这个软中断对应的中断处理程序。

tips:但是要注意,用户态立即进入内核态这个操作是通过硬件实现的,别搞混了。

(碎碎念,我学这部分的时候老想深究,然后就一不小心向着计组和汇编一去不复返了,当然,如果学过计组这部分的内容,会容易理解)

中断和异常处理过程的大致描述:

1·CPU在执行第 i 条指令时,检测到异常事件/发现中断请求信号

2·CPU打断当前用户程序,转到相应的中断或异常处理程序(响应中断或异常,一系列处理过程见计组)

3·若中断或异常处理程序能解决相应的问题,则在最后CPU通过执行中断或异常返回指令,回到被打断的用户程序的第 i 条或第 i+1 条指令

4·若中断或异常处理程序发现这是一个不可恢复的致命错误,则终止用户程序。

系统调用

        计算机的各种硬件资源是有限的,为了更好的管理这些资源,用户进程是不允许直接操作的,所有对这些资源的访问都必须由操作系统控制。为此操作系统为用户态运行的进程与硬件设备之间进行交互提供了一组接口,这组接口就是所谓的系统调用。

        通常,一个操作系统提供的系统调用命令有上百条,每个系统调用都有唯一的系统调用号,我们可以按功能分类如下:

·设备管理    ·文件管理    ·进程控制    ·进程通信    ·内存管理

显然,系统调用涉及的功能对整个系统的影响非常大,因此系统调用的处理要由操作系统内核程序负责完成,运行在内核态。

在操作系统层面,我们主要关心系统核心态和用户态的软件实现和切换,硬件部分就简略表达了,详细可以看计组有关中断的内容

系统调用的处理过程:(主要从操作系统角度理解)

1·用户程序将系统调用号和所需参数压入堆栈

2·调用实际的调用指令

3·执行陷入指令(将CPU状态从用户态转为核心态,硬件和操作系统内核程序一起保护被中断进程的现场,例如将程序计数器,程序状态字等压入堆栈)

4·分析系统调用类型,转入相应的系统调用处理子程序。(在系统中配置了一张系统调用入口表,根据调用号可以找到子程序的入口地址)

5·子程序执行结束后,恢复被中断的或设置新进程的CPU现场,然后返回被中断进程或新进程,继续执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值