文章目录
- 第一章 计算机系统概述
- 操作系统的运行机制
- 前提知识:程序是如何运行的
- 内核程序与应用程序
- 特权指令与非特权指令
- 内核态与用户态
- 小结
第一章 计算机系统概述
操作系统的运行机制
操作系统的运行机制,也就是操作系统在计算机上是怎样运行的问题。
操作系统的运行机制
- 两种指令
- 特权指令
- 非特权指令
- 两种处理器状态
- 核心态
- 用户态
- 两种程序
- 内核程序
- 应用程序
前提知识:程序是如何运行的
我们平时写的C语言代码,要先经过编译器“翻译”为机器能读懂的机器指令(二进制编码)。
C语言写的简单的2行代码,编译成机器指令,就会形成多条机器指令(此处是瞎编的01编码,反正都看不懂)。
虽然我们看不懂这些二进制编码,但是,对于CPU来说,对于计算机来说,这样的二进制代码才是它能够看得懂的语言。
程序运行的过程其实就是CPU执行一条一条的机器指令的过程。
这里提到的“指令”(机器指令),就是能让CPU处理、识别的最基本命令。(比如让CPU执行一个加法操作、执行一个赋值操作等等)
很多人习惯把Linux、Windows的“小黑框”中使用的命令(比如ls、mkdir)也称为“指令”,其实这是“交互式命令接口”。注意与此处的“指令”区别开。此处的“指令”指的是二进制机器指令。
内核程序与应用程序
应用程序就是平时跑在操作系统之上的,我们平时很熟悉的、很喜欢用的那些程序,比如QQ、微信等。
我们普通程序员写的程序就是“应用程序”,是跑在操作系统之上的。
但是还有一批人,比如微软、苹果,开发操作系统的这帮人写的程序,就是操作系统的内核程序。这帮人写了很多内核程序,这么多内核程序,最终组合成了操作系统内核,或简称“内核(Kernel)”。
内核是操作系统最重要最核心的部分,也是最接近硬件的部分。
之前说过,操作系统最重要的一个角色,是他要作为系统资源的管理者,而操作系统对系统资源的管理工作其实就是在内核部分实现的。甚至可以说,一个操作系统只要有内核就够了。(例如:Docker→仅需Linux内核)
用户平时使用到的操作系统的功能,并不是都在内核中的,例如图形化用户界面GUI。即使没有GUI,我们依然可以通过命令行的方式来使用操作系统。所以操作系统的内核中包含的是操作系统的最重要、最核心、最必不可少的那些功能。
特权指令与非特权指令
既然操作系统内核是系统资源的管理者,那么它作为管理者这样一个角色,有的时候就有可能让CPU执行一些比较特殊的指令,比如“内存清零指令”。这种指令会对其他程序的运行造成很严重的影响,因此,像这样的“特权指令”,就只允许“管理者”——即操作系统内核来使用。
假如CPU要执行的一段程序是内核程序,那这些指令当中,可以出现特权指令。
如果这段程序是普通的应用程序,那么,这其中就不应该包含特权指令,而只能使用非特权的指令,如:加减乘除运算指令。
CPU在设计和生产时,就已经划分了哪些指令是特权指令、哪些指令是非特权指令,因此CPU在拿到一条指令的时候,它就可以区分出这到底是特权指令还是非特权指令了。
内核态与用户态
此时有一个问题:CPU能判断出指令类型,但是它怎么区分此时正在运行的是内核程序还是应用程序?
为了让CPU能够区分此时运行的程序是内核程序还是应用程序,CPU被划分为两种状态:“内核态”和“用户态”。
处于内核态时,说明此时正在运行的是内核程序,此时可以执行特权指令。
处于用户态时,说明此时正在运行的是应用程序,此时只能执行非特权指令。
怎么看CPU当前到底处于哪种状态呢?
CPU中会有一个寄存器叫程序状态字寄存器(PSW),其中有个二进制位,1表示“内核态”,0表示“用户态”。(有的CPU也可能1和0表示状态是反过来的,这无所谓了,知道通过这个方法对CPU状态能够进行识别就可以)
别名:内核态 = 核心态 = 管态; 用户态 = 目态。
接下来,要探讨的问题是:CPU怎么实现这两个状态之间的切换?
一个例子:
①刚开机时,CPU为“内核态”,操作系统内核程序先上CPU运行。比如系统初始化的工作就是由内核当中的一些程序来完成的,所以此时也肯定处于内核态。
②开机完成后,用户就可以启动某应用程序。但是问题是,CPU还正处于内核态,在执行内核程序中的指令,怎么办?此时,如果操作系统的内核,它想让用户的应用程序开始运行的话,那么这个内核程序就需要执行一条特权指令,这个特权指令会把PSW的标志位,从内核态转变为用户态,就完成了CPU状态的切换。
③操作系统内核程序会在合适的时候主动让出CPU,让该应用程序上CPU运行,并切换至“用户态”。
④应用程序运行在“用户态”。CPU会执行该程序一条条的指令。
⑤此时,如果该程序出现意外,例如一个黑客在该应用程序中植入了一条特权指令,企图破坏系统。
⑥CPU其实在读入这条指令的时候,它就已经知道,这条指令是一条特权指令,但是CPU又根据自己的PSW寄存器,发现自己是处于“用户态”。因此,CPU目前知道这是一个应用程序,想要执行的是一条特权指令,那么这种事情是坚决不能进行的,是一个非法事件。
⑦这个非法事件会引发一个中断信号。当CPU检测到中断信号后,会立即强行变为“核心态”,同时拒绝执行这条特权指令,并停止运行当前的应用程序,转而会执行一个处理中断信号的内核程序。
⑧“中断”使操作系统再次夺回CPU的控制权。
⑨内核程序会对这一“中断”进行相应处理,等处理完后,它才会把CPU的使用权再重新还给别的应用程序。
可以看出,CPU从内核态→用户态,其实是修改了一下PSW的标志位,通过执行一条特权指令把PSW的标志位置为“用户态”,这个动作意味着操作系统将主动让出CPU使用权。之后,CPU上就可以运行应用程序。
而CPU从用户态→内核态,是由“中断”引发的,硬件自动完成变态过程,触发中断信号意味着操作系统将强行夺回CPU的使用权。
除了非法使用特权指令之外,还有很多事件会触发中断信号。但有一个共性是,但凡需要操作系统介入的地方,都会触发中断信号。