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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LOIS: Looking Out of Instance Semanticsfor Visual Question Answering

目录 一、论文速读 1.1 摘要 1. 2 论文概要总结 二、论文精度 2.1 论文试图解决什么问题? 2.2 论文中提到的解决方案之关键是什么? 2.3 用于定量评估的数据集是什么?代码有没有开源? 2.4 这篇论文到底有什么贡献&#xff…

智能座舱架构与芯片- (15) 测试篇 下

三、持续集成与交付 3.1 自动化编译框架 在智能座舱软件中,分为上层应用软件和底层软件。有些上层应用软件是与指令集平台无关的,例如Java应用程序等,它们对所运行的CPU平台没有依赖性,可以很好的适配当前平台进行执行。而在底层…

基于WEB的停车场管理系统的设计和实现【附源码】

基于WEB的停车场管理系统的设计和实现 摘 要 随着现代社会的快速发展,人民生活水平快速提高,汽车的数量飞速增加,与此同时停车问题也越来越受到人们的关注,为了实现对停车场进行有效的管理,结合一些停车场的模式和现状…

机器学习与计算机视觉 D2

整合为学习笔记!参考阅读了几位大佬的作品,已标注出处~ 机器学习的数学基础 线性与非线性变换 从几何意义上,线性变换表示的是直线的特性,符合两个性质: 变换前后零点不变,变换前后直线还是直线。 线性变换意味着可以…

亚马逊美国站买家号注册流程

注册亚马逊美国站买家号一般用邮箱及手机号注册就可以了,具体操作如下: 1、在浏览器里面输入亚马逊美国站的官网地址。 2、点击注册,输入姓名、邮箱或手机号、密码,然后进行验证邮箱或者手机号。如果是用的邮箱进行注册验证&…

c语言上机作业:给函数增加防御机制

1.题目 2.思路 1.首先,我们可以知道,我们必须先要把z求出来,但这里需要注意的是x,y并不包含了全部的定义域,所以我们必须先判断是否输入的数据满足条件。而这,就是我们所需要突破的函数的防御,…

单链表——OJ题(一)

目录 ​一.前言 二.移除链表元素 三.返回链表中间节点 四.链表中倒数第K个节点 五.合并两个有序链表 六.反转链表 七.链表分割 八.链表的回文结构 九.相交链表 十.环形链表 十一.环形链表(二) ​六.结语 一.前言 本文主要对平时的链表OJ进行…

Vue2+Vue3

文章目录 第 1 章:Vue 核心1、 Vue 简介1.官网2.介绍与描述3. Vue 的特点4. 与其它 JS 框架的关联5. Vue 周边库 2、初始Vue3、模板语法1、Vue模板语法有2大类:2、插值语法和指令语法 4、数据绑定1. 单向数据绑定2. 双向数据绑定 5、el与data的两种写法1.e1有2种写法…

专访特斯拉工程师杨硕:跟着机器人上天入地、探索地外行星丨智源独家

导读 十几岁时,他痴迷《终结者》,曾在百科全书中窥见卡内基梅隆大学机械臂的介绍,从而得知了研究机器人「圣地」的存在。 在CMU,他深耕足式机器人感知定位算法,期待未来涉足太空,走上火星。 在大疆&#xf…

水果音乐制作软件FL Studio21.2中文版新功能介绍

FL Studio21.2中文版,一般又称水果音乐制作软件。 FL Studio 21.2简称FL,全称FruityLoopsStudio,因此国人习惯叫它"水果"。它让你的计算机就像是全功能的录音室,大混音盘,非常先进的制作工具,让…

【C语言】数据结构——栈和队列实例探究

💗个人主页💗 ⭐个人专栏——数据结构学习⭐ 💫点击关注🤩一起学习C语言💯💫 目录 导读:一、 栈1. 栈的概念及结构2. 栈的实现3. 实现代码3.1 定义结构体3.2 初始化栈3.3 销毁栈3.4 入栈3.5 出栈…

java io流中为什么使用缓冲流就能加快文件读写速度

FileInputStream的read方法底层确实是通过调用JDK层面的read方法,并且这个JDK层面的read方法底层是使用C语言编写的,以实现高效的文件读取功能。但是它会涉及多次内核态与操作系统交互。当我们使用FileInputStream的read方法读取文件时,首先会…

微服务 Spring Cloud 8,开源RPC框架如何选型?

目录 一、开源RPC框架有哪些?1、跟语言平台绑定的开源RPC框架2、跨语言平台的开源RPC框架 二、跟语言平台绑定的开源RPC框架 -- Dubbo1、Dubbo的架构主要包含四个角色2、Dubbo的调用框架是如何实现的? 三、如何选择?四、跨语言平台的开源RPC框…

继承【C++】

继承【C】 一.什么是继承?二. 继承的方式与权限三. 继承中的成员3.0 基类和派生类中的重名成员i. 限定符ii. 隐藏 3.1 继承与默认成员函数i. 默认构造ii. 析构函数 3.2 继承与友元函数3.3 继承与静态成员变量 四. 基类和派生类的赋值五. 多继承5.1 菱形继承5.2 菱形…

CFCA证书——基于SM2/3算法的安全信任

在中国金融认证中心(CFCA)发行的证书中,采用了最新的国密SM2/3算法来提供更高的安全保障。这一创新举措进一步增强了我国网络安全能力,并为用户提供了一种更可靠、更安全的选择。 SM2/3算法是中国自主研发的非对称加密算法&#…

瑞格心理咨询系统设置多个管理员的操作方法

使用瑞格心理咨询系统,需要设置多个admin权限的管理员账号来管理,咨询厂家答复只能有1个管理员,个人觉得不可能,于是开始折腾。 解决办法: 在没有数据字典的情况下, 通过遍历数据库,发现用户信…

python趣味编程-5分钟实现一个石头剪刀布游戏(含源码、步骤讲解)

Python 中的石头剪刀布代码是 使用Tkinter和图形用户界面(GUI)设计的。 Python 石头剪刀布游戏是使用Python 编程语言开发的简单桌面应用程序。 项目系统文件包含资源文件和Python脚本。游戏画面流畅,用户控制起来很容易。

大数据:SAS数据分析1,数据步,和过程步

大数据:SAS数据分析 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql,oracle,尤其sql…

2023年DevOps国际峰会暨BizDevOps企业峰会(DOIS北京站)-核心PPT资料下载

一、峰会简介 在数字化转型的大背景下,企业选择实践 DevOps 来提升 IT 效能成为常态,BizDevOps 作为企业自身数字化变革的重要主题之一,需要全行业共同努力促进繁荣和发展。从 DevOps 到 BizDevOps,业务与技术如何融合&#xff1…

JAVAEE---多线程

内核 内核时操作系统的核心 操作系统有内核态和用户态,像我们平时所用到的qq音乐,微信等都属于用户态执行的程序。那么qq音乐播放音乐需要用到扬声器,扬声器的操作就是在内核空间进行操作,用户态不能对其进行操作。 操作系统 …