信号的处理时机(内核态,用户态,如何/为什么相互转换,内核空间,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②调整元件位置③布线④漏线检查…...
从硬件分压到软件查表:手把手教你为你的Arduino/STM32项目添加精准电量显示功能
从硬件分压到软件查表:手把手教你为Arduino/STM32项目添加精准电量显示 在创客项目中,电池供电设备的电量显示一直是个既基础又关键的痛点。想象你正在调试一台自制的便携气象站,突然断电导致数据丢失;或是遥控车在关键时刻电量耗…...
SGP40 VOC传感器实战:基于STM32CubeMX的IIC驱动与空气质量指数换算详解
SGP40 VOC传感器实战:基于STM32CubeMX的IIC驱动与空气质量指数换算详解 在智能家居和工业环境监测领域,VOC(挥发性有机化合物)传感器正成为空气质量评估的核心组件。SGP40作为Sensirion推出的数字气体传感器,以其高精度…...
终极免费Steam创意工坊下载器WorkshopDL:无需Steam客户端,轻松获取游戏模组
终极免费Steam创意工坊下载器WorkshopDL:无需Steam客户端,轻松获取游戏模组 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 还在为无法下载Steam创意工坊…...
Fluent UDF实战:除了速度入口,你的DEFINE_PROFILE宏还能搞定这些边界条件(温度、组分、壁面接触角全解析)
Fluent UDF实战:DEFINE_PROFILE宏在复杂边界条件中的高阶应用 在计算流体动力学(CFD)仿真中,标准界面提供的边界条件设置往往难以满足复杂物理场景的需求。当您需要定义随空间变化的温度场、随时间波动的组分浓度,或是…...
3分钟构建手机号码地理位置查询系统:ASP.NET开源项目完全指南
3分钟构建手机号码地理位置查询系统:ASP.NET开源项目完全指南 【免费下载链接】location-to-phone-number This a project to search a location of a specified phone number, and locate the map to the phone number location. 项目地址: https://gitcode.com/…...
零配置代码质量工具链实战:Biome、ESLint与Oxlint选型指南
1. 项目概述:为什么我们需要“零配置”的代码质量工具链? 如果你和我一样,在过去几年里维护过多个前端或全栈项目,那你一定对配置代码质量工具链这件事深恶痛绝。从选择 ESLint 还是 Biome,到纠结 Prettier 的换行长度…...
如何在手机上3步完成Android内核刷入:Horizon Kernel Flasher终极指南
如何在手机上3步完成Android内核刷入:Horizon Kernel Flasher终极指南 【免费下载链接】HorizonKernelFlasher A simple app that can flash AnyKernel flashable zips on android 项目地址: https://gitcode.com/gh_mirrors/ho/HorizonKernelFlasher 还在为…...
Elasticsearch 9.4 为 Elastic AI 生态系统的下一阶段提供支持:Dell AI Data Platform(与 NVIDIA 合作)
作者:来自 Elastic Sunnie Weber AI 正在快速发展。企业级采用必须有目的地同步推进。 过去一年有一点已经变得非常清晰:企业并不需要更多 AI 炒作,他们需要的是一条通往生产环境的路径 —— 能够将基础设施、数据与智能连接起来,…...
从containers-from-scratch看Docker底层:容器运行时技术揭秘
从containers-from-scratch看Docker底层:容器运行时技术揭秘 【免费下载链接】containers-from-scratch Writing a container in a few lines of Go code, as seen at DockerCon 2017 and on OReilly Safari 项目地址: https://gitcode.com/gh_mirrors/co/contain…...
终极分屏游戏解决方案:一台电脑实现多人游戏狂欢
终极分屏游戏解决方案:一台电脑实现多人游戏狂欢 【免费下载链接】UniversalSplitScreen Split screen multiplayer for any game with multiple keyboards, mice and controllers. 项目地址: https://gitcode.com/gh_mirrors/un/UniversalSplitScreen 还在为…...


