目录
前言
在学习操作系统和计算机组成原理课程的时候,往往一谈到中断与系统调用大家就一头雾水,这里希望可以记录一些自己的理解,一个是帮助大家辨析理解,一个也是用做自己以后的复习学习。
本文中个人理解较多,如有错误希望大家可以在评论区批评指正。
预告一下,下篇学习笔记有关于进程&线程的相关知识。大家的点赞是我更新的动力呀!
一、中断机制&系统调用
1.前提:处理器的运行模式
中断机制存在的前提是,处理器(CPU)的运行模式被划分为用户态和内核态。
简单的说:
(1)内核态下,处理器(CPU)可以执行所有的指令,除了“访管”指令(“访管”指令,又名自陷指令,还叫trap指令),即完成特权指令。进一步细分,内核主要能完成以下四种操作:
- 时钟管理
- 中断机制
- 原语
- 系统控制相关的数据结构及其处理
这里要完成一个补充说明:所谓的广义指令就是系统调用指令,所以广义指令的执行一定在内核态下完成,而调用广义指令的指令不一定在内核态,用户态也有
(2)用户态下,处理器(CPU)只能执行非特权指令,以及“访管”指令(这个指令只能在用户态下完成,内核干不了)。
2.中断分类
- 一般定义下的中断=中断(外中断,interruption)+异常(内中断,exception)
- 外中断=可屏蔽中断(INTR)+不可屏蔽中断(NMI) ->没有这么重要
- 异常=故障(fault)+自陷(trap)+终止(abort) ->比较重要
用些例子来帮助记忆:
- 故障(fault):缺页,非法操作码,除以0;
- 自陷(trap):用户态下一些不能完成的指令通过trap可以主动进入内核态;
- 终止(abort):硬件故障;
- 外中断(interruption):来自CPU外部(反正就是跟指令没啥关系)。
3.系统调用
用户希望用到操作系统所提供的一些子功能,即通过调用能完成一些用户态做不了但是操作系统的内核态可以做的事情。
具体有哪些事情呢?
- 设备管理:完成启动设备;
- 文件管理:完成对文件的W/R,CREATE,DEL;
- 内存管理:完成内存的分配、回收以及地址管理;
- 进程管理:完成对进程的创建、撤销、唤醒;
- 进程通信:完成进程之间的通信;
这里要特别对内存管理进行说明
我在黑书上看见过一个特别有趣而且容易理解的例子,内核态下对内存的管理可以比喻成用杯子接水:
具体的讲,在内核态下操作系统只提供一个可以用来接水的杯子(即完成内存分配),等你喝完水了再把杯子收回来(即完成内存回收),而且他知道这些杯子放在哪里(即地址管理)。而至于用户要喝水还是饮料,都随意(即在内存中取数,存数,这些过程都在用户态下可完成)。
二、系统调用的过程(重点)
1.触发系统调用
此步骤在用户态下完成
用户程序中的写的需要操作系统帮助完成的指令,完成对系统调用的触发。并关中断,即不能被新的中断打断,不接受其他中断的处理。
2.传递系统调用所用到的各种参数
此步骤在用户态下完成
正在运行的进程传递系统调用的相关参数。即保存断点以及程序状态,等待处理完成后继续执行。
3.执行“访管”指令(trap指令)
此步骤完成将用户态转变为内核态
这里根据trap指令的具体值来区分操作系统到底需要帮助用户完成什么操作,同时并将返回地址压入堆栈以备后用。
4.执行相应的服务程序
此步骤在内核态下完成
接下来是CPU执行相应的内核态服务程序。
5.返回用户态
此步骤标识系统调用结束
开中断,允许中断请求。返回用户态,继续执行在用户态下执行用处程序。
总结
总结一下,系统调用是中断的一种情况,是用户自己希望借助内核态能执行的特权指令时触发的中断。因为处理器的特殊运行模式,将用户态和内核态隔离,但通过中断就可以打破这种隔离。中断也是打破隔离的唯一途径。当中断(interruption || exception)发生时,运行于用户态的CPU会立即进入内核态,这种进入是通过硬件实现的。
同时,拥有中断机制之后不仅能提升CPU的效率,也为我们后续对进程&线程相关知识学习做下铺垫。(很多操作都是通过中断完成的)