CHS_01.1.3.1+操作系统的运行机制
- 操作系统的运行机制 也就是说 操作系统在计算机上是怎么运行的这样一个问题
操作系统的运行机制 也就是说 操作系统在计算机上是怎么运行的这样一个问题
那这个小节中会涉及到这样的一些概念 我们会学习到两种类型的指令 然后两种处理机状态和两种程序
他们其实都是一一对应的 那具体我们会一层一层慢慢讲解
那首先我们要来解释一下 程序在计算机硬件上底层是怎么运行的
其实 像我们平时用c语言代码写的那些程序都会经过编译器进行一个编译的工作
把这个c语言代码翻译成计算机能够听得懂的二进制代码 也就是机器指令
像我们平时用c语言这种高级语言写的一条代码经过编译翻译之后可能会对应很多很多条机器指令
比如说 我们定义了一个inter型的变量x等于一并且对x进行了加加 也就是加一的操作
那么这样两行短短的代码 可能经过编译之后形成的机器指令就会对应这么多条 当然这个地方我也是随便胡乱写的
因为都是二进制数嘛 反正我们都看不懂 但是虽然我们看不懂这些二进制数 但是对于cpu 对于计算机来说 这样的二进制代码才是他能够看得懂的一种语言
所以其实我们这段程序运行的过程 其实就是cpu把这些机器指令一条一条的执行的一个过程
而这些机器指令在背后实现的其实就是我们用代码表示的这小段的逻辑
只不过这种二精制的机器指令 是cpu能看懂 但是我们看不懂的 所以这个地方所提到的所谓的机器指令
其实就是让处理器 也就是cpu能够识别并且执行的最基本的一个命令
比如说进行一个加法操作或者进行一个赋值的操作等等
这个地方所谓的指令的概念比较容易和另一个概念进行混淆
很多同学在以前会习惯把Linux windows等等这种小黑框里输入的这种什么ls cd等等这样的
命令称作为指令 但是其实这个小黑框里所用的这个命令其实是我们之前提到过的
交互式命令接口 他和我们这个小节所讲的指令是不一样的 我们这儿指的指令是指二进制的机器指令
所以大家需要对接下来所提到的指令进行一个区分 总之 我们平时用高级语言编写的这种程序 最后执行的时候 肯定是需要变成cpu能够读得懂的 用二进制的机器指令表现的这种形式
那么这就是程序运行的一个基本原理 那在操作系统这门课当中 我们需要注意区分两种类型的程序 一种叫内核程序 一种叫应用程序
所谓的应用程序 就是跑在操作系统之上的我们平时很熟悉很喜欢用的那些那些程序 比如说qq
什么微信等等等等 那像我们普通程序员写的程序其实就是应用程序 是跑在操作系统之上的
但是还有一些人 比如说像微软 苹果 会有一帮人是负责开发操作系统的
这帮人写的那些程序就是所谓的操作系统的内核程序 那这帮人编写了很多很多的内核程序 这些内核程序最终组成了所谓的操作系统的内核
这个内核就是操作系统最核心的部分 也是最接近硬件的部分
我们之前提到过 操作系统最重要的一个角色是 它要作为系统资源的管理者
而操作系统对系统资源的管理工作其实就是在内核部分来实现的 我们甚至可以说 一个操作系统只要有内核就可以了
比如说 有的同学也许会接触过容器技术 比如说docker在容器里只需要有linux的内核 其实就可以实现linux的所有的功能了
而我们用户平时使用的操作系统 其实它包含的不只是内核的功能 比如说图形化的用户界面 就不是放在内核当中实现的
即使没有图形化的用户界面 我们依然可以用命令行 也就是之前所提到的小黑框的那种方式来使用操作系统
所以 操作系统的内核当中所包含的只是操作系统当中最重要 最核心 最必不可少的那些功能
那既然操作系统内核 它是系统资源的管理者 它作为管理者这样的一个角色 有的时候就有可能会让cpu执行一些比较特殊的指令
比如说内存清零的指令 这种指令会对其他程序的运行造成很严重的影响
像这样的特权指令运行之后 是有可能影响到其他程序的正常运行的
所以 这样的特权指令就应该只允许我们系统的管理者 也就是操作系统内核来使用
也就是说 假如这一段程序是内核程序的话 那这些指令当中可以出现特权指令
而假如说这段程序是普通的应用程序的话 那么这其中就不应该包含特权指令 而只能使用非特权的指令
比如说让cpu做加减乘除运算的一系列的指令 就是非特权的指令 我们的cpu在设计和生产的时候
就划分了哪些指令是属于特权指令 哪些指令是属于非特权指令 所以cpu在拿到一条指令的时候 其实它是可以区分出它到底是特权指令还是非特权指令的
那么问题就出现了 cpu在执行程序的时候 他只会负责把这些指令一条一条的执行 虽然他能够分辨出哪些指令是特权指令 哪些指令是非特权指令 但是他又怎么分辨出此时正在执行的这个指令 他到底是一个应用程序的指令
还是一个内核程序的指令呢 那接下来我们要研究的就是这个问题 为了让cpu能够区分此时正在运行的这些指令是属于应用程序还是内核程序 cpu会被划分成两种状态 一种叫内核态 一种叫用户态
那当cpu处于内核态的时候 说明此时cpu正在运行的是内核程序
那在这个时候是可以执行特权指令的 而如果cpu处于用户态 那么说明此时cpu正在运行的是应用程序
那此时cpu就只能执行非特权指令 那怎么区分cpu到底处于哪种状态呢
在cpu当中会有一个寄存器 也就是一个存数据的地方 叫做程序状态寄存器 英文缩写叫psw
然后这个寄存器当中会有一个二经之位 这个二经之位唯一的时候 表示cpu此时是处于内核态的
而二进制为零的时候 表示cpu此时处于用户台 当然 也有一些cpu有可能是零表示内核台 一表示用户台
但是这个无关紧要 我们只需要知道 用二进制的方式其实就可以实现对cpu状态的一个标记
那用户态和内核态 他们还有各自的别名 用户态又可以叫木态 然后内核态又可以叫做广态
那这两个术语大家也需要注意一下 那接下来我们要探讨的问题是 cpu要怎么实现这两种状态之间的切换
我们直接用一个例子让大家看一下cpu状态切换的一个过程 首先 当我们开机的时候
需要加载我们的操作系统 然后这个操作系统就需要进行一些初始化的工作 那那系统初始化的工作其实就是由操作系统当中的某一些内核程序来完成的
所以 在开机的过程当中需要执行内核程序 因此 在这个时候 cpu肯定是需要处于内核态
他需要来执行系统初始化相关的这一系列的内核程序的这些指令
那么当我们开机完成之后 用户就可以启动某一些应用程序 那这个应用程序要正常运行的话 肯定需要让cpu执行它的这一系列的指令 但是我们刚才不是说cpu此时正在执行的是内核程序吗
而如果说要让他运行这个应用程序的话 怎么实现这个事情呢 那此时如果操作系统的内核想让这个应用程序开始运行的话
那么 这个内核程序就需要执行一条特权指令 这个特权指令会把ps w的标志位从内核态转变为用户态
这样的话 就完成了cpu状态的一个切换 接下来 操作系统内核就会让出cpu的使用权
让这个应用程序上cpu运行 而此时cpu已经被切换为用户态了
所以接下来我们的应用程序会在用户态下运行 那cpu会执行这个应用程序的
一条一条的指令 那此时一个小故事发生了 假如说此时有一个猥琐的黑客
在这个应用程序当中植入了一条特权指令的话 会发生什么事呢 首先 cpu在读入这条指令的时候 其实它就已经能够判断这条指令
是一条特权指令了 但是cpu又检查了自己的psw寄存器 发现自己此时是处于用户台的
这样的话 cpu就能够知道我此时正在运行的其实是应用程序而不是内核程序 而一个应用程序竟然他妈想要用一个特权指令 那这个事情坚决不能让他干
所以这样的一个非法事件会引起一个中断信号 当cpu检测到这个中断信号之后
他就会立即强行变态 强行变成核心态 并且cpu会拒绝执行这一条特权指令
接下来 cpu会暂停执行这个应用程序后面的这一系列的指令代码转而会执行一个
处理中断信号的内核程序 接下来cpu就在内核态下来执行这个内核程序相应的这一系列的
指令 所以其实刚才发生了这个中断信号之后 让操作系统内核
又重新夺回了cpu的控制权 接下来 操作系统的内核程序会对这个中断
进行相应的处理 等处理完了之后 他才会把cpu的使用权再重新还给应用程序
所以从这个故事当中 我们就可以很形象的看到cpu从内核态切换回用户态
是执行了一条修改psw标志位的一个特权指令来完成的 执行了这个特权指令之后 就意味着操作系统内核要主动的让出cpu的使用权了
当cpu切换为用户态之后 就可以在cpu上运行用户程序 而cpu的状态从用户态又切换回内核态 是由中断引发的
然后由cpu硬件自动的完成这个变态的过程 并且cpu变回内核态 之后
他会停止运行当前正在运行的应用程序 转而运行一个内核程序
所以说 其实触发了一个中断信号 就意味着操作系统会强行重新夺回cpu的使用权
那除了非法使用特权指令之外 还会有别的很多的事件也会触发这个中断信号
一个共性是 但凡我们需要操作系统来介入开展管理工作的时候 就会触发一个中断信号
那具体有哪些中断 这个 我们会在下一个小节当中进行更进一步的学习 好的 那么这个小节当中 我们
用一个故事来捋清了操作系统的运行机制 我们的cpu运行程序的过程其实就是在执行一条一条机器指令的过程 而系统中存在两种程序 一种是内核程序 一种是应用程序 内核程序是
整个系统的管理者 所以它需要使用到一些特权指令 并且特权指令只有内核程序可以使用
那当cpu的状态是内核态的时候 说明此时正在跑的这些指令是属于内核程序的
当cpu处于用户态的时候 说明此时他正在跑的是应用程序的指令
那由一系列的内核程序就组成了操作系统的内核 它是整个系统最核心 最接近硬件的部分
那我们还强调了cpu是如何变态的 内核台到用户台的转变是用一条特权指令实现的
而用户态到内核态的转变是由中断引起的 然后由cpu硬件自动完成
那这个小节的内容都是十分重要的 很容易在选择题当中进行考察
推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习