当前位置: 首页 > news >正文

信号的处理时机(内核态,用户态,如何/为什么相互转换,内核空间,cpu寄存器),信号的处理流程详细介绍+抽象图解

目录

信号的处理时机

引入

思考 -- 什么时候才能算合适的时候呢?

用户态转为内核态

引入

内核地址空间 

引入

思考 -- 进程为什么能切换成内核态呢?

虚拟地址空间

注意点

原理 (总结一下)

为什么+如何进入内核态 

引入

介绍

底层原理(int 80) 

cpu的寄存器

用户级

内核级

如何知道进入了内核态

硬件上

软件上

用户态和内核态的来回切换 

为什么

如何切换

信号的处理流程 

介绍

详细图解

描述 

默认操作

忽略操作

自定义操作

抽象图解 

交叉点处

方向

横线


信号的处理时机

引入

  • 之前我们说过,信号被os发送到进程,实际上是修改了pending信号集
  • 然后进程会在合适的时候处理
  • 那究竟什么时候才能算合适的时候呢?

思考 -- 什么时候才能算合适的时候呢?

  • 处理信号必然不是我们做的,而是os,因为信号是内核数据
  • 那么处理信号时,就得处于内核的范畴,不然怎么访问os的数据
  • 也就是处于内核态
  • 那么肯定也会存在用户态,和内核态对应,也就存在内核态和用户态的切换
  • 那么内核态就拥有三种阶段 -- 刚进入内核态,在内核态执行任务时,准备转为用户态时

那么是哪个阶段开始处理信号的呢?

  • 一般是在执行完任务后,内核态准备转为用户态时,会进行信号的处理
  • (因为任务肯定第一位嘛,信号的处理又不急于这一时)

用户态转为内核态

引入

  • 虽然我们是这样说的 -- 由内核态转为用户态时,就会处理信号
  • 但是这个操作我们看不到,怎么知道到底有没有转换呢?
  • 说到底,究竟是怎么转换的呢?未免有点太抽象了

内核地址空间 

引入
  • 其实并不抽象,所有看起来复杂的行为都是将[底层一些简单的操作]封装而成的
  • 比如,可以首先来思考这个问题 -- 进程为什么能切换成内核态呢?
思考 -- 进程为什么能切换成内核态呢?
  • 内核态,也就是可以使用os内部的数据/接口

那为什么一个进程,它可以有这样的行为呢?

  • 肯定是它此时的权限修改成了os的权限

如何使用os内部的数据/接口呢?

  • 要使用这些,必然是和使用普通数据/接口一样,访问实际的内存
  • 毕竟他们本质没有区别,只是权限不一样
  • 而访问内存必须通过虚拟地址空间+页表+MMU实现
  • 我们无法直接操作物理内存!!
  • 既然可以访问内核数据,那内核肯定也有自己的进程空间+页表

那到底有没有呢?

  • 有的!
虚拟地址空间
  • 之前学习的地址空间中本身就有1G的空间,是存放内核空间的: 
  • 也就是说,我们切换为内核态,依赖的是 -- 进程地址空间有内核空间
注意点

既然有内核空间,自然也有内核级的页表用来映射

但是要注意!!!

每个进程的用户空间,对应的是独立的内存块

难道每个进程拥有的内核空间,它对应的内存也是独立的吗?

  • 不会的!
  • 内核资源是所有进程共用的,不会让每个进程去瓜分一部分
  • [进程的独立性]要求用户空间对应的内存都是独立的,但每个进程可以使用相同的os资源
  • 所以,内核级的页表只需要一份(因为对应的物理内存是同一块),它可以被所有进程看到
  • 所以,无论进程如何切换,我们看到的都是同一份os资源
原理 (总结一下)
  • 进程可以切换为内核态的原因就在于,每个进程中都有内核地址空间
  • 只要切换访问位置和访问权限,自然可以通过内核地址空间访问内核数据噜

为什么+如何进入内核态 

引入

知道了进程是可以切换的

那么究竟为什么要切换成内核态,底层又是如何切换的呢?

介绍
  • 当我们需要访问内核数据时,就需要进入内核态

  • 我们大多都是通过系统调用接口,来使用内核数据的
  • 所以,调用系统调用,自动就可以进入内核态(因为之前在使用的时候,并没有什么特殊行为)

  • 并且,我们不用把系统调用想的那么神秘,他也只是一个函数而已(只不过非常接近底层)
  • 系统调用和使用库函数本质上没有区别,都是在进程自己的地址空间内进行跳转

 

底层原理(int 80) 
  • 在每个系统调用函数开始前,都需要先切换成内核态
  • 它通过int(interrupt 的缩写) 80 这个汇编指令,来切换成内核态
  • 汇编的底层是通过cpu的寄存器实现的
cpu的寄存器

实际上存在两套寄存器,用户级的和内核级的

用户级
  • 实际上,我们将[平时写的简单代码]转换为汇编指令,里面用到的eax等等,就是用户级的寄存器
内核级
  • 存放与权限/控制相关数据的寄存器,我们看不见
  • 内核级寄存器里面有一个CR3
  • 它用来表示当前cpu的访问权限 -- 内核/用户
  • 所以实际上int 80汇编指令,就是通过修改CR3寄存器的数据,来进入内核态

 

如何知道进入了内核态

硬件上

通过CR3寄存器的数据得知的(寄存器是硬件的一部分)

软件上
  • 其实我们已经在上面介绍了,只要检测执行的位置是否指向内核空间即可
  • 指向内核空间,就说明此时正在执行系统级别的代码,此时也就处于内核态

 

用户态和内核态的来回切换 

为什么

总不能从用户态切到内核态后,我们就不切回来了吧

我们肯定还有很多没有执行的用户级代码呢

如何切换

  • 其实原理我们已经都介绍过了
  • 只要我们可以拿到进程执行相关的数据,我们也就可以按照上面的原理 -- 跳转地址空间,修改寄存器数据,来切换状态
  • (当然这里只是一个大概,实际上非常复杂的)
  • 刚好cpu的寄存器里面,就存放着很多进程执行相关的数据结构的指针(也就是进程的上下文)

信号的处理流程 

知道了原理后,我们就可以明白,os究竟是如何处理信号的

介绍

详细图解

描述 

  • 首先我们要先陷入内核态(可能是系统调用,也可能是异常/中断导致的)
  • 然后在内核态下,os完成一系列的任务
  • 在即将返回用户态,继续向下执行代码前,我们正好处于内核态下,有能力,可以顺手处理收到的信号
  • 所以,os开始处理信号!

  • os先去检查信号在内核中的两种信号集 -- pending,block
  • 如果该信号被阻塞,os可以直接返回到用户态
  • 如果满足条件,我们拿到对应信号的处理函数后
  • 这里就要分情况讨论了:
默认操作
  • 如果需要终止进程,os可以直接进行终止进程的调度
  • 如果该进程中有需要刷新数据/dump到外设,os在内核态下可以直接操作,操作完再退出进程
  • 如果该进程不退出,也是一样的:
  • eg:有个信号用来暂停进程,也可以在内核态下直接实现,直接修改进程状态,然后调度下一个进程
忽略操作
  • 如果是忽略,os只需要将pending信号集由1改为0,即可返回到用户态,执行下面的代码噜
自定义操作
  • 如果是自定义的操作,就有点麻烦了
  • 因为默认和忽略都可以在内核态下直接完成,因为os的权限是最大的,什么资源都可以拿到
  • 但是在执行自定义函数时,需要转换到用户态才行

为什么要转换到用户态呢?内核态下不能执行吗?

  • 内核态当然可以执行进程的代码,它可以拿到所有的资源
  • 但是,万一该函数中有违规操作(用户态下不可以执行的操作)
  • 却没有被内核态下的进程识别到,就可能会导致不好的后果
  • 为了避免这些情况,普通代码还是让用户态进程执行的好

在用户态下执行完成后,也就该返回内核态

  • 不仅是因为,处理完信号后,需要修改pending位图
  • 也在于,进程需要返回到陷入内核态的执行位置,然后继续向下执行
  • 而这些操作都需要访问os资源

抽象图解 

信号处理过程 -- 从信号需要从用户态陷入到内核态 -> 处理完信号,返回原先的执行位置 抽象出来,得到该图:

交叉点处

就是os开始处理信号的时候

方向

图中的箭头,就是os执行流的变化方向

横线
  • 如果用一条横线贯穿该图,那么横线上方就是用户态,下方就是内核态
  • (可以看到信号处理的时候是在内核态中)
  • 横线与图的四个交点就可以代表,进程的状态变化次数
  • 交点所在的方向,就代表了状态的切换方向

相关文章:

信号的处理时机(内核态,用户态,如何/为什么相互转换,内核空间,cpu寄存器),信号的处理流程详细介绍+抽象图解

目录 信号的处理时机 引入 思考 -- 什么时候才能算合适的时候呢? 用户态转为内核态 引入 内核地址空间 引入 思考 -- 进程为什么能切换成内核态呢? 虚拟地址空间 注意点 原理 (总结一下) 为什么如何进入内核态 引入 介绍 底层原理(int 80) cpu的寄存器 用…...

【JavaEE】Spring的创建和使用(保姆级手把手图解)

一、创建一个Spring项目 1.1 创建一个Maven项目 1.2 添加 Spring 框架支持 在pom.xml中添加 <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.3.RELEASE&…...

MyBatis:关联查询

MyBatis 前言关联查询附懒加载对象为集合时的关联查询 前言 在 MyBatis&#xff1a;配置文件 文章中&#xff0c;最后介绍了可以使用 select 标签的 resultMap 属性实现关联查询&#xff0c;下面简单示例 关联查询 首先&#xff0c;先创建 association_role 和 association_…...

第十二章 控制值的转换

文章目录 第十二章 控制值的转换介绍处理特殊 XML 字符文字和 SOAP 编码格式的转义形式 示例防止泄漏的另一种方法 第十二章 控制值的转换 类和属性参数 ESCAPE CONTENT XMLTIMEZONE DISPLAYLIST VALUELIST XMLDEFAULTVALUE XMLLISTPARAMETER XMLSTREAMMODE 介绍 支…...

SQL并集、交集、差集使用

一、概述 SQL语句实现数据的并集&#xff08;union&#xff09;、交集&#xff08;intersect&#xff09;、差集&#xff08;except&#xff09;。 二、案例 1、stu表 idname1张三2李四3王二 2、并集 union union 运算&#xff1a;表示取并集&#xff0c;例如&#xff1a…...

【双指针】盛水最多的容器

盛水最多的容器 文章目录 盛水最多的容器题目描述算法原理思路一思路二 代码实现Java代码实现C代码实现 题目描述 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与…...

win11,引导项管理

1&#xff0c;打开cmd,输入msconfig 2,进入引导选项卡 3&#xff0c;删除不需要的引导项...

YoloV8改进策略:WaveletPool解决小目标的混叠问题,提高小目标的检测精度

文章目录 摘要论文:《抗混叠在微小目标检测中的重要性》1、简介2、相关研究2.1、微小物体检测2.2. 抗锯齿过滤器3、方法3.1. Wavelet Pooling3.2 一致顺序的Wavelet Pooling的WaveCNet3.3、Bottom-Heavy Backbone4、实验4.1、预训练数据集4.2、微小目标检测数据集4.3、抗混叠方…...

JavaScript中的假值对象是什么?

JavaScript是一种非常灵活且强大的编程语言&#xff0c;但有时候它的一些特性可能会让人感到困惑。其中一个常见的问题就是假值对象。在本文中&#xff0c;我们将探讨什么是假值对象&#xff0c;并通过代码示例来解释这个概念。 什么是假值对象&#xff1f; 在JavaScript中&am…...

求二叉树的最大密度(可运行)

最大密度&#xff1a;二叉树节点数值的最大值 如果没有输出结果&#xff0c;一定是建树错误&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 我设置输入的是字符型数据&#xff0c;比较的ASCII值。 输入&#xff1a;FBE###CE### 输…...

V100 GPU服务器安装CUDNN教程

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

RT-Thread Hoist_Motor PID

本节介绍的是一个举升电机&#xff0c;顾名思义&#xff0c;通过转轴控制物体升降&#xff0c;为双通道磁性译码器&#xff0c;利用电调进行操控&#xff0c;具体驱动类似于大学期间最大众的SG180舵机&#xff0c;在一定的频率下&#xff0c;通过调制脉宽进行控制。 设备介绍…...

css 实现文字流光效果

经过调研发现大多滑块验证码中&#xff0c;有一些文字流光效果&#xff0c;因此在这里简单实现一下。 实现主要利用background 渐变背景以及backgorund-clip:text实现。具体代码如下 css部分 .slide {width: 300px;height: 40px;border: 1px solid #ccc;border-radius: 8px;…...

3D格式转换工具

这里记录下自己之前做3D模型格式转换&#xff0c;包括做CAD模型格式转换辅助的一些开源仓库和工具 &#xff08;一&#xff09;转换成gltf工具 gltf作为3D界的jpg标准&#xff0c;如今已经有很多引擎对其进行了支持&#xff0c;这里单独把它列出来 1. obj转glft工具 git仓库…...

seismicunix基础-声波波动方程推导

seismicunix基础-声波波动方程推导 接触波动方程的研究人员都绕不开这个公式&#xff0c;这是在一维状态下波动方程 但是对于这个方程是怎样来的很少有人能说清楚&#xff0c;其中涉及到牛顿第二运动定律&#xff0c;物体的加速度与受到的力有关。 假设一维弦是大量紧密连接的质…...

2024电脑录屏软件排行第一Camtasia喀秋莎

真的要被录屏软件给搞疯了&#xff0c;本来公司说要给新人做个培训视频&#xff0c;想着把视频录屏一下&#xff0c;然后简单的剪辑一下就可以了。可谁知道录屏软件坑这么多&#xff0c;弄来弄去头都秃了&#xff0c;不过在头秃了几天之后&#xff0c;终于让我发现了一个值得“…...

MQTT通信协议使用说明

目录 1 MQTT连接属性1.1 服务器URL(Broker Address)1.2 客户端标识(clientID)1.3 用户名称 & 密码(User Name & Password)1.4 连接超时(Connection Timerout)1.5 心跳间隔 (KeepAlivelnterval)1.6 清除会话(cleanSession) 2 主题&消息2.1 主题2.1.1 订阅主题(SUBSC…...

mysql底层是如何存放数据的

总览 首先总的来说&#xff0c;分为四个层级&#xff0c;行页区段。行就是数据库里的一行数据。 但一次从磁盘读进内存的数据量是一页&#xff08;页是读写的单位&#xff0c;默认16KB一页&#xff09;&#xff0c;页分很多种类&#xff0c;例如数据页、溢出页、undo日志页。 …...

【代码随想录】刷题笔记Day33

前言 Day33虽说是一个月&#xff0c;但是从第一篇开始实际上已经过了8个月了&#xff0c;得抓紧啊 46. 全排列 - 力扣&#xff08;LeetCode&#xff09; 前面组合就强调过差别了&#xff0c;这道题是排序&#xff0c;因此每次要从头到尾扫&#xff0c;结合used数组 class So…...

AD从原理图到PCB超详细教程

AD超详细教程 前言一、建立一个工程模板二、原理图1.设计原理图。2.使用AD自带库和网上开源原理图库3.画原理图库4.编译原理图 三、PCB1.确定元器件尺寸大小2.绘制PCB Library①使用元器件向导绘制元件库②原理图与PCB的映射 3.绘制PCB①更新PCB②调整元件位置③布线④漏线检查…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...