『 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,一经查实,立即删除!

相关文章

这六种灯千万别买了!看你踩了几个坑

雅静说啥样的灯买了才发现是个坑      给你说6个,安上就会后悔的      1,这些变色的灯就别要了,说的是三色温灯,买回家才发现      它的白光,暖光,中性光,我们习惯只用一种,开,关,开,关,开5次      才能调到自己想要的档位,不想患上关节炎就别买这种了     …

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 流…

微信小程序根据动态权限展示tabbar

微信小程序自定义 TabBar 后根据权限动态展示tabbar 在微信小程序开发中,自定义 TabBar 可以让应用更具灵活性和个性化。特别是在用户根据不同权限展示不同的 TabBar 内容时,正确的实现方法能够提升用户体验。本篇文章将分享如何使用事件总线实现权限变动时动态更新自定义 T…

软件环境安装-通过Docker安装rabbitmq

软件环境安装-通过Docker安装rabbitmq 一、拉取镜像二、启动三、安装延迟队列插件 一、拉取镜像 docker pull rabbitmq:3.9.0-management二、启动 docker run -d --namerabbitmq --restartalways -p 5672:5672 -p 15672:15672 rabbitmq:3.9.0-management 三、安装延迟队列插…

Linux基础复习(二)

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

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

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

服务器构建私有npm库(Docker + Verdaccio)

npm官网有时候因为网络原因包推不上去,那就简单构建个私有库 私有库不会被共享,且配置不需要太高1h2G就行 1.需要安装Docker,这个跳过了 2.生成配置文件 mkdir /home/verdaccio cd /home/verdaccio mkdir conf && mkdir storage &am…

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…

go编译执行文件

1、如果进行单个文件编译go build xxx.go 2、批文件编译 不实际编译它,只输出它的编译过程: 1 go build -n 简单的编译过程分析: 上面的过程确认了两个事情: Runtime会永远随着用户代码一起编译在windows平台上编译出来了一…

昇思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值给他负导…

【Qt和OpenCV 概述】

Qt和OpenCV(Open Source Computer Vision Library)都是广泛用于计算机视觉应用的强大工具,而将它们结合使用,可以在Qt应用程序中实现复杂的视觉处理功能。Qt是跨平台的GUI库,而OpenCV则是专为计算机视觉任务设计的库。下面是Qt和OpenCV结合使用的一些概述: 为什么结合使…

为什么需要第三方支付

1.第三方支付平台提供一系列的应用接口程序,将多种银行卡支付方式整合到一个界面上,负责交易结算中与银行的对接,使网上购物更加快捷、便利。第三方支付整合了后端各大银行的不同支付接口,对外提供统一的接入平台,方便…

【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% 以上,支持题目在线…

日常学习--调用第三方接口和提供第三方接口时的注意事项--20240728

1、调用第三方接口的注意事项 接口测试与验证: 对第三方接口进行充分的测试,包括功能测试、性能测试和安全测试,确保接口的稳定性和安全性。 验证接口的可用性,包括接口地址、请求方式、请求参数、响应格式等是否正确。 参数校…