1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 操作系统 | 用户态和内核态的切换(中断 系统调用与过程(库函数)调用)

操作系统 | 用户态和内核态的切换(中断 系统调用与过程(库函数)调用)

时间:2022-06-20 16:54:01

相关推荐

操作系统 | 用户态和内核态的切换(中断 系统调用与过程(库函数)调用)

文章目录

中断过程调用系统调用过程调用和系统调用的区别

中断

用户态、内核态之间的切换是怎么实现的?

用户态→内核态 是通过中断实现的。并且中断是唯一途径。核心态→用户态 的切换是通过执行一个特权指令,将程序状态字 (PSW) 的标志位设置为 用户态 。

中断的处理过程:

执行完每个指令之后,CPU都要检查当前是否有外部中断信号。如果检测到外部中断信号,则需要保护被中断进程的CPU环境(如程序状态字PSW、程序计数器PC、各种通用寄存器)。根据中断信号类型转入相应的中断处理程序(进入内核态)。恢复原进程的CPU环境并退出中断,返回原进程继续往下执行。

过程调用

过程调用也就是 微机原理里的CALL、编程时调用的库函数。由于库函数调用是基于C库的,因此也就不可能用于内核空间的驱动程序对设备的操作。

系统调用

系统调用其实是一个过程调用,但在过程调用内部隐藏着陷阱(trap)指令。过程调用中封装了系统调用是一种高内聚的设计方式,目的是让系统调用对研发人员透明。

系统调用本质上是操作系统提供给用户程序调用的一组“特殊”接口(API。用户程序可以通过这组API来获得操作系统内核提供的服务。

系统调用的过程:

open()函数调用为例,当你调用open()时,你正在执行对C库的过程调用。其中,无论是对于open()还是提供的其他系统调用,库都使用与内核一致的调用约定来将参数放在众所周知的位置(例如,在栈中或特定的寄存器中),将系统调用号也放入一个众所周知的位置(同样,放在栈或寄存器中),然后执行陷阱(trap)指令。库中陷阱之后的代码准备好返回值,并将内核空间控制权返回给发出系统调用的程序,并将特权级别提升到内核模式。完成作业后,操作系统调用一个特殊的从陷阱返回(return-from-trap)指令,同时将特权级别降低,回到用户模式。因此,C库中进行系统调用的部分是用汇编代码完成的,因为它们需要遵循约定,以便正确处理参数和返回值,以及执行硬件特定的陷阱指令。而之所以我们不必写汇编代码来trap操作系统,是因为已经有人为我们写了这些汇编。

过程调用和系统调用的区别

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。