用户态与内核态之间切换详解

2023-05-16

用户空间和内核空间

用户程序有用户态内核态两种状态。用户态就是执行在用户空间中,不能直接执行系统调用。必须先切换到内核态,也就是系统调用的相关数据信息必须存储在内核空间中,然后执行系统调用。

操作硬盘等资源属于敏感操作,为了内核安全,用户线程不能直接调用。而是采用了操作系统内核提供了系统调用接口,用户线程通过系统调用来实现文件读写。所以直接与硬盘打交道的是操作系统内核。

操作系统将线程分为了内核态和用户态,当用户线程调用了系统调用的时候,需要将线程从用户态切换到内核态。

无论是操作系统内核程序还是用户程序在运行的时候都需要申请内存来保存运行状态,调用方法信息、程序代码、数据等信息。

操作系统将内存分为内核空间用户空间

内核空间中主要负责 操作系统内核线程以及用户程序系统调用

用户空间主要负责用户程序的非系统调用

内核空间用户空间拥有更高的操作级别,只有在内核空间中才可以调用操作硬件等核心资源。

操作系统将内存按1:3的比例分为了内核空间和用户空间,用户态的运行栈信息保存在用户空间中,内核态的运行栈信息保存在内核空间中。运行栈中保存了当前线程的运行信息,比如执行到了哪些方法,局部变量等。

当发生用户态和内核态之间的切换的时候,运行栈的信息发生了变化,对应的CPU中的寄存器信息也要发生变换。但是用户线程完成系统调用的时候,还是要切换回用户态,继续执行代码的。所以要将发生系统调用之前的用户栈的信息保存起来,也就是将寄存器中的数据保存到线程所属的某块内存区域。这就涉及到了数据的拷贝,同时用户态切换到内核态还需要安全验证等操作。所以用户态和内核态之间的切换是十分耗费资源的。

用户态切换到内核态

在这里插入图片描述

CPU中有一个标志字段,标志着线程的运行状态。用户态和内核态对应着不同的值,用户态为3,内核态为0.

每个线程都对应着一个用户栈和内核栈,分别用来执行用户方法和内核方法。
用户方法就是普通的操作。
内核方法就是访问磁盘、内存分配、网卡、声卡等敏感操作。

当用户尝试调用内核方法的时候,就会发生用户态切换到内核态的转变。

切换流程:
1、每个线程都对应这一个TCB,TCB中有一个TSS字段,存储着线程对应的内核栈的地址,也就是内核栈的栈顶指针。

在这里插入图片描述

2、因为从用户态切换到内核态时,首先用户态可以直接读写寄存器,用户态操作CPU,将寄存器的状态保存到对应的内存中,然后调用对应的系统函数,传入对应的用户栈的PC地址和寄存器信息,方便后续内核方法调用完毕后,恢复用户方法执行的现场。

3、将CPU的字段改为内核态,将内核段对应的代码地址写入到PC寄存器中,然后开始执行内核方法,相应的方法栈帧时保存在内核栈中。

4、当内核方法执行完毕后,会将CPU的字段改为用户态,然后利用之前写入的信息来恢复用户栈的执行。

从上述流程可以看出用户态切换到内核态的时候,会牵扯到用户态现场信息的保存以及恢复,还要进行一系列的安全检查,比较耗费资源。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用户态与内核态之间切换详解 的相关文章

  • AD、PADS、allegro 哪个好用?

    AD PADS allegro 哪个好用 xff1f 用哪个都没问题 xff0c 都能完成任务 xff0c 主要看公司的选择了 AD是元老级的软件了 xff0c 也是PCB设计最先出的软件 xff0c 使用最为广范 在很多操作上都非常的人性
  • 基于python+pyqt5的串口助手

    基于python 43 pyqt5的串口助手 环境 xff1a pycharm python3 8 xff0c pyqt5 xff0c pyserial xff08 需要该节的工程文件 请私信 xff0c 或加VX xff1a Crazzy
  • STM32F4四轴飞行器总结

    xff08 菜鸡一枚 xff0c 记录一些学习的体会 xff0c 并记录了学习时提出的问题 xff0c 便于自己再次查阅 xff0c 若有错误之处 xff0c 希望大佬们指正 xff0c 谢谢 xff09 四旋翼简介 xff1a 嵌入式芯片
  • 详解RTK,RTD,SBAS,WAAS,PPP,PPK,广域差分等技术之间的关系与区别

    RTK与RTD的区别 xff0c 一个是载波相位差分 一个是码差分 xff0c 并且RTK的定位精度要高一些 RTK与PPK的区别 xff0c 一个是实时提供数据信息 xff0c 一个是事后处理 WAAS是SBAS系统一个具体的实例 xff
  • c实现set集合

    集合有点编程语言会带有 xff0c 有的没有 但是我想redis的集合set你一定听说过或者用过 下面咱们用链表来实现set 相信有了前面的基础我们可以很容易的实现set集合 需要引入我的链表的list c和list h 头文件 span
  • 实时单目物体SLAM Real-time Monocular Object SLAM

    2015 摘要 xff1a 我们提出了一个基于对象的实时SLAM系统 xff0c 该系统利用了迄今为止最大的对象数据库 我们的方法包括两个主要部分 xff1a 1 xff09 利用对象刚性约束改进地图并找到其真实比例的单目SLAM算法 xf
  • linux下多线程服务器编程

    前言 xff1a 整个程序的架构就是一开始创建一个线程 xff0c 在这个线程里面做下面几个操作 xff1a 1 调用socket xff0c 创建监听客户端的socket 2 设置socket属性 xff0c 端口可以重用 3 调用bin
  • MavLink简单使用

    参考连接 xff1a https mavlink io zh 整体说明 本文不探究mavlink协议的具体内容 xff0c 只说明如何简单使用 环境 xff1a win10 c c 43 43 MAVLink仓库clone 我们其实clon
  • gazebo支持的载具类型

    类型make指令四旋翼make px4 sitl gazebo具有光流的四旋翼make px4 sitl gazebo iris opt flow3DR Solo xff08 四旋翼 xff09 make px4 sitl gazebo s
  • YoLov3目标检测代码C++版本运行

    论文地址 xff1a YOLO YOLOv2 YOLO9000 YOLOv3 YOLOv4 YOLO系列权重 配置文件下载地址 xff1a https github com AlexeyAB darknet 代码解读 xff1a Deep
  • C++ ::

    表示作用域 xff0c 和所属关系 是运算符中等级最高的 xff0c 它分为三种 1 global scope 全局作用域符 xff09 xff0c 用法 xff08 name 2 class scope 类作用域符 xff09 xff0c
  • 下载Gazebo模型

    下载Gazebo模型 这时运行下面Gazebo命令 xff0c OK xff0c 错误没有了 xff0c 但怎么是一抹黑啊 xff01 roscore amp rosrun gazebo ros gazebo 首次运行Gazebo xff0
  • Linux 项目实战记录

    1 阻塞 非阻塞 同步 异步 网络IO 典型的一次IO的两个阶段是什么 xff1f 数据就绪和数据读写 数据就绪 xff1a 根据IO操作的就绪状态 阻塞 xff1a 1 调用IO方法的线程进入阻塞状态 xff0c xff08 函数进入wa
  • Mission Planner日志分析

    将找到的不同平台的Mission planner日志分析资源汇总起来以便以后查看 xff1a Pixhawk无人机教程 8 1 在Mission Planner中下载与分析日志 APM 自动拍摄后期POS数据 APM和PIX飞控日志分析入门
  • 关于iai_kinect2中标定数据的个人理解

    iai kinect2 kinect2 bridge data 196605135147 iai kinect2 kinect2 bridge data 299150235147
  • mac地址的作用

    最近读一本关于linux编程的书籍 xff0c 看到一部分很迷茫 xff0c 忽然不知道mac地址的作用 xff0c 既然已经有了ip地址了要mac地址何用呢 xff1f MAC地址是数据链路层的地址 xff0c 如果mac地址不可直达 直
  • putty远程连接服务器,显示超时,网络么有问题

    今天用putty连接阿里云服务器时 xff0c 用ip连接一直显示超时 换了端口号也没用 xff0c 最后 xff0c 重启了一下服务就好了 xff0c 记录一下以免以后碰到
  • CUDA11.x VS2017编译报错MSB3721

    问题原因 xff1a 11 XCUDA版本太高 xff0c 用10版本的就行了 博主电脑是联想拯救者3070显卡 xff0c 于是就按照网上的教程下载了适合我NVIDIA版本11 4的CUDA 按照网上配置弄完之后 xff0c VS2017
  • Ubuntu 使用VNCserver远程连接灰屏问题的解决方案

    问题 xff1a Ubuntu需要使用VNCserver服务提供远程桌面 xff0c 使用TightVNC Viewer远程连接主机 xff0c 发现只能出现三个正常显示的桌面 xff0c 继续开更多的桌面 xff0c 就会发现新开的窗口都
  • opencv-python(六):颜色空间及转换

    0 颜色模式 RGB 模式 百万种颜色 CMYK 模式 四种印刷色 索引模式 256 种颜色 xff09 灰度模式 256 级灰度 xff09 位图模式 两种颜色 xff09 0 1 灰度模式 也就是灰度图 黑白照片 xff0c 每个像素只

随机推荐

  • python爬虫之多线程、多进程爬虫

    一 原因 多线程对爬虫的效率提高是非凡的 xff0c 当我们使用python的多线程有几点是需要我们知道的 xff1a 1 Python的多线程并不如java的多线程 xff0c 其差异在于当python解释器开始执行任务时 xff0c 受
  • Ubuntu16 ROS ORB-SLAM3 intelD435与单目USB_CAM 跑自己的摄像头运行成功记录

    我也是根据其他人的教程来的 xff0c 其实我应该搞错了顺序 xff0c 按道理是先安装ROS xff0c 然后是D435驱动 xff0c 再下载ORBSLAM3 再编译SLAM3的非ROS xff0c 再编译SLAM3的ROS 但是这个顺
  • stm32 驱动ADXL345传感器例程(IIC驱动,可自行改SPI方式)

    stm32 驱动ADXL345传感器例程 xff08 IIC驱动 xff0c 可自行改SPI方式 xff09 前言一 介绍ADXL345传感器二 STM32驱动使用步骤1 配置IIC通信协议2 寄存器初始化配置3 读入数据串口打印 三 成果
  • (6)gazebo打开后黑屏,提示preparing your world

    问题描述 xff1a 运行roscore xff0c 再运行rosrun gazebo ros gazebo xff0c 可以打开gazebo xff0c 但是发现界面会发现一直处于黑屏这种状态 xff0c 提示preparing your
  • 树莓派3B+(64位)安装Ubuntu mate 16.04.2以及彩虹屏解决方案及相关文件

    1 烧录工具 链接 xff1a https pan baidu com s 1c5Vf9zzpCBySEyBNP 7nw pwd 61 1234 提取码 xff1a 1234 2 树莓派3B 43 xff08 64位 xff09 Ubunt
  • [shopee内推] 前端、后端、测试目前公司拉美市场急缺人才

    待遇超级好 薪资超级高 工作地点 xff1a 深圳 可直接发送简历到 xff1a ziwen jiang 64 qq com 可加微信 xff1a JZWen tiger 职位描述 岗位职责 xff1a 1 参与面向东南亚等地区的线上 am
  • mac xcode出现xxx.h没有出现的问题

    mac xcode出现xxx h没有出现的问题 xff0c 在命令行使用g 43 43 lxx编译代码却完全没有问题 xff0c 得出的结论是xcode的配置不到位 找了半个小时没找到莫名的烦躁 xff0c 使用xarman studio
  • 深入理解Linux网络:第二章-内核是怎么接收数据包的?

    关于中断 内核和网络设备驱动都是通过中断的方式来处理的 当然中断分为两种 xff0c 硬中断和软中断 当设备有数据进来了 xff0c 设备首先会触发硬中断 xff0c 因为处理数据需要耗费很长的时间所以CPU肯定是要把耗时的事情交给别人去干
  • 深入理解Linux网络:第三章-内核是如何与用户进程协作的

    本章主要讲用户进程接收并处理数据 xff0c 主要是介绍 xff0c 同步阻塞和多路IO复用方案 同步阻塞 一个进程维护一个链接 xff0c 同时为了等待数据到来需要阻塞进程 xff0c 还要切换进程上下文 创建Socket进入内核态 xf
  • 关于ssm框架,自己学到了的认识的东西

    1 先说说Maven吧 第一次用这东西 xff0c 很恐怖 其实简单说它的作用就是管理你的jar包 我们可以通过配置pom xml文件去下载相应的jar包 然后就再也不需要担心jar包版本不匹配的问题 注意1 xff1a 尽量选使用量高的j
  • 大白话 java动态代理——秒懂系列

    代理模式分为动态代理和静态代理 xff0c 重点是动态代理 什么叫做代理 xff1f 首先要有一个接口 xff0c 定义了我们的服务 xff08 标准 xff09 然后是一个实现类 xff08 继承上面那个接口 xff09 还有有一个代理类
  • 杭州顶象技术面经+解析

    额 xff0c 第一份面经 xff0c 电面 xff0c 好难受 xff0c 好像凉了 xff0c 一篇凉经 1 跨域解决 这是一道常见面试题 所以我还是需要多看看nginx原理 xff0c 因为我还是很有可能就答ngxin的 1 json
  • volatile关键字 + happens-before原则

    volatile 可见性 有序性 记住了 xff0c 人家不保证原子性的 先说说volatile关键字 被volatile关键字修饰的变量 xff0c 再多线程中 xff0c 一个线程修改他会立即被其他线程看到 xff0c 可能这样你不太理
  • linux常问面试题

    写下来慢慢看 linux 1 查看当前路径 pwd 2 怎么清屏 xff1f 清屏 xff1a clear 3 怎么退出当前命令 xff1f 退出当前命令 xff1a ctrl 43 c 彻底退出 4 怎么执行睡眠 xff1f 执行睡眠 x
  • JUC_大厂面试必问

    J U C java util concurrent 包下的类 大家先来看一张图几片吧 首先juc分为 tools xff1a lock collections 线程池 xff1a atomic 感兴趣的同学可以关注我的公众号 xff0c
  • 字符串最小变换次数——动态规划

    感觉自己算法太菜了 woc xff0c 想找一个算法大佬 xff0c 给他做舔狗 package offer 动态规划求解 将字符串A变换为字符串B 所用的最少字符操作次数 public class Day0418 demo01 publi
  • 《动手学深度学习》环境配置篇

    自己按照书上Windows的安装中遇到的问题 D d2l zh gt conda env create f environment yml Warning you have pip installed dependencies in you
  • linux socket编程以及简单的tcp,udp的例子

    linux socket编程以及简单的tcp udp的例子 通过socket编程大致对网路编程的脉络有个大致的了解 xff0c 如果有不太懂的地方 xff0c 咱们可以到网络上查找手册 socket的基本操作 创建socket int so
  • Tightly-coupled Fusion of Global Positional Measurements in Optimization-based Visual-Inertial Odome

    文章目录 采用了基于滑动窗口的优化方法 xff0c 在VIO紧耦合的框架中加入了全局传感器作为约束 xff0c 在改善定位精度的同时 xff0c 没有破坏算法的实时性 从实验来看室外场景引入GPS信息获得了比较不错的效果提升 xff0c 但
  • 用户态与内核态之间切换详解

    用户空间和内核空间 用户程序有用户态和内核态两种状态 用户态就是执行在用户空间中 xff0c 不能直接执行系统调用 必须先切换到内核态 xff0c 也就是系统调用的相关数据信息必须存储在内核空间中 xff0c 然后执行系统调用 操作硬盘等资