Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Linux】对信号产生的内核级理解

【Linux】对信号产生的内核级理解

作者头像
用户10923276
发布于 2024-05-06 00:18:11
发布于 2024-05-06 00:18:11
1690
举报

一、键盘产生信号

 键盘产生信号这里就要涉及一个重要的概念了,叫硬件中断。我这里会粗粒度地说一下键盘产生信号,以及信号被上层软件读到的过程,只是说一下我自己的理解。

1.1、硬件中断

硬件中断是计算机中的一种机制,它允许硬件设备在需要时向中央处理器(CPU)发送信号,以请求其关注并处理某些事件或条件。当硬件设备需要CPU的注意时,它会生成一个中断信号,该信号随后被送到CPU的中断控制器。中断控制器负责管理这些信号,并确定哪个中断需要优先处理

一旦CPU接收到中断信号,它会暂停当前正在执行的程序保存当前的状态,如程序计数器、寄存器值等,然后跳转到特定的中断处理程序或中断服务例程来响应这个中断。中断处理程序会执行必要的操作来处理该中断,这可能包括读取硬件的状态、更新数据、发送响应等。处理完中断后,CPU会恢复之前保存的状态,并继续执行原来的程序。

1.2、键盘产生信号并被读取的过程

在CPU上是有各个针脚的,每个针脚有对应的编号。针脚在主板上是可以和键盘进行连接的。当我们在键盘中输入命令或数据时,CPU上对应的针脚会触发高电平,CPU此时就要发生硬件中断,将CPU中正在运行的进程的数据做保存,然后去响应这个中断。CPU有寄存器能记录是几号(我觉得可以理解成数组下标)针脚触发了高电平。然后CPU就可以根据寄存器中的数字在中断向量表中找到对应数组下标中的读取键盘数据的方法。操作系统就去读取键盘上输入的数据。然后操作系统会判定键盘文件中用户输入的数据是命令还是普通的数据,如果是普通数据操作系统就直接将将数据写到键盘文件的缓冲区中,让对应的进程读到,如果是命令,操作系统就会解释成信号发送给对应的进程。

信号发送给进程后进程PCB中其实是用一个32位的整数来保存收到的信号的,也就是说,信号是以位图的形式被保存起来的。前面我们也说过,操作系统中异步发送的信号一共有31个:

 所以用一个32位的整数就可以保存在进程的PCB中。向进程发送信号的本质是写入信号,将保存信号的位图对应的比特位由零置一,一个信号就算被发送给进程了因为发送信号要修改PCB内核数据结构的内容,所以无论产生信号的方式有多少种,最终都是由操作系统将信号写入进程PCB中的

二、出异常产生信号

2.1、除0

在介绍出异常产生信号之前,首先要先介绍一下CPU中的部分常见寄存器,因为出异常产生信号往往都是跟CPU中的寄存器有关的。

通用寄存器

  • EAX, EBX, ECX, EDX: 32位通用寄存器,用于各种算术运算、数据操作以及地址计算。

变址寄存器和指针寄存器

  • ESI, EDI: 32位变址寄存器,常用于数组访问和字符串操作。
  • ESP, EBP: 32位堆栈指针和基指针寄存器,用于管理堆栈和访问堆栈上的数据。

指令指针寄存器

  • EIP: 32位指令指针寄存器,指向CPU下一条要执行的指令的地址。

标志寄存器

  • EFlags: 32位标志寄存器,存储关于上一条指令执行结果的状态信息,如进位、溢出、符号等。

当我们的程序出现除0错误时,CPU中的标志寄存器(EFlags)中的溢出标志位被设置为1,CPU识别到标志寄存器中的溢出标志位被设置为1,就会转而通知操作系统,操作系统就会向正在执行的进程发送SIGFPE(8号信号)直接终止进程。

2.2、野指针

CPU中还有两个寄存器:

  1. CR2寄存器功能:CR2存放发生页错误时的虚拟地址。当CPU尝试访问一个未映射或不可访问的虚拟地址时,会触发页错误,此时CR2会保存导致错误的虚拟地址。
  2. CR3寄存器功能:CR3用于存放最高级页目录地址(物理地址)。在分页机制中,页目录是存储页面表物理地址的数据结构,而CR3则指向这个页目录的基地址。

假设我们要修改空指针里的内容,将保存在eax寄存器中的空指针的地址(虚拟地址)和CR3寄存器中的基地址到MMU中进行映射,发现页表中根本就没有空指针的虚拟地址到物理地址之间的转换关系(或者是其它情况,有转换关系但是页表项的权限为只读权限但你却要做修改),然后将转换失败的虚拟地址存放到CR2寄存器中。CPU转而通知操作系统CR2中存在发生页错误的虚拟地址,操作系统就直接向对应进程发送SIGSEGV(11号信号),终止对应进程。

三、总结

出现异常并发送信号一定是硬件和软件配合的结果。无论产生信号的方式有多少种,最终都是由操作系统将信号写入进程PCB中的

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-05-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Linux之进程信号详解【上】
  用户输入命令,在Shell下运行一个前台进程,用户键盘输入 Ctrl C (2号信号)则会产生一个硬件中断,被OS获取,解释成为信号,发送给目标前台进程,前台进程收到信号之后,引起进程退出。
用户11029129
2024/06/10
1600
Linux之进程信号详解【上】
【Linux】:进程信号(信号概念 & 信号处理 & 信号产生)
🚀 信号是 Linux 系统提供的一种向指定进程发送特定事件的方式,进程会对信号进行识别和处理。
IsLand1314
2024/11/19
3850
【Linux】:进程信号(信号概念 & 信号处理 & 信号产生)
【Linux进程#4】:进程信号(信号概念 & 信号处理 & 信号产生)
✨ 眼里有诗,自向远方 🌏
IsLand1314
2025/06/02
670
【Linux进程#4】:进程信号(信号概念 & 信号处理 & 信号产生)
Linux信号
在生活中也有诸多信号,这些信号通常不是由我们发起的,而是我们接收以后对对应的信号做处理;最常见的莫过于红绿灯了,当红绿灯发出信号时(红灯,绿灯,黄灯);我们会有对应的行为,比如绿灯我们知道当前可以行走,红灯的时候我们需要等一等。对信号产生以后我们知道该做什么,这是因为我们曾经接受了对于这些信号的教育,知道当这些信号产生以后我们需要做什么。
始终学不会
2023/10/17
4330
Linux信号
【Linux】进程信号 --- 信号的产生 保存 捕捉递达
1. 关于信号这个话题我们其实并不陌生,早在以前的时候,我们想要杀死某个后台进程的时候,无法通过ctrl+c热键终止进程时,我们就会通过kill -9的命令来杀死信号。 查看信号也比较简单,通过kill -l命令就可以查看信号的种类,虽然最大的信号编号是64,但实际上所有信号只有62个信号,1-31是普通信号,34-64是实时信号,这篇博文不对实时信号做讨论,只讨论普通信号,感兴趣的老铁可以自己下去研究一下。
举杯邀明月
2023/04/28
1.8K0
【Linux】进程信号 --- 信号的产生 保存 捕捉递达
Linux进程信号(产生、保存、处理)/可重入函数概念/volatile理解/SIGCHLD信号
首先区分一下Linux信号跟进程间通信中的信号量,它们的关系就犹如老婆跟老婆饼一样,没有一毛钱的关系。
二肥是只大懒蓝猫
2023/03/30
1.4K0
Linux进程信号(产生、保存、处理)/可重入函数概念/volatile理解/SIGCHLD信号
【Linux】信号概念与信号产生
生活中类似信号的概念也不少,例如上课铃声响,就是信号的发出,我们听到上课铃声,就是接收到信号,我们快速回到教室上课就是对信号做出处理。那么我们是怎么认识这些信号的呢?那必定是有人教我们,然后我们记住了。而且我们不单单要认识信号,还要识别信号,知道信号的处理方法!
YoungMLet
2024/03/01
3780
【Linux】信号概念与信号产生
【Linux】 进程信号的发生
生活中信号随处可见,我们的生活离不开信号。就比如过红路灯,看见绿灯亮的信号,我们就可以过马路了;听见闹钟响了,我们知道时间到了;看见别人脸色不好,我们就知道他有心事…所以信号在生活中随时可以产生(与我们的动作是异步的):
叫我龙翔
2024/06/17
1360
【Linux】 进程信号的发生
初识Linux · 信号产生
前文已经将进程间通信介绍完了,介绍了相关的的通信方式。在本文介绍的是信号部分,那么一定有人会有问题是:信号和信号量之间的关系是什么呢?答案是,它们之间的区别就是老婆和老婆饼之间一样,没有关系。
_lazy
2024/11/19
1000
初识Linux · 信号产生
Linux进程信号【信号产生】
在 Linux 中,进程具有独立性,进程在运行后可能 “放飞自我”,这是不利于管理的,于是需要一种约定俗成的方式来控制进程的运行,这就是 进程信号,本文将会从什么是进程信号开篇,讲述各种进程信号的产生方式及作用
北 海
2023/07/01
6570
Linux进程信号【信号产生】
【linux学习指南】线程概念与控制
思考⼀下,如果在没有虚拟内存和分⻚机制的情况下,每⼀个⽤⼾程序在物理内存上所对应的空间必 须是连续的,如下图:
学习起来吧
2025/02/04
890
【linux学习指南】线程概念与控制
Linux虚拟内存管理
Linux的内存管理分为 虚拟内存管理 和 物理内存管理,本文主要介绍 虚拟内存管理 的原理和实现。在介绍 虚拟内存管理 前,首先介绍一下 x86 CPU 内存寻址的具体过程。
用户7686797
2020/08/25
4.2K0
Linux虚拟内存管理
Linux内核分析与应用2-内存寻址
本系列是对 陈莉君 老师 Linux 内核分析与应用[1] 的学习与记录。讲的非常之好,推荐观看
fliter
2023/09/23
2680
Linux内核分析与应用2-内存寻址
Linux:线程的概念
         以前我们想要一个执行流,我们需要fork一个子进程,然后子进程需要拷贝 take_struct结构体+进程地址空间+页表+文件描述符表…… 
小陈在拼命
2024/12/31
1150
Linux:线程的概念
【linux学习指南】Linux进程信号产生(三) 硬件异常&&除零出错?&&野指针异常?&&core文件
硬件异常被硬件以某种⽅式被硬件检测到并通知内核,然后内核向当前进程发送适当的信号。例如当前进程执⾏了除以0的指令,CPU的运算单元会产⽣异常,内核将这个异常解释为SIGFPE信号发送给进程。再⽐如当前进程访问了⾮法内存地址,MMU会产⽣异常,内核将这个异常解释为SIGSEGV信号发送给进程。
学习起来吧
2024/12/01
1680
【linux学习指南】Linux进程信号产生(三) 硬件异常&&除零出错?&&野指针异常?&&core文件
Linux 0.12 内核管理存储器
每一个进程都有一张段表LDT。整个系统有一张GDT表。且整个系统仅仅有一个总页表。
全栈程序员站长
2022/07/05
1.1K0
Linux 0.12 内核管理存储器
【Linux】从零开始认识多线程 --- 线程概念与底层实现
在学习多线程之前,我们先来了解一些背景知识,我们需要这些背景知识来辅助我们理解多线程!
叫我龙翔
2024/07/16
3960
【Linux】从零开始认识多线程 --- 线程概念与底层实现
硬核操作系统讲解
现代计算机之父冯诺伊曼最先提出程序存储的思想,并成功将其运用在计算机的设计之中,该思想约定了用二进制进行计算和存储,还定义计算机基本结构为 5 个部分,分别是中央处理器(CPU)、内存、输入设备、输出设备、总线。
C语言与CPP编程
2021/03/25
1.1K0
硬核操作系统讲解
Linux:信号的预备和产生
        引入: 比如当前快递小哥需要通知你下来取快递(产生信号),然后通过电话或短信告知了你(发送信号),但是当前你正在打游戏,所以你并不会马上去处理,但是你会记得这件事(信号的保存),当你忙完之后,你接着就去处理快递了(信号的处理),而一般会有3种处理方法:1、幸福地打开快递(默认动作) 2、选择将快递送给好朋友(自定义动作)3、忽略他,然后再打一把游戏(忽略)。
小陈在拼命
2024/12/10
1310
Linux:信号的预备和产生
深入理解Linux内核页表映射分页机制原理
操作系统用于处理内存访问异常的入口操作系统的核心任务是对系统资源的管理,而重中之重的是对CPU和内存的管理。为了使进程摆脱系统内存的制约,用户进程运行在虚拟内存之上,每个用户进程都拥有完整的虚拟地址空间,互不干涉。而实现虚拟内存的关键就在于建立虚拟地址(Virtual Address,VA)与物理地址(Physical Address,PA)之间的关系,因为无论如何数据终究要存储到物理内存中才能被记录下来。
嵌入式Linux内核
2022/10/25
3.9K0
深入理解Linux内核页表映射分页机制原理
推荐阅读
相关推荐
Linux之进程信号详解【上】
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档