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