程序如何运行
C语言代码 —(编译器)–>机器指令(二进制指令)
内核程序和应用程序
应用程序:普通程序 内核程序(kernel):负责实现操作系统,操作系统最核心的内容,最接近硬件的部分
内核程序可以执行一些特权指令,而普通应用程序只能使用非特权指令。
内核态和用户态
CPU有两种状态,“内核态”和“用户态” 处于内核态时,说明此时正在运行的是内核程序,此时可以执行特权指令 处于用户态时,说明此时正在运行的是应用程序,此时只能执行非特权指令
拓展:CPU中有一个寄存器程序状态字寄存器(PSW),其中有个二进制位,1表示“内核态”,0表示“用户态
别名:内核态=核心态=管态;用户态=目态
cpu状态切换
一个故事:
- 刚开机时,CPU为“内核态”,操作系统内核程序先上CPU运行
- 开机完成后,用户可以启动某个应用程序
- 操作系统内核程序在合适的时候主动让出CPU,让该应用程序上CPU运行(操作系统内核在让出CPU之前,会用一条特权指令把 PSW 的标志位设置为“用户态”)
- 应用程序运行在“用户态”
- 此时,一位猥琐黑客在应用程序中植入了一条特权指令,企图破坏系统..
- CPU发现接下来要执行的这条指令是特权指令,但是自己又处于“用户态’
- 这个非法事件会引发一个中断信号(CPU检测到中断信号后,会立即变为“核心态”,并停止运行当前的应用程序,转而运行处理中断信号的内核程序)
- “中断”使操作系统再次夺回CPU的控制权
- 操作系统会对引发中断的事件进行处理,处理完了再把CPU使用权交给别的应用程序
内核态→用户态:执行一条特权指令–修改PSW的标志位为“用户态”,这个动作意味着操作系统将主动让出CPU使用权 用户态→内核态:由“中断”引发,硬件自动完成变态过程,触发中断信号意味着操作系统将强行夺回CPU的使用权
除了非法使用特权指令之外,还有很多事件会触发中断信号。一个共性是,但凡需要操作系统介入的地方,都会触发中断信号