信号的处理时机(内核态,用户态,如何/为什么相互转换,内核空间,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:配置文件 文章中,最后介绍了可以使用 select 标签的 resultMap 属性实现关联查询,下面简单示例 关联查询 首先,先创建 association_role 和 association_…...
第十二章 控制值的转换
文章目录 第十二章 控制值的转换介绍处理特殊 XML 字符文字和 SOAP 编码格式的转义形式 示例防止泄漏的另一种方法 第十二章 控制值的转换 类和属性参数 ESCAPE CONTENT XMLTIMEZONE DISPLAYLIST VALUELIST XMLDEFAULTVALUE XMLLISTPARAMETER XMLSTREAMMODE 介绍 支…...
SQL并集、交集、差集使用
一、概述 SQL语句实现数据的并集(union)、交集(intersect)、差集(except)。 二、案例 1、stu表 idname1张三2李四3王二 2、并集 union union 运算:表示取并集,例如:…...
【双指针】盛水最多的容器
盛水最多的容器 文章目录 盛水最多的容器题目描述算法原理思路一思路二 代码实现Java代码实现C代码实现 题目描述 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与…...
win11,引导项管理
1,打开cmd,输入msconfig 2,进入引导选项卡 3,删除不需要的引导项...
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是一种非常灵活且强大的编程语言,但有时候它的一些特性可能会让人感到困惑。其中一个常见的问题就是假值对象。在本文中,我们将探讨什么是假值对象,并通过代码示例来解释这个概念。 什么是假值对象? 在JavaScript中&am…...
求二叉树的最大密度(可运行)
最大密度:二叉树节点数值的最大值 如果没有输出结果,一定是建树错误!!!!!!! 我设置输入的是字符型数据,比较的ASCII值。 输入:FBE###CE### 输…...
V100 GPU服务器安装CUDNN教程
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...
RT-Thread Hoist_Motor PID
本节介绍的是一个举升电机,顾名思义,通过转轴控制物体升降,为双通道磁性译码器,利用电调进行操控,具体驱动类似于大学期间最大众的SG180舵机,在一定的频率下,通过调制脉宽进行控制。 设备介绍…...
css 实现文字流光效果
经过调研发现大多滑块验证码中,有一些文字流光效果,因此在这里简单实现一下。 实现主要利用background 渐变背景以及backgorund-clip:text实现。具体代码如下 css部分 .slide {width: 300px;height: 40px;border: 1px solid #ccc;border-radius: 8px;…...
3D格式转换工具
这里记录下自己之前做3D模型格式转换,包括做CAD模型格式转换辅助的一些开源仓库和工具 (一)转换成gltf工具 gltf作为3D界的jpg标准,如今已经有很多引擎对其进行了支持,这里单独把它列出来 1. obj转glft工具 git仓库…...
seismicunix基础-声波波动方程推导
seismicunix基础-声波波动方程推导 接触波动方程的研究人员都绕不开这个公式,这是在一维状态下波动方程 但是对于这个方程是怎样来的很少有人能说清楚,其中涉及到牛顿第二运动定律,物体的加速度与受到的力有关。 假设一维弦是大量紧密连接的质…...
2024电脑录屏软件排行第一Camtasia喀秋莎
真的要被录屏软件给搞疯了,本来公司说要给新人做个培训视频,想着把视频录屏一下,然后简单的剪辑一下就可以了。可谁知道录屏软件坑这么多,弄来弄去头都秃了,不过在头秃了几天之后,终于让我发现了一个值得“…...
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底层是如何存放数据的
总览 首先总的来说,分为四个层级,行页区段。行就是数据库里的一行数据。 但一次从磁盘读进内存的数据量是一页(页是读写的单位,默认16KB一页),页分很多种类,例如数据页、溢出页、undo日志页。 …...
【代码随想录】刷题笔记Day33
前言 Day33虽说是一个月,但是从第一篇开始实际上已经过了8个月了,得抓紧啊 46. 全排列 - 力扣(LeetCode) 前面组合就强调过差别了,这道题是排序,因此每次要从头到尾扫,结合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"]任务定义(Task Definition&…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
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,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&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…...


