一、操作系统运行机制
1.1 知识总览
1.2 程序是如何运行的?
- 编译转换:高级语言代码(如C语言)经编译后转换为CPU可执行的二进制机器指令
- 执行本质:程序运行即CPU顺序执行机器指令的过程,如int x=1; x++;可能对应多条机器指令
- 指令定义:让CPU识别和执行的最基本命令,如加法、赋值等底层操作
- 关键区分:
- 机器指令:二进制形式,CPU直接执行的基本操作(本节重点)
- 命令接口:如Linux的ls、cd等交互式命令,属于操作系统提供的用户接口
1.3 内核程序与应用程序
- 应用程序:普通程序员开发的程序(如QQ、微信),运行在操作系统之上
- 内核程序:操作系统开发者编写的程序,组成操作系统内核(kernel),最接近硬件的部分
- 实现系统资源管理,是操作系统最核心的部分(如Docker仅需Linux内核)
1.4 特权指令与非特权指令
- 特权指令:仅内核程序可使用(如内存清零),会影响其他程序运行
- 非特权指令:所有程序可使用(如加减乘除运算指令)
硬件支持:CPU设计时已划分指令类型,能自动识别特权/非特权指令,因此CPU执行一条指令前就能判断出其类型
1.5 内核态与用户态(CPU两种状态)
- 状态标识:通过PSW(程序状态字寄存器)的二进制位标记(1-内核态/0-用户态)
- 状态别名:
- 内核态:核心态/管态
- 用户态:目态
- 两种状态
- 处于内核态时,说明此时正在运行的是内核程序,此时可以执行特权指令
- 处于用户态时,说明此时正在运行的是应用程序,此时只能执行非特权指令
1.6 内核态和用户态的切换
典型案例:黑客在应用程序植入特权指令→触发中断→CPU切换至内核态执行处理程序
1、刚开机时,CPU处于“内核态”,操作系统内核程序先在CPU上运行
2、开机完成后,用户可以启动某个应用程序
3、操作系统内核程序在合适的时候主动让出CPU,让该程序在CPU中运行
操作系统内核让出CPU之前,会用一条特权指令把程序状态寄存器(PSW)的标志位设置为用户态
4、应用程序运行在“用户态”
5、此时,一位黑客在应用程序中植入了一条特权指令,企图被坏系统…..
6、CPU发现接下来要执行的这条指令是特权指令,但是自己又处于“用户态“
前面提到的 用户态只能执行非特权指令
7、这个非法事件会引发一个中断信号
CPU检测到中断信号后,会立即变为“核心态”,并停止运行当前的应用程序,转而运行处理中断信号的内核程序
8、“中断”使操作系统再次夺回CPU的控制权
9、操作系统会对引发中断的事件进行处理,处理完了再把CPU使用权交给别的应用程序
对以上内容进行总结:
1.7 操作系统运行机制知识回顾
二、中断和异常
2.1 知识总览
2.2 中断的作用
- 核心功能:中断是操作系统内核重新夺回CPU使用权的唯一途径
- 状态转换:使CPU由用户态变为内核态,实现特权级切换
- 系统意义:
- 没有中断机制就无法实现多道程序并发
- 是操作系统得以存在的基础技术支撑
- 运行机制:
- 内核程序通过特权指令主动让出CPU使用权
- 通过中断机制强制收回CPU控制权
应用程序一旦运行将会一直运行,除法发生中断
2.3 中断的类型
2.3.1 内中断(异常、广义中断)
- 本质特征:中断信号来源于CPU内部,与当前执行指令直接相关
- 别称:又称异常(exception),是教材和考试中的标准术语
- 例1:执行特权指令 – 应用程序在用户态尝试执行特权指令
- 处理流程:
- CPU检测到非法特权指令
- 触发中断信号拒绝执行
- 自动切换至内核态
- 执行对应的内核处理程序
- 系统响应:管理者重新获得CPU控制权
- 例2:执行非特权指令 – 执行除法指令时发现除数为0
- 若当前执行的指令是非法的,则会引发一个中断信号
- 例3:有时候应用程序想请求操作系统内核的服务,此时会执行一条特殊的指令–陷入指令,该指令会引发一个内部中断信号
- 系统调用也就是陷入指令完成
陷入指令拓展
- 特殊指令:陷入指令(trap)引发内中断
- 指令特性:
- 非特权指令,用户态可执行
- 用于主动请求内核服务
- 应用场景:系统调用的实现基础
- 处理流程:
- 应用程序执行陷入指令
- 产生内部中断信号
- CPU切换至内核态处理请求
- 指令特性:
2.3.1 外中断(中断)
与当前执行的指令无关,中断信号来源于CPU外部
例1:时钟中断–由时钟部件发来的中断信号
时钟部件每隔一个时间片(如50ms):会给CPU发送一个时钟中断信号
- 硬件来源:时钟部件定期(如50ms)发送中断信号
- 并发实现:
- 应用程序1运行50ms后收到中断
- CPU切换至内核态处理中断
- 内核调度程序2运行
- 循环切换实现并发
- 检测机制:CPU在每个指令周期末尾检查外中断
例2:I/O中断–由输入/输出设备发来的中断信号
如打印机打印完成,处理I/O中断的内核程序
2.4 中断机制的基本原理
- 处理流程:
- CPU检测中断信号
- 查询中断向量表
- 定位处理程序入口
- 硬件实现:
- 内中断:指令执行时立即检查
- 外中断:指令周期末尾例行检查
- 中断向量表存储各类中断处理程序指针
2.5 中断和异常的知识点回顾
三、系统调用
3.1 知识总览
3.2 什么是系统调用?
- 定义: 系统调用是应用程序请求操作系统内核服务的编程接口,由操作系统向上层提供的一组服务接口组成。
- 作用: 作为用户程序和硬件之间的桥梁,提供简单易用的服务接口,保证系统稳定性和安全性。
3.2 系统调用与库函数的区别
- 层级关系:
- 系统调用是操作系统直接提供的底层接口
- 库函数可能封装系统调用(如文件操作)或独立实现(如数学运算)
- 使用场景:
- 必须使用系统调用的场景:涉及共享资源(设备、文件、内存等)的操作
- 可不使用系统调用的场景:纯计算类操作(如数学运算)
3.3 应用案例
为什么系统调用是必须的?
- 场景描述: WPS和Word两个进程并发请求打印机资源
- 问题现象: 无系统调用管理时,打印内容会混杂
- 解决方案:
- 操作系统统一管理打印机资源
- 进程必须通过系统调用申请资源
- 内核协调各进程的资源使用顺序
- 核心结论: 共享资源必须通过系统调用来管理,保证互斥访问
3.4 什么功能需要用到系统调用
凡是与共享资源有关的操作(如存储分配、I/O操作、文件管理等),都必须通过系统调用的方式向操作系统内核提出服务请求,由操作系统内核代为完成。
3.5 系统调用的过程
- 执行流程
- 用户态程序执行传参指令(参数存入寄存器)
- 执行陷入指令(trap/访管指令)
- CPU检测到内中断,转入核心态
- 执行系统调用入口程序
- 根据参数调用具体处理程序
- 处理完成后返回用户态
重点知识:
1、陷入指令是在用户态执行的,执行陷入指令之后立即引发一个内中断,使CPU进入核心态
2、发出系统调用请求是在用户态,而对系统调用的相应处理在核心态下进行
3.6 系统调用知识点回顾
本网站原创文章版权归何大锤的狂飙日记所有。发布者:何大锤,转转请注明出处:何大锤的博客