用户态与内核态之间切换详解[通俗易懂]

用户态与内核态之间切换详解[通俗易懂]用户态切换到内核态CPU中有一个标志字段,标志着线程的运行状态。用户态和内核态对应着不同的值,用户态为3,内核态为0.每个线程都对应着一个用户栈和内核栈,分别用来执行用户方法和内核方法。用户方法就是普通的操作。内核方法就是访问磁盘、内存分配、网卡、声卡等敏感操作。当用户尝试调用内核方法的时候,就会发生用户态切换到内核态的转变。切换流程:1、每个线程都对应这一个TCB,TCB中有一个TSS字段,存储着线程对应的内核栈的地址,也就是内核栈的栈顶指针。2、因为从用户态切换到内核态时,需要将用户态.

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

用户空间和内核空间

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

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

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

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

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

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

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

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

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

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

用户态切换到内核态

在这里插入图片描述

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

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

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

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

在这里插入图片描述

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/192390.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • rubymine激活成功教程版_ruby gem

    rubymine激活成功教程版_ruby gem运行patcher.jar,找到rubymine安装目录下的lib目录的rubymine.jar打补丁

    2025年7月16日
    1
  • lcd1602模块的基本组成_1602液晶显示模块P0口

    lcd1602模块的基本组成_1602液晶显示模块P0口LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。下图即是该模块:(百度百科)一般来说,在嵌入式开发领域显示模块是非常重要的一部分,所以发展出了许多种应用在不同场合的集成显示模块。LCD1602由于出现较早,所以即便出现了应用更广泛的、…

    2022年9月23日
    0
  • anaconda卸载环境[通俗易懂]

    anaconda卸载环境[通俗易懂]如果是用anaconda新建了一个环境(比如原生py2.7版本的anaconda,新建了一个py3.6的环境),现在要将py3.6卸载,也就是将这个环境、包括第三方库和python3.6本身都删除,那么可以这样做:1.打开anaconda自带的命令行工具2.确保当前激活的环境不是你要卸载的环境,如果是,那么需要运行:activatexxxxxx是其他环境名,切换到其他环境3….

    2022年6月26日
    77
  • 什么是序列化,怎么序列化,为什么序列化,反序列化会遇到什么问题,如何解决。

    点击上方“全栈程序员社区”,星标公众号 重磅干货,第一时间送达 作者:riemann_ blog.csdn.net/riemann_/article/details/8783526…

    2021年6月25日
    81
  • 如果要将二叉树{16,14,10,8,7,9,3}_二叉分枝

    如果要将二叉树{16,14,10,8,7,9,3}_二叉分枝有一棵二叉苹果树,如果树枝有分叉,一定是分两叉,即没有只有一个儿子的节点。这棵树共 N 个节点,编号为 1 至 N,树根编号一定为 1。我们用一根树枝两端连接的节点编号描述一根树枝的位置。一棵苹果树的树枝太多了,需要剪枝。但是一些树枝上长有苹果,给定需要保留的树枝数量,求最多能留住多少苹果。这里的保留是指最终与1号点连通。输入格式第一行包含两个整数 N 和 Q,分别表示树的节点数以及要保留的树枝数量。接下来 N−1 行描述树枝信息,每行三个整数,前两个是它连接的节点的编号,第三个数是这根树枝上

    2022年8月9日
    5
  • notepad++注释快捷键[通俗易懂]

    notepad++注释快捷键[通俗易懂]notepad++注释快捷键快捷键如下:单行、多行注释//方式:ctrl+k区块注释/**/方式:ctrl+q取消单行、多行、区块注释:ctrl+shift+k…

    2022年5月26日
    402

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号