『 Linux 』用户态与内核态的转换机制及信号检测时机

文章目录

    • 用户态与内核态
      • 进程地址空间
      • 操作系统的本质
    • 信号的处理时机


用户态与内核态

请添加图片描述

进程在执行代码的过程中代码必定涉及用户代码,库函数代码及操作系统内核代码;

以简单的printf()函数为例,该函数必定为先执行用户的代码即知道需要调用printf()函数,再执行库(如libc)中的代码printf()最后该函数必定封装了操作系统的系统调用接口(如write())一系列的操作;

这意味着进程必须要由用户态转换为内核态,再由内核态转换回用户态才有对应的"权限"执行对应的接口;

当执行系统调用接口时操作系统将对进程进行用户切换,即用户态转换为内核态或是内核态转换为用户态;

  • 用户态(User Mode)

    • 访问限制

      在用户态运行的进程只能访问它自己的用户空间代码和数据;这是为了保护系统安全,防止用户程序意外或故意地修改系统关键数据;

    • 受限访问内核资源

      用户态进程无法直接访问操作系统内核代码和数据,也不能执行特权指令(如直接操作硬件或更改系统设置);

    • 系统调用

      当用户态进程需要请求内核服务时(例如文件操作、网络通信等),它通过系统调用(如int 0x80在x86 Linux系统上)请求操作系统来执行这些操作;系统调用是用户态与内核态通信的一种受控机制;

  • 内核态(Kernel Mode)

    • 完全访问权限

      在内核态运行的代码有权访问系统的所有资源,包括所有内存、硬件设备和CPU指令集;这包括内核空间的代码和数据,也包括可能的用户空间数据(用于完成用户的请求);

    • 保护机制

      尽管内核态有更高的权限,操作系统通过严格的权限管理和进程隔离机制,确保用户进程只能通过合法的系统调用接口访问内核资源;


进程地址空间

请添加图片描述

每个进程都存在一个对应的内核数据结构task_struct,该数据结构保存了进程的各种属性,其中存在一个进程地址空间作为虚拟地址;

虚拟地址通过页表映射至物理地址;

其中进程地址空间中0-3GB为用户空间,3-4GB为内核空间;

对于用户而言所使用的进程地址空间为用户空间,通过页表与MMU内存管理单元访问对应位置的物理内存;

本质上页表存在两种页表分别为用户级页表与内核级页表;

  • 用户级页表

    管理进程的用户地址空间,主要用于映射用户代码和数据所需的物理内存;

    由于进程具有独立性,用户级页表的数量为当前进程的数量,即一个进程有一个独立的用户级页表;

  • 内核级页表

    管理内核空间地址,映射内核代码和数据所需的物理内存;

    内核地址空间在所有进程中是共享的,因此内核级页表在所有进程中是相同的,意味着系统中只有一个内核级页表;

本质上用户级页表与内核级页表的结构是统一的,只是在逻辑上进行分开;

用户空间通过用户级页表访问物理内存,内核空间通过内核级页表访问操作系统内核代码和数据,保证了进程的隔离和内核的安全性;

  • 进程视角

    在进程视角中本质上就是调用自己的地址空间;

  • 操作系统视角

    操作系统视角为任何一个时期都将有进程执行;

用户级页表与内存级页表本质上属于一种数据结构的实例化,其可以属于一种数据具有自己的地址;

  • CR3寄存器

    CPU中存在一个寄存器为CR3,该寄存器存储着页表的地址;

    当进程需要执行自己用户的代码数据时,即访问用户级地址空间时,CR3寄存器指向用户级页表的地址;

  • ecs寄存器

    CPU中还存在一个ecs寄存器,该寄存器中存在两个以比特位形式表现的标志位;

    其四种选项分别为00,01,10,11;

    其中11表示为用户态,00表示为内核态;

    其标定了一个用户态与内核态的权限,当其标志位变为00时表示其陷入内核;

    该寄存器也提供了一个接口以便能够修改对应的标志位;

    故当使用汇编语句int 80时即标志位变为00从而陷入内核;


操作系统的本质

请添加图片描述

操作系统可以理解为一个软件,一个进程;

其本质上是一个基于硬件中断的死循环,其中发生中断的可以是计算机组成中的各个硬件;

这个循环不断地等待和处理中断信号,中断可以来自各种硬件设备或软件事件;

这些中断不限于I/O中断,系统调用中断,异常中断等;

当不存在I/O中断,系统调用中断,异常中断等中断时,必须通过一种措施使操作系统持续的调度不同的进程以维持自身的系统维护和进程调度;

该措施为 时钟中断 ,其中断是由计算机组成中的 时钟芯片 产生的;

  • 时钟芯片

    时钟芯片是一种专门用于生成时钟信号的硬件装置;

    其提供了一个稳定的时钟源以保持系统时间,计时以及产生时间中断;

    在进行时间中断时其将以非常短的时间向操作系统发送一个硬件中断异常以维持系统的维护和进程调度;

  • 时钟中断

    时钟中断是由时钟芯片产生的一种中断信号;

    其以周期性的发生,用于告诉操作系统当前时间的变化或需要执行定时任务;

    时钟中断通常用于多任务操作系统中以实现进程调度,系统计时等功能;

操作系统的基本工作机制可以分为主循环,等待中断,中断处理;

  • 主循环

    操作系统在启动时进入一个主循环,这个主循环负责监控和管理系统资源,响应外部和内部事件;

  • 等待中断

    在主循环中,操作系统通常处于等待中断的状态;

    这个中断状态可以来自硬件(时钟中断,I/O中断等);

  • 中断处理

    当一个中断发生时,操作系统将暂停正在进行的工作,跳转到响应的中断处理程序;

    这些中断处理程序执行特定的任务,例如更新系统时间,处理I/O请求,调度新进程等;

时钟中断在操作系统中十分重要,其负责定时中断,进程调度,系统计时,定时任务等;

  • 定时中断

    时钟芯片周期性地产生时钟中断(例如每秒100次);

    每次时钟中断发生时操作系统会执行中断处理程序以保证就算不发生其他中断操作系统也能够进行进程调度,系统维护等操作;

  • 进程调度

    时钟中断触发进程调度器的运行;

    调度器决定是否需要切换当前运行的进程以确保所有进程都能够得到CPU时间,这就是所谓的"时间片轮转调度";

  • 系统计时

    操作系统使用时钟中断来保持系统时间的准确性;

    每次中断发生时操作系统会更新其内部计时器;

  • 定时任务

    操作系统可以设置定时器,在指定的时间后产生中断以执行某些定时任务;

    这些任务包括系统维护,资源回收,性能监控等;

	/* 简化的操作系统模型 */
while (true) {wait_for_interrupt();  // 等待中断handle_interrupt();    // 处理中断
}

实际上在操作系统中以for (;;) { pause(); }的形式存在;

  • pause()的作用

    • 等待中断

      pause()指令使CPU进入低功耗状态等待中断发生;

    • 处理中断

      当中断发生时,CPU会跳转到响应的中断处理程序执行特定任务;

    • 恢复主循环

      中断处理完成后操作系统会返回主循环并等待下一个中断;


信号的处理时机

请添加图片描述

当进程接收到一个信号时并不会立即处理这个信号,而是等待合适的时候对该信号进行处理;

信号的处理是由进程完成的,这意味着此时进程必须进入内核态才能对信号进行处理;

信号的检测与处理的时机为进程由内核态返回到用户态的过程;

进程在内核态时意味着其必定在进行重要的工作,只有当重要的工作完成时即从内核态返回用户态的时机才有机会对信号进行检测;

该图为以基于用户自定义动作处理信号为例;

处理这个信号,而是等待合适的时候对该信号进行处理;

信号的处理是由进程完成的,这意味着此时进程必须进入内核态才能对信号进行处理;

信号的检测与处理的时机为进程由内核态返回到用户态的过程;

进程在内核态时意味着其必定在进行重要的工作,只有当重要的工作完成时即从内核态返回用户态的时机才有机会对信号进行检测;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java线程同步与通信:wait(), notify(), notifyAll(), sleep()

Java线程同步与通信:wait(), notify(), notifyAll(), sleep() 1. wait()2. notify()3. notifyAll()4. sleep()4、总结 💖The Begin💖点点关注&…

一文带你读懂TCP

文章目录 1 TCP协议1.1 TCP 基础1.1.1 TCP 特性1.2.2 TCP连接数 1.2 TCP 头1.2.1 TCP 头格式1.2.2 MTU,MSS,分片传输 1.3 TCP 连接三路握手1.4 TCP 断开四次挥手1.5 SYN攻击和防范1.6 重传机制1.6.1 超时重传1.6.2 快速重传1.6.3 SACK 1.7 滑动窗口1.8 流…

Linux基础复习(二)

前言 本文介绍了一下Linux命令行基本操作及网络配置 一、 命令行提示含义 [当前用户主机名 工作目录]$ 若当前用户是root,则最后一个字符为# 否则,最后一个字符为$ 二、常用Linux命令及其解释 修改主机名 一般在创建一台主机后会使用hostname相关命…

在生信分析中大家需要特别注意的事情​

在生信分析中大家需要特别注意的事情 标准的软件使用和数据分析流程 1. 先看我的b站教学视频 2. 先从我的百度网盘把演示数据集下载下来,先把要运行的模块的演示数据集先运行一遍 3. 前两步都做完了,演示数据集也运行成功了,并且知道了软件…

ajax请求成功但不执行success-function回调函数

目录 一、问题分析 二、处理问题 一、问题分析 在测试员工管理系统的登录和注册代码时,登录一切正常,就是注册成功后没有跳转页面,后面发现是success-function回调函数没有正常执行。原因主要是前端和后端交流的数据格式不一致,…

【C++BFS算法 二分查找】2812. 找出最安全路径

本文涉及知识点 CBFS算法 C二分查找 LeetCode2812. 找出最安全路径 给你一个下标从 0 开始、大小为 n x n 的二维矩阵 grid ,其中 (r, c) 表示: 如果 grid[r][c] 1 ,则表示一个存在小偷的单元格 如果 grid[r][c] 0 ,则表示一…

Windows配置AirSim过程(学习过程)

一、概述 因为需要在虚幻引擎当中使用AirSim,在Windows系统上进行操作,根据官方网站的操作过程,进行了配置,这里作为自己配置过程的记录。 二、具体过程 (一)系统版本 操作系统是Windows11,Ai…

昇思MindSpore 应用学习-RNN实现情感分类-CSDN

RNN实现情感分类 AI代码解析 概述 情感分类是自然语言处理中的经典任务,是典型的分类问题。本节使用MindSpore实现一个基于RNN网络的情感分类模型,实现如下的效果: 输入: This film is terrible 正确标签: Negative 预测标签: Negative输入…

HALCON如何创建本地函数

HALCON中有本地函数(.hdev)、外部函数(HDevelop函数文件.hdvp)和库函数(.hdpl) 本地函数(.hdev):创建后仅在当前程序文件中使用; 外部函数(HDevelop函数文件.hdvp):创建后可以在其他程序文件中复用,默认保存在…/ procedures/下…

vue实现滚动条下滑时隐藏导航栏,上滑时显示导航栏

效果展示 思路 监听滚动事件,记录上次的滚动距离,与最新滚动距离做对比,如果为正,说明滚动距离距顶值scrollTop变大,用户正在向下滚动页面,此时隐藏,反之则反,隐藏就是top值给他负导…

【C++语言】C++11新特性(1)

一、统一的列表初始化 1.1 {} 初始化 在C98中,标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。比如: struct Point {int _x;int _y; };int main() {int array1[] { 1, 2, 3, 4, 5 };int array2[5] { 0 };Point p { 1, 2 };ret…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 项目排期安排(200分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线…

C++使用MD5对字符串加密,获取文件的MD5值(附完整源码)

目录 1、为什么要使用MD5? 2、开源MD5类 3、获取字符串MD5值的MD5String接口封装 4、获取文件MD5值的MD5File接口封装 5、最后 C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/125529931C…

OSPF动态路由协议实验

首先地址划分 一个骨干网段分成三个,r1,r2,r5三个环回网段 ,总共要四个网段 192.168.1.0/24 192.168.1.0/26---骨干网段 192.168.1.0/28 192.168.1.16/28 192.168.1.32/28 备用 192.168.1.64/28 192.168.1.64/26---r1环回 192.1…

【Vulnhub系列】Vulnhub_DC-1靶场渗透(原创)

【Vulnhub系列靶场】Vulnhub_DC-1靶场渗透 原文转载已经过授权 原文链接:Lusen的小窝 - 学无止尽,不进则退 (lusensec.github.io) 一、环境准备 1、在百度网盘中下载DC-1靶场。DC-1靶场受virtual box 的影响,在VM中直接打开是扫描不到IP 的…

【Vulnhub系列】Vulnhub_SecureCode1靶场渗透(原创)

【Vulnhub系列靶场】Vulnhub_SecureCode1靶场渗透 原文转载已经过授权 原文链接:Lusen的小窝 - 学无止尽,不进则退 (lusensec.github.io) 一、环境配置 1、从百度网盘下载对应靶机的.ova镜像 2、在VM中选择【打开】该.ova 3、选择存储路径&#xff0…

Mathtype7.8中文版远程安装并嵌入word(包成功)

Mathtype7.8是一款专业的数学公式编辑工具,能够帮助用户在各种文档中插入复杂的数学公式和符号。数学公式编辑器工具可以轻松输入各种复杂的公式和符号,与Office文档完美结合,显示效果超好,比Office自带的公式编辑器要强大很多。M…

obsidian 首页制作 辅助笔记总结回顾

记笔记最重要的是回顾与总结,有这么一款插件可以让我们自己搭建一个美观的首页,它包括热力图、文稿统计、文稿回顾等等功能,你是否愿意尝试呢? 今天就介绍一款插件,能快速制作笔记首页,辅助总结、回顾。 …

sql注入详解【从数据库架构分析】

简介 SQL注入是一种常见的Web应用程序安全漏洞,它允许攻击者在Web应用程序中插入恶意SQL语句,从而操纵数据库执行非授权的操作。这种攻击利用了应用程序在处理用户输入时的不足,特别是当应用程序直接将用户输入作为SQL语句的一部分使用&…