【Linux】进程信号(下)

本文探讨了信号处理中的用户态和内核态概念,重点讲解了CR3寄存器的作用以及在进程从内核态返回用户态时的信号检测和处理过程。涉及系统调用、非法访问检测和自定义信号处理的四个步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.信号处理相关问题

信号处理,不是可以立即处理的,而是在合适的时候
不懂点击: 信号的产生第三点

什么时候是合适的时候?
当进程从内核态切换回用户态的时候,进程会在操作系统的指导下,进行信号的检测与处理

内核态与用户态概念的理解
用户态:执行你写的代码的时候,用户所处的状态
内核态:执行操作系统的代码的时候,进程所处的状态

执行操作系统代码的情况:
1.进程时间片到了,需要切换,就要执行进程切换逻辑
2.系统调用

为什么要有 用户态和内核态

为了解决通过虚拟地址的方式随便去访问操作系统里面的代码和数据
提出用户态和内核态

若为用户态,想要去访问操作系统里面的代码和数据时,CPU就会拒绝执行代码,操作系统就可以识别非法访问,即硬件异常,向目标进程发送信号终止进程

CR3寄存器的使用

如何知道当前运行的用户态还是内核态?
在CPU中存在一种寄存器,被称为CR3寄存器,其中有对应的比特位
若为3,则表征正在运行的进程,执行级别为用户态
若为0,则表征正在运行的进程,执行级别为内核态

谁来更改执行级别?
用户无法直接更改
操作系统提供的所有的系统调用,内部在正式执行调用逻辑的时候,会去修改执行级别

信号处理的整体过程

在这里插入图片描述

进程返回时,需要进行信号检测
当执行完某种任务时,先找到对应的进程,检测对应的信号
若block为0(阻塞信号不执行),pending为1(收到信号),执行处理方法
若为忽略信号,则将pending由1改为0

若为自定义捕捉,当系统跳转过去执行的是自己写的方法
实际上自己写的方法是由用户态实现的,
虽然说可以使用内核态去执行自己实现的方法,但是不可以这样做,因为有可能方法内部做了一些非法操作
在这里插入图片描述
共分为四步
1.代码执行时,因为系统调用或者时间片到了,切换到内核态
2.返回用户态之前,先做信号检测,没有block(阻塞),已经被pending(收到)
由内核态切换到用户态,执行自定义的handler方法
3.执行handler方法后,在由用户态切换到内核态
4. 最后执行特定的系统调用,返回用户态继续执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值