信号的处理时机(内核态,用户态,如何/为什么相互转换,内核空间,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执行流的变化方向

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

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

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

相关文章

nodejs express vue uniapp新闻发布系统源码

开发技术: node.js,mysql5.7,vscode,HBuilder nodejs express vue uniapp 功能介绍: 用户端: 登录注册 首页显示搜索新闻,新闻分类,新闻列表 点击新闻进入新闻详情&#xff0…

计算机网络——网络可靠性及网络出口配置

1. 前言: 学习目标: 1.了解链路聚合的作用 2. 了解ACL的工作原理 3. 了解NAT的工作原理和配置 2. 网络可靠性方案 网络可靠性是指网络在面对各种异常情况或故障时,能够维持正常运行和提供服务的能力。这包括防止网络中断、减小数据丢失的可能…

spring boot零配置

spring boot是如何选择tomcat还是Jett作为底层服务器的呢? springboot通过ServletWebServerApplicationContext的onRefresh()方法,会创建web服务 protected void onRefresh() {super.onRefresh();try {// 创建web服务createWebServer();}catch (Throwab…

PyTorch 之 Dataset 类入门学习

PyTorch 之 Dataset 类入门学习 Dataset 类简介 PyTorch 中的 Dataset 类是一个抽象类,用来表示数据集。通过继承 Dataset 类可以进行自定义数据集的格式、大小和其它属性,供后续使用; 可以看到官方封装好的数据集也是直接或间接的继承自 …

6.Gin 路由详解 - GET POST 请求以及参数获取示例

6.Gin 路由详解 - GET POST 请求以及参数获取示例 GET POST 请求以及参数获取示例 Get 请求:获取 Quary 参数 // 获取query参数示例:GET /user?uid20&namejack&page1 r.GET("/user", func(c *gin.Context) {// 获取参数// Query获取参…

[机缘参悟-119] :一个IT人的反思:反者道之动;弱者,道之用 VS 恒者恒强,弱者恒弱的马太效应

目录 前言: 一、道家的核心思想 二、恒者恒强,弱者恒弱的马太效应 三、马太效应与道家思想的统一 3.1 大多数的理解 3.2 个人的理解 四、矛盾的对立统一 前言: 马太效应和强弱互转的道家思想,都反应了自然规律和社会规律&…

SVN 修改版本库地址url路径

一、win11用户 1. win11系统右链菜单比较优秀,如果菜单中选择“TortoiseSVN”找不到“重新定位”,如下图所示,则需要添加右键菜单: 2.添加右键菜单:选择“TortoiseSVN”,点击设置,如下图所示&a…

Vue 项目实战——如何在页面中展示 PDF 文件以及 PDFObject 插件实战

文章目录 📋前言🎯使用 HTML 标签🧩 embed 标签🧩 object标签🧩 iframe标签🧩完整代码 🎯使用 PDFObject 插件🧩为什么使用 PDFObject 插件(AI翻译)&#x1f…

【微服务】SaaS云智慧工地管理平台源码

智慧工地系统是一种利用人工智能和物联网技术来监测和管理建筑工地的系统。它可以通过感知设备、数据处理和分析、智能控制等技术手段,实现对工地施工、设备状态、人员安全等方面的实时监控和管理。 一、智慧工地让工程施工智能化 1、内容全面,多维度数…

华为云IoT与OpenHarmony深度协同,加速设备上鸿即上云【云驻共创】

本次专题论坛探讨了华为云IoT与Open Harmony的深度协同、边缘屏蔽硬件差异、实现智慧隧道全方位智能化管理,以及华为云与Open Harmony生态的合作。同时也介绍了华为云物联网卡平台、HTTP2协议以及华为物联网在交通领域的应用。 一.华为云IoT与Open Harm…

数学几百年重大错误:将两异函数误为同一函数

黄小宁 因各实数都可是数轴上点的坐标所以数集A可形象化为数轴上的点集A,从而使x∈R变换为实数yxδ的几何意义可是:一维空间“管道”g内R轴上的质点x∈R(x是点的坐标)运动到新的位置yxδ还在管道g内(设各点只作位置改变而没别的改变即变位前…

Vue学习

1。 搭框架 依赖等 创建vue项目 vue create 项目名称 vue create [options] <app-name>使用vite npm init vitelatest <app-name>-- --template vue 目录调整1 apiutilsvenderimages、styles 配置文件 jsconfig.json 配置之后路径可以直接使用 / {"comp…

mysql 查询

-- 多表查询select * from tb_dept,tb_emp; 内来链接 -- 内连接 -- A 查询员工的姓名 &#xff0c; 及所属的部门名称 &#xff08;隐式内连接实现&#xff09;select tb_emp.name,tb_dept.name from tb_emp,tb_dept where tb_emp.idtb_emp.id;-- 推荐使用select a.name,b.n…

【精选】OpenCV多视角摄像头融合的目标检测系统:全面部署指南&源代码

1.研究背景与意义 随着计算机视觉和图像处理技术的快速发展&#xff0c;人们对于多摄像头拼接行人检测系统的需求日益增加。这种系统可以利用多个摄像头的视角&#xff0c;实时监测和跟踪行人的活动&#xff0c;为公共安全、交通管理、视频监控等领域提供重要的支持和帮助。 …

TS类型全解

使用TypeScript开发的程序更安全&#xff0c;常见的错误都能检查出来。TS能让程序员事半功倍。而原因在于TS的“类型安全”&#xff08;借助类型避免程序做无效的事情&#xff09;。 图 运行程序的过程 但是TS不会直接编译成字节码&#xff0c;而是编译成JavaScript代码。TS编…

【C+进阶之路】第六篇:C++11

文章目录 一、【C】C11&#xff08;1&#xff09;二、【C】C11&#xff08;2&#xff09; 一、【C】C11&#xff08;1&#xff09; 【C】C11&#xff08;1&#xff09; 二、【C】C11&#xff08;2&#xff09; 【C】C11&#xff08;2&#xff09; &#x1f339;&#x1f33…

3.计算机网络

1.重点概念 MSL&#xff08;Maximum segment lifetime&#xff09;&#xff1a;TCP 报⽂最⼤⽣存时间。它是任何 TCP 报⽂在⽹络上存在的 最⻓时间&#xff0c;超过这个时间报⽂将被丢弃。实际应⽤中常⽤的设置是 30 秒&#xff0c;1 分钟和 2 分钟。 TTL&#xff08;Time to …

LeetCode算法心得——打家劫舍(记忆化搜索)

大家好&#xff0c;我是晴天学长&#xff0c;准备开始深入动态规划啦&#xff0c;先从记忆化搜索开始&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .打家劫舍 你是一个专业的小偷&#xff0c;计划偷窃…

RK3568平台开发系列讲解(Linux系统篇)kernel config 配置解析

🚀返回专栏总目录 文章目录 一、图形化界面的操作二、Kconfig 语法简介三、.config 配置文件介绍四、deconfig 配置文件沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 Linux 内核可以通过输入“make menuconfig”来打开图形化配置界面,menuconfig 是一套图形化的配…

Javaweb之Axios的详细解析

1.3 Axios 上述原生的Ajax请求的代码编写起来还是比较繁琐的&#xff0c;所以接下来我们学习一门更加简单的发送Ajax请求的技术Axios 。Axios是对原生的AJAX进行封装&#xff0c;简化书写。Axios官网是&#xff1a;https://www.axios-http.cn 1.3.1 Axios的基本使用 Axios的…