文章目录

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

中断

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

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


中断的处理过程:

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


过程调用

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


系统调用

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

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

系统调用的过程:

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


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

过程调用 系统调用
过程(库函数)调用通常用于应用程序中对一般文件的访问。 系统调用通常用于底层文件访问。
调用函数库中的一段程序(或函数)。 它调用系统内核的服务。
在用户空间运行,调用开销较小。 需要在用户空间和内核空间来回切换,开销较大。
库函数调用是系统无关的,因此可移植性好。 系统调用是操作系统相关的,因此一般没有跨操作系统的可移植性。
在所有的ANSI C编译器版本中,C库函数是相同的。 各个操作系统的系统调用是不同的。

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

  1. 操作系统用户态和内核态之间的切换过程

    操作系统用户态和内核态之间的切换过程 1. 用户态和内核态的概念区别 究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分时候我们在写程序时关注的重 ...

  2. 操作系统(概述、组成)、用户态、内核态

    1. 概述 1.1 基本特征 1.1.1 并发 并发是指宏观上在一段时间内能同时运行多个程序,而并行则指同一时刻能运行多个指令. 并行需要硬件支持,如多流水线或者多处理器. 操作系统通过引入进程和线程 ...

  3. Java程序员需要掌握的计算机底层知识(二):操作系统、内核、用户态与内核态、系统调用的执行过程

    操作系统 启动过程 通电 -> bios uefi 工作 -> 自检 -> 到硬盘固定位置加载bootloader -> 读取可配置信息 -> CMOS CMOS 用来存 ...

  4. 用户态和内核态的切换耗费时间的原因

    用户态和内核态的切换耗费时间的原因 总的来说,就是线程切换或者加锁解锁都是因为需要用户态和内核态的切换,从而导致的开销大. 应用程序的执行需要依托内核提供的资源,包括CPU.存储.IO等,因此内核提供 ...

  5. 操作系统基础知识用户态和内核态的区别

    这节课给你带来了一道非常经典的面试题目:用户态线程和内核态线程有什么区别? 这是一个组合型的问题,由很多小问题组装而成,比如: 用户态和内核态是什么? 用户级线程和内核级线程是一个怎样的对应关系? 内 ...

  6. 操作系统中用户态和内核态(系统态)是什么?用户态如何变成内核态?

    用户态:当进程在执行用户自己的代码时,则称其处于用户态,这时cpu 访问资源有限,运行在用户态下的程序不能直接访问操作系统内核数据结构和程序. 内核态:当一个任务(进程)执行系统调用而陷入内核代码中执 ...

  7. 操作系统:用户态与内核态

    文章目录 用户态与内核态 用户态与内核态的概念 用户态 内核态 为什么要区分内核态和用户态 用户态与内核态的区别 用户态切换到内核态的方式 用户态与内核态空间分配 用户态与内核态 用户态与内核态的概念 ...

  8. 进程用户态和内核态及其切换过程

    1.进程的堆栈 内核在创建进程的时候,会为进程创建相应的堆栈.每个进程会有两个栈,一个用户栈,存在于用户空间,一个内核栈,存在于内核空间.当进程在用户空间运行时,CPU堆栈指针寄存器里面的内容是用户堆 ...

  9. 用户态和内核态之间的切换

    用户态和内核态之间的切换 切换方式 从用户态到内核态切换可以通过三种方式,或者说会导致从用户态切换到内核态的操作: 系统调用,这个上面已经讲解过了,在我公众号之前的文章也有讲解过.其实系统调用本身就是 ...

最新文章

  1. 树形数据深度排序处理示例(递归法).sql
  2. Fabio技术手册(1):概述和快速上手
  3. 第八章 shell学习之循环和结构化命令
  4. wxWidgets:wxSimpleHtmlListBox类用法
  5. 常用标准库_C语言标准IO库常用函数
  6. 关于报表中汇率转换的问题
  7. linux安装mq报5724,linux下MQ简单配置手册.doc
  8. php如何封装数组,PHP数组转对象 对象转数组封装类
  9. JProfiler 简要使用说明
  10. android源码编译出错的原因
  11. C++学习(一零九)Resource Hacker工具介绍
  12. Navicat Premium 15破解
  13. 六度分离 弗洛伊德算法
  14. IT职业技能图谱:IT工程师学习路线
  15. narwal机器人_Narwal云鲸扫地机器人扫拖彻底,用户用得更省心省力
  16. 量化研究数据来源汇总
  17. C# Parellel.For 和 Parallel.ForEach
  18. 【推荐系统】DUPN:Deep User Perception Network
  19. 宽带连接时用电脑开热点的方法
  20. Linux系统时间、系统时区和时钟同步的部分理解

热门文章

  1. java 观察者模式_图解Java设计模式之观察者模式
  2. linux时间戳转换不对,转换为unix时间戳不正确
  3. 垂直串联六关节机器人调试手册_不止下棋能赢你!新型协作机器人样样精通
  4. [UE4]性能优化指南(程序向)
  5. V210调整根分区大小
  6. html仿qq最小化怎么实现,JS仿QQ好友列表展开、收缩功能(第一篇)
  7. 由于找不到openni2_Kinect开发教程八:OpenNI2显示深度、彩色及融合图像
  8. python多级字典_Python多层字典取值
  9. 【转】Linux下c++调用自己编写的matlab函数:通过mcc动态链接库.so实现
  10. GPS/轨迹追踪、轨迹回放、围栏控制