1、操作系统的运行机制
程序在硬件上时如何运行的?
一条高级语言的代码翻译过来可能会对应多条机器指令
程序运行的过程其实就是CPU执行一条一条的机器指令的过程
注意:Linux、Windows、MasOS中的小黑框中使用的命令也称为指令,其实这是交互式命令接口,而本节中的”指令“是指二进制机器指令
内核程序vs应用程序
普通程序员写的程序就是“应用程序”,微软、苹果有专人负责实现操作系统,他们写的是“内核程序”,很多的内核程序就组成了“操作系统内核“简称”内核“。
内核是操作系统最终套最核心的部分,也是最接近硬件的部分
甚至可以说一个操作系统只要有内核就足够了
但是操作系统的功能未必都在内核中,比如图形化用户界面GUI
特权指令vs非特权指令
非特权指令---普通程序员写的应用程序
应用程序只能使用"非特权指令"如:加法指令、减法指令等
特权指令---微软、苹果有一帮人负责实现操作系统,他们写的就是”内核程序“
操作系统的内核作为”管理者“,有时会让CPU执行一些”特权指令“,如:内存清零指令。这些指令影响重大,只允许”管理者“----即操作系统的内核使用
CPU设计和生产的时便划分了特权与非特权指令,因此CPU执行一条指令前就能判断出其类型
内核态vs用户态
CPU能判断出指令类型,但是它怎么区分此时正在运行的是内核程序还是应用程序?
CPU会被分为两种状态:内核态和用户态
处于内核态时,说明此时运行的是内核程序,只能执行特权指令
处于用户态时,说明此时运行的是应用程序,只能执行非特权指令
拓展:
CPU中有一个寄存器叫”程序状态字寄存器“(PSW),其中有个二进制位,1表示”内核态“,0表示”用户态“
别名:内核态==核心态==管态、用户态==目态
那么如何进行内核态与用户态之间的切换呢?
①刚开机时,CPU为”内核态“,操作系统内核程序先上CPU运行
②开机完成后,用户可以启动某个应用程序
③操作系统内核程序在合适的时候主动让出CPU,让该应用程序上CPU运行
操作系统内核在让出CPU之前,会用一条特权指令把PSW的标志位设置为”用户态“
④应用程序运行在”用户态“下
⑤此时一位黑客在应用程序中植入了一条特权指令,企图破坏系统......
⑥其实当CPU读入该指令的时候就已经能判断出它是特权指令,但是自己又处于”用户态“
⑦这个非法事件会引发一个中断信号
当CPU检测到中断信号后,会立即变为”核心态“,并停止运行当前的应用程序,转而会运行处中断信号的内核程序
⑧”中断“使操作系统再次夺回CPU的控制权
⑨操作系统会对引发中断的事件进行处理,处理完了再把CPU的使用权交给别的应用程序
总结:
内核态——>用户态:执行一条特权指令--修改PSW的标志位为:用户态,这个动作意味着操作系统将主动让出CPU使用权
用户态——>内核态:由”中断“引发,硬件自动完成变态过程,触发中断信号意味着操作系统将强行夺回CPU的使用权
除了非法使用特权指令之外,还有很多事件都会触发中断信号,它们的共性是,单反需要操作系统介入的地方,都会触发中断信号
tips:关于PSW的解释
PSW(Program Status Word)是一个缩写,用于表示程序状态字,也称为程序状态寄存器(Program Status Register)。它是一种特殊的寄存器,用于存储和管理与处理器状态相关的信息和标志位。
PSW中的标志位是用来表示特定条件或状态的二进制位。这些标志位可以提供关于指令执行过程中发生的事件或结果的信息。不同的处理器架构和体系结构可能具有不同的标志位,但以下是一些常见的标志位:
1. 零标志位(Zero Flag):当指令执行的结果为零时被设置为1,否则为0。
2. 进位标志位(Carry Flag):在无符号算术操作中,当指令执行产生进位时被设置为1,否则为0。
3. 溢出标志位(Overflow Flag):在有符号算术操作中,当指令执行产生溢出时被设置为1,否则为0。
4. 符号标志位(Sign Flag):用于表示结果的符号,当结果为负数时被设置为1,否则为0。
5. 奇偶标志位(Parity Flag):用于表示结果中二进制位1的个数,当结果中二进制位1的个数为偶数时被设置为1,否则为0。
这些标志位可以在程序中进行检查和操作,以便根据指令执行的结果进行条件分支或其他处理。它们对于控制程序流程和处理器状态非常重要。
请注意,不同的体系结构和处理器可能具有不同的标志位定义和用法,因此具体的标志位可能会有所不同。
本节思维导图:
~over~