文章目录
- 中断
- 过程调用
- 系统调用
- 过程调用和系统调用的区别
中断
用户态、内核态之间的切换是怎么实现的?
- 用户态→内核态 是通过中断实现的。并且 中断是唯一途径 。
- 核心态→用户态 的切换是通过执行一个特权指令,将程序状态字 (
PSW
) 的标志位设置为 用户态 。
中断的处理过程:
- 执行完每个指令之后,CPU都要检查当前是否有外部中断信号。
- 如果检测到外部中断信号,则需要保护 被中断进程的CPU环境(如程序状态字
PSW
、程序计数器PC
、各种通用寄存器)。 - 根据中断信号类型转入相应的中断处理程序(进入内核态)。
- 恢复原进程的CPU环境并退出中断,返回原进程继续往下执行。
过程调用
过程调用也就是 微机原理里的 CALL 、编程时调用的 库函数 。由于库函数调用是基于C库的,因此也就不可能用于内核空间的驱动程序对设备的操作。
系统调用
系统调用其实是一个过程调用,但在过程调用内部隐藏着 陷阱(trap)指令 。过程调用中封装了系统调用是一种高内聚的设计方式,目的是让系统调用对研发人员透明。
系统调用本质上是 操作系统提供给用户程序调用的一组“特殊”接口(API
) 。用户程序可以通过这组 API
来获得操作系统内核提供的服务。
系统调用的过程:
以
open()
函数调用为例,当你调用open()
时,你正在执行对C库
的过程调用。其中,无论是对于open()
还是提供的其他系统调用,库都使用与内核一致的 调用约定 来将 参数 放在众所周知的位置(例如,在栈中或特定的寄存器中),将 系统调用号 也放入一个众所周知的位置(同样,放在栈或寄存器中),然后执行 陷阱(trap)指令 。库中陷阱之后的代码准备好返回值,并将 内核空间控制权 返回给发出系统调用的程序,并将特权级别提升到 内核模式 。完成作业后,操作系统调用一个特殊的从 陷阱返回(return-from-trap)指令,同时将特权级别降低,回到 用户模式 。因此,C库
中进行系统调用的部分是用汇编代码完成的,因为它们需要遵循约定,以便正确处理参数和返回值,以及执行硬件特定的陷阱指令。而之所以我们不必写汇编代码来trap
操作系统,是因为已经有人为我们写了这些汇编。
过程调用和系统调用的区别
过程调用 | 系统调用 |
---|---|
过程(库函数)调用通常用于应用程序中对一般文件的访问。 | 系统调用通常用于底层文件访问。 |
调用函数库中的一段程序(或函数)。 | 它调用系统内核的服务。 |
在用户空间运行,调用开销较小。 | 需要在用户空间和内核空间来回切换,开销较大。 |
库函数调用是系统无关的,因此可移植性好。 | 系统调用是操作系统相关的,因此一般没有跨操作系统的可移植性。 |
在所有的ANSI C编译器版本中,C库函数是相同的。 | 各个操作系统的系统调用是不同的。 |