操作系统 | 用户态和内核态的切换(中断、系统调用与过程(库函数)调用)
文章目录
- 中断
- 过程调用
- 系统调用
- 过程调用和系统调用的区别
中断
用户态、内核态之间的切换是怎么实现的?
- 用户态→内核态 是通过中断实现的。并且 中断是唯一途径 。
- 核心态→用户态 的切换是通过执行一个特权指令,将程序状态字 (
PSW
) 的标志位设置为 用户态 。
中断的处理过程:
- 执行完每个指令之后,CPU都要检查当前是否有外部中断信号。
- 如果检测到外部中断信号,则需要保护 被中断进程的CPU环境(如程序状态字
PSW
、程序计数器PC
、各种通用寄存器)。 - 根据中断信号类型转入相应的中断处理程序(进入内核态)。
- 恢复原进程的CPU环境并退出中断,返回原进程继续往下执行。
过程调用
过程调用也就是 微机原理里的 CALL 、编程时调用的 库函数 。由于库函数调用是基于C库的,因此也就不可能用于内核空间的驱动程序对设备的操作。
系统调用
系统调用其实是一个过程调用,但在过程调用内部隐藏着 陷阱(trap)指令 。过程调用中封装了系统调用是一种高内聚的设计方式,目的是让系统调用对研发人员透明。
系统调用本质上是 操作系统提供给用户程序调用的一组“特殊”接口(API
) 。用户程序可以通过这组 API
来获得操作系统内核提供的服务。
系统调用的过程:
以
open()
函数调用为例,当你调用open()
时,你正在执行对C库
的过程调用。其中,无论是对于open()
还是提供的其他系统调用,库都使用与内核一致的 调用约定 来将 参数 放在众所周知的位置(例如,在栈中或特定的寄存器中),将 系统调用号 也放入一个众所周知的位置(同样,放在栈或寄存器中),然后执行 陷阱(trap)指令 。库中陷阱之后的代码准备好返回值,并将 内核空间控制权 返回给发出系统调用的程序,并将特权级别提升到 内核模式 。完成作业后,操作系统调用一个特殊的从 陷阱返回(return-from-trap)指令,同时将特权级别降低,回到 用户模式 。因此,C库
中进行系统调用的部分是用汇编代码完成的,因为它们需要遵循约定,以便正确处理参数和返回值,以及执行硬件特定的陷阱指令。而之所以我们不必写汇编代码来trap
操作系统,是因为已经有人为我们写了这些汇编。
过程调用和系统调用的区别
过程调用 | 系统调用 |
---|---|
过程(库函数)调用通常用于应用程序中对一般文件的访问。 | 系统调用通常用于底层文件访问。 |
调用函数库中的一段程序(或函数)。 | 它调用系统内核的服务。 |
在用户空间运行,调用开销较小。 | 需要在用户空间和内核空间来回切换,开销较大。 |
库函数调用是系统无关的,因此可移植性好。 | 系统调用是操作系统相关的,因此一般没有跨操作系统的可移植性。 |
在所有的ANSI C编译器版本中,C库函数是相同的。 | 各个操作系统的系统调用是不同的。 |
操作系统 | 用户态和内核态的切换(中断、系统调用与过程(库函数)调用)相关推荐
- 操作系统用户态和内核态之间的切换过程
操作系统用户态和内核态之间的切换过程 1. 用户态和内核态的概念区别 究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分时候我们在写程序时关注的重 ...
- 操作系统(概述、组成)、用户态、内核态
1. 概述 1.1 基本特征 1.1.1 并发 并发是指宏观上在一段时间内能同时运行多个程序,而并行则指同一时刻能运行多个指令. 并行需要硬件支持,如多流水线或者多处理器. 操作系统通过引入进程和线程 ...
- Java程序员需要掌握的计算机底层知识(二):操作系统、内核、用户态与内核态、系统调用的执行过程
操作系统 启动过程 通电 -> bios uefi 工作 -> 自检 -> 到硬盘固定位置加载bootloader -> 读取可配置信息 -> CMOS CMOS 用来存 ...
- 用户态和内核态的切换耗费时间的原因
用户态和内核态的切换耗费时间的原因 总的来说,就是线程切换或者加锁解锁都是因为需要用户态和内核态的切换,从而导致的开销大. 应用程序的执行需要依托内核提供的资源,包括CPU.存储.IO等,因此内核提供 ...
- 操作系统基础知识用户态和内核态的区别
这节课给你带来了一道非常经典的面试题目:用户态线程和内核态线程有什么区别? 这是一个组合型的问题,由很多小问题组装而成,比如: 用户态和内核态是什么? 用户级线程和内核级线程是一个怎样的对应关系? 内 ...
- 操作系统中用户态和内核态(系统态)是什么?用户态如何变成内核态?
用户态:当进程在执行用户自己的代码时,则称其处于用户态,这时cpu 访问资源有限,运行在用户态下的程序不能直接访问操作系统内核数据结构和程序. 内核态:当一个任务(进程)执行系统调用而陷入内核代码中执 ...
- 操作系统:用户态与内核态
文章目录 用户态与内核态 用户态与内核态的概念 用户态 内核态 为什么要区分内核态和用户态 用户态与内核态的区别 用户态切换到内核态的方式 用户态与内核态空间分配 用户态与内核态 用户态与内核态的概念 ...
- 进程用户态和内核态及其切换过程
1.进程的堆栈 内核在创建进程的时候,会为进程创建相应的堆栈.每个进程会有两个栈,一个用户栈,存在于用户空间,一个内核栈,存在于内核空间.当进程在用户空间运行时,CPU堆栈指针寄存器里面的内容是用户堆 ...
- 用户态和内核态之间的切换
用户态和内核态之间的切换 切换方式 从用户态到内核态切换可以通过三种方式,或者说会导致从用户态切换到内核态的操作: 系统调用,这个上面已经讲解过了,在我公众号之前的文章也有讲解过.其实系统调用本身就是 ...
最新文章
- 树形数据深度排序处理示例(递归法).sql
- Fabio技术手册(1):概述和快速上手
- 第八章 shell学习之循环和结构化命令
- wxWidgets:wxSimpleHtmlListBox类用法
- 常用标准库_C语言标准IO库常用函数
- 关于报表中汇率转换的问题
- linux安装mq报5724,linux下MQ简单配置手册.doc
- php如何封装数组,PHP数组转对象 对象转数组封装类
- JProfiler 简要使用说明
- android源码编译出错的原因
- C++学习(一零九)Resource Hacker工具介绍
- Navicat Premium 15破解
- 六度分离 弗洛伊德算法
- IT职业技能图谱:IT工程师学习路线
- narwal机器人_Narwal云鲸扫地机器人扫拖彻底,用户用得更省心省力
- 量化研究数据来源汇总
- C# Parellel.For 和 Parallel.ForEach
- 【推荐系统】DUPN:Deep User Perception Network
- 宽带连接时用电脑开热点的方法
- Linux系统时间、系统时区和时钟同步的部分理解
热门文章
- java 观察者模式_图解Java设计模式之观察者模式
- linux时间戳转换不对,转换为unix时间戳不正确
- 垂直串联六关节机器人调试手册_不止下棋能赢你!新型协作机器人样样精通
- [UE4]性能优化指南(程序向)
- V210调整根分区大小
- html仿qq最小化怎么实现,JS仿QQ好友列表展开、收缩功能(第一篇)
- 由于找不到openni2_Kinect开发教程八:OpenNI2显示深度、彩色及融合图像
- python多级字典_Python多层字典取值
- 【转】Linux下c++调用自己编写的matlab函数:通过mcc动态链接库.so实现
- GPS/轨迹追踪、轨迹回放、围栏控制