Linux:用户态和内核态的区别?什么时候会从用户态切换到内核态?

2023-11-08

1、用户态和内核态的区别?

明白这两个概念之前,我们得知道用户空间内核空间

用户空间:指的就是用户可以操作和访问的空间,这个空间通常存放我们用户自己写的数据等。

内核空间:是系统内核来操作的一块空间,这块空间里面存放系统内核的函数、接口等。

在用户空间下执行,我们把此时运行得程序的这种状态成为用户态,而当这段程序执行在内核的空间执行时,这种状态称为内核态。

当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核状态。此时处理器处于特权级最高的(0级)内核代码。当进程处于内核态时,执行的内核代码会使用当前的内核栈。每个进程都有自己的内核栈。

当进程在执行用户自己的代码时,则称其处于用户态。即此时处理器在特权级最低的用户代码中运行。当正在执行用户程序而突然中断时,此时用户程序也可以象征性地处于进程的内核态。因为中断处理程序将使用当前进程的内核态。

延伸阅读:内核态与用户态是操作系统的两种运行级别,跟intel cpu没有必然联系,intel cpu提供Ring0-Ring3三种级别运行模式,Ring0级别最高,Ring3级别最低。Linux使用了Ring3级别运行用户态。Ring0作为内核态,没有使用Ring1和Ring2.Ring3不能访问Ring0的地址空间,包括代码和数量。Linux进程的4GB空间,3G-4G这1G部分大家是共享的,是内核态的地址空间,这里存放在整个内核代码和所有的内核模块,以及内核所维护的数据。用户运行一程序,该程序所创建的进程开始是运行在用户态的,如果要执行文件操作,网络数据发送等操作,必须通过write,send等系统调用,这些系统会调用内核中的代码来完成操作,这时,必须切换到Ring0,然后进入1G的内核地址空间去执行这些代码完成操作,完成后,切换Ring3,回到用户态。这样,用户态的程序就不能随意操作内核地址空间,具有一定的安全保护作用。

2、用户态和内核态的转换

用户态切换到内核态的3种方式:a.系统调用 b.异常  c.外围设备的中断

a.系统调用

这是用户进程主动要求切换到内核态的一种方式,用户进程通过系统调用申请操作系统提供的服务程序完成工作。

而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,该中断是程序人员自己开发出的一种正常的异常,这个异常具体就是调用int $0x80的汇编指令,这条汇编指令将产生向量为0x80的编程异常。(软中断)

b.异常
当CPU在执行运行在用户态的程序时,发现了某些事件不可知的异常,这是会触发由当前运行进程切换到处理此
异常的内核相关程序中,也就到了内核态,比如缺页异常(硬中断)。

c.外围设备的中断
当外围设备完成用户请求的操作之后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条将要执行的指令
转而去执行中断信号的处理程序,如果先执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了有
用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。

以系统调用函数open为例:简单图示

(1)用户态:

① 触发0x80中断

②保存当前的运行位置,状态,数据

③将系统调用号保存到eax寄存器中

触发0x80中断 由系统调用函数触发的中断 。实际上在内核中,  触发0x80中断之后才会有上面的两步 。

(2)每一个中断号在内核中都有一个中断处理程序,中断处理程序是被内核调用来响应中断的

          通过该中断处理程序陷入内核

(3)在内核中:①有系统调用表,用寄存器中的系统调用号对应一个系统调用函数

                          ②通过函数得到执行该系统调用函数会得到一个返回值fd

                          ③将fd的值用eax寄存器带出  

在函数调用时int fd=open();open调用完之后才会将eax中的得到的返回值赋给fd,相当于是两个步骤

只有0x80中断才是系统调用中断,类似的还有缺页中断它们所对应的中断号是不同的

注释:在c语言中如何返回返回值:如果返回值小于四个字节通过eax寄存器带出  若在4-8之间用eax和ecx带出  大于8通过生成临时对象或者变量带出


 

 

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

Linux:用户态和内核态的区别?什么时候会从用户态切换到内核态? 的相关文章

  • ftrace:仅打印trace_printk()的输出

    是否可以只转储trace printk 输出于trace文件 我的意思是过滤掉函数跟踪器 或任何其他跟踪器 中的所有函数 一般来说 您可以在选项目录中关闭选项 sys kernel debug tracing options Use ls显
  • CoAP数据包的大小是多少?

    我是这项技术的新手 有人可以帮助我了解一些疑问吗 Q 1 CoAP数据包的大小是多少 我知道有 4 字节固定标头 但是包括标头 选项和负载在内的最大大小限制是多少 Q 2 有像MQTT那样的Keep Alive的概念吗 它在UDP上工作 它
  • 删除 Git 存储库,但保留所有文件

    在我使用 Linux 的过程中的某个时刻 我决定将我的主目录中的所有内容都放入源代码管理中是个好主意 我不是在问这是否是一个好主意 我是在问如何撤销它 删除存储库的原因是我最近安装了 Oh My Zsh 而且我非常喜欢它 问题是我的主目录有
  • 如何在基于 Linux 的系统上的 C 程序中使用 mqueue?

    如何在基于 Linux 的系统上的 C 程序中使用 mqueue 消息队列 我正在寻找一些好的代码示例 可以展示如何以正确且正确的方式完成此操作 也许是一个操作指南 下面是一个服务器的简单示例 该服务器接收来自客户端的消息 直到收到告诉其停
  • Linux:如何设置进程的时区?

    我需要设置在 Linux 机器上启动的各个进程的时区 我尝试设置TZ变量 在本地上下文中 但它不起作用 有没有一种方法可以使用与系统日期不同的系统日期从命令行运行应用程序 这可能听起来很愚蠢 但我需要一种sandbox系统日期将被更改的地方
  • 我如何知道 C 程序的可执行文件是在前台还是后台运行?

    在我的 C 程序中 我想知道我的可执行文件是否像这样在前台运行 a out 或者像这样 a out 如果你是前台工作 getpgrp tcgetpgrp STDOUT FILENO or STDIN FILENO or STDERR FIL
  • 使用 Grep 查找两个短语之间的文本块(包括短语)

    是否可以使用 grep 来高亮所有以以下内容开头的文本 mutablePath CGPathCreateMutable 并以以下内容结尾 CGPathAddPath skinMutablePath NULL mutablePath 这两个短
  • 快速像素绘图库

    我的应用程序以每像素的方式生成 动画 因此我需要有效地绘制它们 我尝试过不同的策略 库 但结果并不令人满意 尤其是在更高分辨率的情况下 这是我尝试过的 SDL 好的 但是慢 OpenGL 像素操作效率低下 xlib 更好 但仍然太慢 svg
  • Urwid:使光标不可见

    我正在使用 urwid 它是一个用于在 ncurses 中设计终端用户界面的 Python 框架 但有一件事我在 urwid 中无法做到 而这在 Curses 中很容易做到 使光标不可见 现在 选择按钮时光标是可见的 而且看起来很丑 有办法
  • 监控子进程的内存使用情况

    我有一个 Linux 守护进程 它分叉几个子进程并监视它们是否崩溃 根据需要重新启动 如果父进程可以监视子进程的内存使用情况 以检测内存泄漏并在超出一定大小时重新启动子进程 那就太好了 我怎样才能做到这一点 您应该能够从 proc PID
  • 捕获实时流量时如何开启纳秒精度?

    如何告诉 libpcap v1 6 2 将纳秒值存储在struct pcap pkthdr ts tv usec 而不是微秒值 捕获实时数据包时 Note This question is similar to How to enable
  • 在 unix 中编译 dhrystone 时出错

    我是使用基准测试和 makefile 的新手 我已经从下面的链接下载了 Dhrystone 基准测试 我正在尝试编译它 但我遇到了奇怪的错误 我尝试解决它 但没有成功 有人可以帮助我运行 dhrystone 基准测试吗 以下是我尝试编译的两
  • 无法在 Perl 中找到 DBI.pm 模块

    我使用的是 CentOS 并且已经安装了 Perl 5 20 并且默认情况下存在 Perl 5 10 我正在使用 Perl 5 20 版本来执行 Perl 代码 我尝试使用 DBI 模块并收到此错误 root localhost perl
  • 警告:请求的映像平台 (linux/amd64) 与检测到的主机平台 (linux/arm64/v8) 不匹配

    警告 请求的映像平台 linux amd64 与检测到的主机平台 linux arm64 v8 不匹配 并且未请求特定平台 docker 来自守护程序的错误响应 无法选择具有功能的设备驱动程序 gpu 我在 mac 上尝试运行此命令时遇到此
  • 当用户按下打印时运行脚本,并且在脚本结束之前不开始假脱机(linux,cups)

    我需要做的是结合用户按下打印来执行 python 程序 脚本 并且在该程序退出之前不要让打印作业假脱机 原因是打印驱动程序不是开源的 我需要更改用户设置 在本例中是部门 ID 和密码 通常是每个用户 但因为这是一个信息亭 具有相同帐户的不同
  • vagrant ssh -c 并在连接关闭后保持后台进程运行

    我正在编写一个脚本来启动和后台流浪机器内的进程 似乎每次脚本结束和 ssh 会话结束时 后台进程也会结束 这是我正在运行的命令 vagrant ssh c cd vagrant src nohup python hello py gt he
  • 如何从 C 程序中获取 NIC 详细信息?

    我想要获取连接到我的计算机的所有 NIC 的以下详细信息 1 接口名称 例如eth0 2 接口编号 如Windows http answers yahoo com question index qid 20080517041705AAOmJ
  • 为什么我的 Dockerfile CMD 不起作用?

    所以在我的 Dockerfile 的末尾我有这样的内容 WORKDIR home CMD django admin startproject whattt CMD bin bash 当我创建映像然后运行容器时 一切都按预期运行 没有错误 D
  • Linux中使用管道进行进程间通信

    我已经编写了在 linux 中写入数字以进行管道传输的代码 如下所示 但显示错误 任何人都可以帮助我解决这个问题 基本上该程序的问题陈述如下 一个程序将打开一个管道 向管道写入一个数字 其他程序将打开同一管道 读取数字并打印它们 关闭两个管
  • 使用 inotify 的正确方法是什么?

    我想使用inotifyLinux 上的机制 我希望我的应用程序知道文件何时aaa被改变了 您能给我提供一个如何做到这一点的示例吗 文档 来自监视文件系统活动 inotify https developer ibm com tutorials

随机推荐

  • 成电信软程算I 雨课堂答案

    电子科技大学 信息与软件工程学院 程序设计与算法基础I 雨课堂答案 选择题因为限制 直接展示正确答案的文本选项 蓝色加粗为解析 第一章 程序设计引论 计算机系统由硬件和软件构成 它们共同工作来运行应用程序 程序员必须要关心底层硬件的细节 程
  • js实现二分查找算法

    js实现二分查找算法 二分查找 是一种搜索某个值的索引的算法 基本条件 有序的数组 思路 1 将数组折半 分成左右两个数组 2 判断要查找的数和中间位置数值的大小 来判断要查找的数实在哪一半 3 之后继续折半查找 直至找到这个数 方法 二分
  • nginx反向代理与负载均衡详解(四)

    用分片提升缓存效率 stream是双向通讯流 GRPC反向代理 前提http2 SLB服务器负载平衡 实时的视频或者音频时适合UDP协议
  • P1305 素数环

    include
  • springboot logback-spring.xml

    logback spring xml
  • Elasticsearch 结合dynamic-synonym实现同义词热加载

    Elasticsearch 本身支持的同义词配置如果需要修改同义词配置需重启es 灵活性不高 本章详细讲解通过结合dynamic synonym实现同义词热加载 通过sql定时获取数据库同义词配置 es版本 5 6 13 同义词插件 ela
  • 【Linux】linux进程间通信netlink socket(用户与内核通信) 一

    目录 1 基础概念 2 netlink socket 基本原理 3 用户空间常用socket APIs 3 1 socket 3 2 bind 3 3 sendmsg 3 4 send 3 5 recvmsg 3 6 close 4 net
  • chatGPT中国入口-ChatGPT评论文章-ChatGPT怎么用

    国内怎么玩chatGPT 如果您在国内使用ChatGPT 主要的问题可能是连接OpenAI服务器的速度和稳定性 由于OpenAI位于美国 可能受到中国的网络限制和防火墙的影响 造成访问速度比较慢或不稳定 为了解决这个问题 您可以采取以下方法
  • 为什么要分库分表(个人理解,希望能与大家共勉)

    前言 其实分库分表是牵扯到高并发的 因为分库分表无非来说就是为了支撑高并发 数据量大的问题 尤其进入稍微大一点的公司或者互联网公司 这些都是必须掌握 场景 假如一个新兴公司 刚开始时 注册用户就40W 每天活跃1W 每天单表数据量1000
  • Shark(鲨鱼记账系统)--附源码

    Shark 鲨鱼记账系统 附源码 程序员就要多撸代码 以便在脑海中形成深刻记忆 昨晚试着撸了一个小小的记账系统 内容很简单 主要负责简单的记账 不过没用到持久层 后续会做持久层的版本 先看个简单的把 package com shayu no
  • 十大Python可视化工具,太强了

    今天介绍Python当中十大可视化工具 每一个都独具特色 惊艳一方 Matplotlib Matplotlib 是 Python 的一个绘图库 可以绘制出高质量的折线图 散点图 柱状图 条形图等等 它也是许多其他可视化库的基础 import
  • 【复变函数与积分变换】【第一章 复数与复变函数】

    2021 1 3 文章目录 2021 1 3 第一章 复数与复变函数 1 1 复数 一 复数及其运算 定义 复数的基本概念 相等 四则运算 二 共轭复数 定义 性质 1 2 复数的几种表示 复平面 一 复数的模与辐角 主辐角 相互转换关系
  • Hydra(九头蛇)密码破解工具的详细使用教程

    简介 Hydra是 款开源的暴 密码pojie 具 持多种协议密码的破译 可以对多种服务的账号和密码进行爆破 包括 数据库 SSH FTP 等服务 在 Kali Linux 中自带 Hydra 有了这个工具就可以很方便的对密码进行破解 其简
  • C++——随机数引擎和分布

    随机数引擎是一个函数对象类 他们定义了一个调用运算符 不接受任何参数并且返回一个unsigned整数 我们可以适用其生成随机数 为什么称其为随机数引擎 因为我们通常不会直接适用引擎生成随机数 而是将其传入一个分布类对象中对齐进行分布生成 所
  • 【100天精通python】Day31:使用python操作数据库_数据库编程接口,连接对象和游标对象,数据库连接配置

    目录 专栏导读 一 数据库编程接口 1 Python标准库接口 2 MySQL Connector Python接口 3 Psycopg2接口 用于连接PostgreSQL数据库 4 SQLAlchemy接口 二 连接对象和游标对象 1 连
  • 【hbase】hbase学习总结

    HBase是一种构建在HDFS之上的分布式 面向列的存储系统 在需要实时读写 随机访问超大规模数据集时 可以使用HBase 特点 大 面向列 面向列表 簇 的存储和权限控制 列 簇 独立检索 稀疏 对于为空 NULL 的列 并不占用存储空间
  • Python--Working with date and times(待整理…strftime不清楚)

    1 modules working with dates and times The calendar module The time module The datetime module focus on datetime first d
  • Python基础数据类型之字符串(二)

    Python基础数据类型之字符串 二 一 字符串的常规操作 二 字符串的大小写转换 1 首字母大写 2 每个单词首字母大写 3 大写转化为小写 4 所有字母变成大写字母 二 验证码忽略大小写 三 字符串空白的去除方法 1 strip 使用
  • IOC容器(详细讲解)

    文章目录 IOC容器 一 IOC底层原理 二 IOC接口 三 Bean管理 IOC操作Bean管理 基于xml 1 基于XML配置文件创建对象 2 基于XML方式注入属性 3 第一种注入方式 set方式注入 4 第二种注入方式 有参构造函数
  • Linux:用户态和内核态的区别?什么时候会从用户态切换到内核态?

    1 用户态和内核态的区别 明白这两个概念之前 我们得知道用户空间和内核空间 用户空间 指的就是用户可以操作和访问的空间 这个空间通常存放我们用户自己写的数据等 内核空间 是系统内核来操作的一块空间 这块空间里面存放系统内核的函数 接口等 在