什么是用户态和内核态?用户态和内核态是如何切换的?

一、什么是用户态和内核态?

1.1、概述

用户态和内核态是操作系统的两种运行状态。

内核态:处于内核态的 CPU 可以访问任意的数据,包括外围设备,比如网卡、硬盘等,处于内核态的 CPU 可以从一个程序切换到另外一个程序,并且占用 CPU 不会发生抢占情况,一般处于特权级 0 的状态我们称之为内核态。

用户态:处于用户态的 CPU 只能访问受限资源,不能直接访问内存等硬件设备,不能直接访问内存等硬件设备,必须通过「系统调用」陷入到内核中,才能访问这些特权资源。

1.2、为什么要区分用户态和内核态?

在 CPU 的所有指令中,有一些指令是非常危险的,如果错用,将导致整个系统崩溃,比如:清空内存,修改时钟等。如果所有的程序代码都能够直接使用这些指令,那么很有可能我们的系统一天将会死 n 次。

所以,CPU将指令分为 特权指令 和 非特权指令 ,对于较为危险的指令,只允许操作系统本身及其相关模块进行调用,普通的、用户自行编写的应用程序只能使用那些不会造成危险的指令。

基于安全的考虑,CPU 提供了特权分级机制,把区域分成了四个 Ring,越往里权限越高,越往外权限越低。
在这里插入图片描述
操作系统根据 CPU 的特权分级机制,把进程的运行空间分为「内核空间」和「用户空间」,分别对应着上图中, CPU 特权等级的 Ring 0 和 Ring 3。

二、什么时候会从用户态陷入内核态?

有三种方式程序会从用户态陷入内核态:

系统调用:这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作。
异常:当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。
外围设备的中断:当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。
这3种方式是系统在运行时由用户态转到内核态的最主要方式,其中系统调用可以认为是用户进程「主动」发起的,异常和外围设备中断则是「被动」的。

三、什么是系统调用?过程是怎么样的?

当程序需要访问硬件资源的时候,比如内存、硬盘等,就需要通过「系统调用」陷入到内核中,才能访问这些特权资源。系统调用可以理解为内核实现的函数,比如应用程序要通过网卡接收数据,会调用 Socket 的 read 函数。
在这里插入图片描述
程序在执行系统调用的过程中会从用户态切换到内核态,再从内核态切换到用户态,过程如下:在这里插入图片描述

系统调用的过程:

从用户态到内核态:当应用程序使用系统调用时,先将系统调用名称转换为系统调用号,接着将「系统调用号」和「请求参数」放到寄存器里,然后执行中断指令(int $0x80 指令),产生一个中断,CPU 陷入到内核态。
执行内核态逻辑:CPU 跳转到中断处理程序,先将当前用户态的寄存器(用户态的代码段、数据段、保存参数的寄存器)保存到内核数据结构,接着将系统调用号从寄存器里面取出来,最后根据系统调用号,在「系统调用表」中找到相应的系统调用函数进行调用,并将寄存器中保存的参数取出来,作为函数参数。
从内核态到用户态:执行完系统调用后,执行中断返回指令(iret 指令),将原来用户态保存的现场恢复回来,包含代码段、指令指针寄存器等。这时候 CPU 恢复到用户态,用户态进程恢复执行。
一次系统调用过程中的,会发生两次「 CPU 上下文切换」(所谓的 CPU 上下文就是 CPU 寄存器和程序计数器):

第一次 CPU 上下文切换是从用户态切换到内核态:CPU 寄存器里原来用户态的指令位置,需要先保存起来。接着,为了执行内核态代码,CPU 寄存器需要更新为内核态指令的新位置。最后才是跳转到内核态运行内核任务。
第二次 CPU 上下文切换是从内核态切换到用户态: CPU 寄存器需要恢复原来保存的用户态,然后再切换到用户空间,继续运行进程。
在这里插入图片描述

四、用户态和内核态是如何切换的?

Linux 系统中每个进程都有两个栈,分别是用户栈和内核栈,当应用程序运行在用户态的时候,就会使用用户栈,当应用程序运行在内核态的时候,就会使用内核栈。

内核态与用户态的相互切换,其中最重要的一个步骤就是用户栈和内核栈的切换。

1、用户栈到内核栈:

执行中断指令(int $0x80 指令),中断发生时,CPU 去一个特定的结构(比如 TSS)中,获取该进程的内核栈的地址信息,也就是内核栈的段选择子和栈顶指针(这两个东西是描述内核栈在内存的哪个地址空间),并分别送入 ss 寄存器和 rsp 寄存器,这时候 CPU 就指向了该进程的内核栈的栈顶位置了,这就完成了用户态到内核态的一次栈的切换。(*PS:如果不明白 ss 和 rsp 寄存器是干嘛的,可以看这篇文章:一个学渣对于stack的顿悟(1):从CPU的视角说起)
然后,IP 寄存器(指令指针寄存器)跳入中断服务程序开始执行,中断服务程序会把用户态的所有寄存器压入到内核栈中,如下图,CPU 自动地将用户态栈的段选择子 ss3,和栈顶指针 rsp3 都放到内核态栈里了。这里的数字 3 代表了 CPU 特权级,内核态是 0,用户态是 3。
在这里插入图片描述
2、内核栈到用户栈

当中断结束时,中断服务程序会从内核栈里将 CPU 寄存器的值全部恢复,最后再执行iret指令。
将 ss3/rsp3 都弹出栈,并且将这个值分别送到 ss 和 rsp 寄存器中,这时候 CPU 就指向了该进程的用户栈的栈顶位置了,这样就完成了从内核栈到用户栈的一次切换。
内核栈的 ss0 和 rsp0 也会被保存到前面所说的 CPU 的一个特定的结构(比如 TSS)中,以供下次切换时使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/328869.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Rust学习】安装Rust环境

本笔记为了记录学习Rust过程,内容如有错误请大佬指教 使用IDE:vs code 参考教程:菜鸟教程链接: 菜鸟教程链接: Rust学习 Rust入门安装Rust编译环境Rust 编译工具 构建Rust 工程目录 Rust入门 安装Rust编译环境 因为我已经安装过VSCode了&am…

数据结构中的一棵树

一、树是什么? 有根有枝叶便是树!根只有一个,枝叶可以有,也可以没有,可以有一个,也可以有很多。 就像这样: 嗯,应该是这样: 二、一些概念 1、高度 树有多高&#x…

正点原子imx6ull网络环境配置:开发板和电脑通过网线直连、电脑WiFi上网

1.硬件连接 开发板通过网线连接电脑。电脑连接wifi 2.VMware设置 2.1添加桥接模式和NAT模式 1)打开vm设置 2)设置网络适配器为桥接模式,不要勾选 “赋值物理网络连接状态” 3) 添加一个网络适配器并设置成NAT模式,…

力扣hot100 颜色分类 双指针 滚动赋值

Problem: 75. 颜色分类 文章目录 思路解题方法复杂度Code💖 超简洁版 思路 解题方法 描述你的解题方法 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( 1 ) O(1) O(1) Code class Solution { public void sortColors(int[] nums){int n nums.length…

QGroundControl Qt安卓环境搭建及编译出现的问题

记录Qt 5.15.2搭建安卓环境出现的各种问题。 zipalign tool not found: D:/JavaAndroid/Android/sdk/build-tools//zipalign.exe? 答:需要将DANDROID_PLATFORM升级到已下载的版本. bin/llvm-readobj.exe: error: unknown argument ‘–libs’ 答&…

社交媒体数据分析:解读Facebook用户行为

在当今数字化时代,社交媒体已经成为人们生活不可或缺的一部分,而Facebook作为这个领域的巨头,承载了数十亿用户的社交活动。这庞大的用户群体产生了海量的数据,通过深度数据分析,我们能够深入解读用户行为,…

乐鑫科技业绩超预期修复,Wi-Fi芯片龙头走出“V底”了?

2024年伊始,又到了A股开始业绩披露的时间节点。 尽管A股业绩预告序幕刚刚拉开,但为数不多的企业预告似乎还是透露出某些信号:2023年国内半导体企业的业绩或许并没有想象中的“差”,相反正在逐渐改善。 通过同花顺问财进行筛选发…

php反序列化漏洞基础

一、序列化 serialize(): 序列化是将对象或类转换为字符串的过程,以便在程序运行过程中对其进行持久化存储或传输的操作。在PHP中,序列化主要用于将类对象或数组转换成字节流的形式,以便于存储在磁盘或传输到其他系统。 通过序列化,可以将对象或类转换成一串字符串,然后可…

PPO 跑CartPole-v1

gym-0.26.2 cartPole-v1 参考动手学强化学习书中的代码,并做了一些修改 代码 import gym import torch import torch.nn as nn import torch.nn.functional as F import numpy as np import matplotlib.pyplot as plt from tqdm import tqdmclass PolicyNet(nn.Module):def __…

2024最新PyQt5及其工具(Qt Designer、PyUIC、PyRcc)手把手操作实践指南

2024最新PyQt5及其工具(Qt Designer、PyUIC、PyRcc)手把手操作实践指南 前言 最近做了一些个人项目,内部逻辑还是挺多的,而且也有想要开源的想法,但是总不能直接把源码端给大家直接运行,有一些需求还有萌…

ubuntu设置每天定时关机

ubuntu设置每天定时关机 终端输入命令: sudo crontab -e输入密码,回车。 我这里使用nano作为编辑器,你可以选择vim。 在末尾输入以下命令: 59 23 * * * sudo -u root shutdown now设置:每天23:59分,电脑…

中科院自动化所:基于关系图深度强化学习的机器人多目标包围问题新算法

摘要:中科院自动化所蒲志强教授团队,提出一种基于关系图的深度强化学习方法,应用于多目标避碰包围(MECA)问题,使用NOKOV度量动作捕捉系统获取多机器人位置信息,验证了方法的有效性和适应性。研究成果在2022年ICRA大会发…

HarmonyOS应用开发者初级认证试题库(鸿蒙)

目录 考试链接: 流程: 选择: 判断: 单选: 多选: 考试链接: 开发者能力认证-职业认证-鸿蒙能力认证-华为开发者学堂 (huawei.com)https://developer.huawei.com/consumer/cn/training/dev-…

计算机导论06-人机交互

文章目录 人机交互基础人机交互概述人机交互及其发展人机交互方式人机界面 新型人机交互技术显示屏技术跟踪与识别(技术)脑-机接口 多媒体技术多媒体技术基础多媒体的概念多媒体技术及其特性多媒体技术的应用多媒体技术发展趋势 多媒体应用技术文字&…

高斯Hack算法

背景 刷leetcode时,碰到一题需要求解n个bit中选择m个bit的所有组合集,我只想到了递归求解,没啥问题,但是在官方题解中看到了牛逼的方法(Gospers Hack),故记录一下。 4bit中2个1的情况 0011b0101b0110b1001b1010b1100b…

ASP.NET Core SingleR:初次体验和简单项目搭建

文章目录 前言应用场景SignalR 网站长什么样?第一个ASP.NET core SignalR程序确定SignalR版本新建MVC项目添加unpkg管理器添加客户端添加ChatHub文件添加SignalR服务添加网页运行测试浏览器Websocket调试type1type6Type为其它时 总结 前言 平常的网页通讯都是基于H…

苹果要在iPhone上运行AI大模型?

近两年,人工智能(AI)技术已经成为各大科技公司的重点研究领域,苹果公司自然也不甘落后。最新消息称,苹果甚至打算在iPhone上直接运行AI大模型... 据苹果AI研究人员表示,他们发明了一种创新的闪存利用技术&a…

Intel开发环境Quartus、Eclipse与WSL的安装

PC :win10 64bit 安装顺序:先安装Quartus 21.4,接着Eclipse或者WSL(Windows Subsystem for Linux),Eclipse与WSL的安装不分先后。 为什么要安装Eclipse? 因为Eclipse可以开发基于Nios II的C/…

【上分日记】第380场周赛(数位dp+ KMP + 位运算 + 二分 + 双指针 )

文章目录 前言正文1.3005. 最大频率元素计数2.3007.价值和小于等于 K 的最大数字3.3008. 找出数组中的美丽下标 II 总结尾序 前言 本场周赛,博主也只写出两道题(前两道, hhh菜鸡勿喷),第三道涉及位运算 ,数位dp,第四道涉及KMP。 下…

Mac系统下,保姆级Jenkins自动化部署Android

一、Jenkins自动化部署 1、安装jenkins 官网:macOS Installers for Jenkins LTS 选择macOS brew install jenkins-lts 安装最新: brew install jenkins-lts 启动jenkins服务: brew services start jenkins-lts 重启jenkins服务: brew services restart jenkin…