[Linux]内核如何对信号进行捕捉

要理解Linux中内核如何对信号进行捕捉,我们需要很多前置知识的理解:

  • 内核态和用户态的区别
  • CPU指令集权限
  • 内核态和用户态之间的切换

由于文章的侧重点不同,上面这些知识我会在这篇文章尽量详细提及,更详细内容还得请大家查看这篇文章:
内核态与用户态详解


一、内核态和用户态的区别

内核态和用户态本质上是对CPU状态的描述。内核态的权限最大,能够执行一切“特权代码”。而用户态则受限制,必须切换到内核态才能执行“特权代码”。

这就意味着内核态能够调度全部硬件资源,本质上就是对权限进行保护。由于硬件资源非常复杂,稍有不慎就会出现很大的问题,所以不是人人都有权限去调度。这样做就是为了安全性和稳定性。


二、CPU指令集权限

具体来说每一条汇编指令都对应一条CPU指令,非常多的CPU指令组成了CPU指令集。指令集则通过CPU实现软件对硬件的调度
同时CPU指令有分级权限。CPU指令能够操作硬件资源,硬件资源是非常复杂的,很容易出问题。所以操作系统直接屏蔽掉用户对CPU指令集的操作

CPU指令分级总共有四级,从高到低依次为:

  • ring0
  • ring1
  • ring2
  • ring3

Linux系统仅采用ring0和ring3这2个权限。用户态的程序工作在3,内核态的程序处于0:

  • ring0权限最高,可以使用所有CPU指令集,有对硬件的所有操作权限
  • ring3权限最低,仅能使用常规CPU指令集,不能使用操作硬件资源的CPU指令集。代码没有对硬件的直接控制权限,也不能直接访问地址的内存,程序是通过调用系统接口(System Call APIs)来达到访问硬件和内存

三、内核态和用户态之间的切换

1.如何理解进程切换?

  • 在当前进程的进程地址空间中的内核空间,找到操作系统的代码和数据。
  • 执行操作系统的代码,将当前进程的代码和数据剥离下来,并换上另一个进程的代码和数据。

注意: 当你访问用户空间时你必须处于用户态,当你访问内核空间时你必须处于内核态

从用户态切换为内核态通常有如下几种情况:

  • 需要进行系统调用时。
  • 当前进程的时间片到了,导致进程切换。
  • 产生异常、中断、陷阱等。

与之相对应,从内核态切换为用户态有如下几种情况:

  • 系统调用返回时。
  • 进程切换完毕。
  • 异常、中断、陷阱等处理完毕。

其中,由用户态切换为内核态我们称之为陷入内核。每当我们需要陷入内核的时,本质上是因为我们需要执行操作系统的代码,比如系统调用函数是由操作系统实现的,我们要进行系统调用就必须先由用户态切换为内核态

2.系统调用

用户态要主动切换到内核态要有统一的入口,它们就是内核提供的系统调用接口,下面是Linux整体架构图:
在这里插入图片描述
我们可以看出来通过系统调用将Linux整个体系分为内核态和用户态,而内核提供了一组通用的访问接口,它们使应用程序能访问到内核的资源,如CPU、内存、I/O,这些接口就叫系统调用


四、内核如何实现信号的捕捉?

当我们在执行主控制流程的时候,可能因为某些情况而陷入内核,当内核处理完毕准备返回用户态时,就需要进行信号pending的检查。(此时仍处于内核态,有权力查看当前进程的pending位图)

在查看pending位图时,如果发现有未决信号,并且该信号没有被阻塞,那么此时就需要该信号进行处理。

1.待处理信号是默认或忽略

如果待处理信号的处理动作是默认或者忽略,则执行该信号的处理动作后清除对应的pending标志位,如果没有新的信号要递达,就直接返回用户态,从主控制流程中上次被中断的地方继续向下执行即可。
在这里插入图片描述

2.待处理信号是自定义捕捉的

但如果待处理信号是自定义捕捉的,即该信号的处理动作是由用户提供的,那么处理该信号时就需要先返回用户态执行对应的自定义处理动作,执行完后再通过特殊的系统调用sigreturn再次陷入内核并清除对应的pending标志位,如果没有新的信号要递达,就直接返回用户态,继续执行主控制流程的代码。
在这里插入图片描述
注意: sighandler和main函数使用不同的堆栈空间,它们之间不存在调用和被调用的关系,是两个独立的控制流程。

3.巧记

当待处理信号是自定义捕捉时的情况比较复杂,可以借助下图进行记忆:
在这里插入图片描述
其中,该图形与直线有4个交点就代表在这期间有4次状态切换,而箭头的方向就代表着此次状态切换的方向,图形中间的圆点就代表着检查pending表


当识别到信号的处理动作是自定义时,能直接在内核态执行用户空间的代码吗?不能!!!

  • 理论上来说是可以的,因为内核态是一种权限非常高的状态,但是绝对不能这样设计。
  • 如果允许在内核态直接执行用户空间的代码,那么用户就可以在代码中设计一些非法操作,比如清空数据库等,虽然在用户态时没有足够的权限做到清空数据库,但是如果是在内核态时执行了这种非法代码,那么数据库就真的被清空了,因为内核态是有足够权限清空数据库的。
  • 也就是说,不能让操作系统直接去执行用户的代码,因为操作系统无法保证用户的代码是合法代码,即操作系统不信任任何用户。

特别鸣谢:
Linux进程信号
内核态与用户态详解

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

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

相关文章

设计模式-观察者模式、命令模式

观察者模式Observer(观察者)—对象行为型模式定义:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象,在它的状态发生变化时,会通知所有的观察者.先将 Observer A B C 注册到 Observable ,那么当 Observable 状态…

【Unity笔记01】基于单例模式的简单UI框架

单例模式的UIManagerusing System.Collections; using System.Collections.Generic; using UnityEngine;public class UIManager {private static UIManager _instance;public Dictionary<string, string> pathDict;public Dictionary<string, GameObject> prefab…

深入解析 OPC UA:工业自动化与物联网的关键技术

在当今快速发展的工业自动化和物联网&#xff08;IoT&#xff09;领域&#xff0c;数据的无缝交换和集成变得至关重要。OPC UA&#xff08;Open Platform Communications Unified Architecture&#xff09;作为一种开放的、跨平台的工业通信协议&#xff0c;正在成为这一领域的…

MCP 协议的未来发展趋势与学习路径

MCP 协议的未来发展趋势 6.1 MCP 技术演进与更新 MCP 协议正在快速发展&#xff0c;不断引入新的功能和改进。根据 2025 年 3 月 26 日发布的协议规范&#xff0c;MCP 的最新版本已经引入了多项重要更新&#xff1a; 1.HTTP Transport 正式转正&#xff1a;引入 Streamable …

硬件嵌入式学习路线大总结(一):C语言与linux。内功心法——从入门到精通,彻底打通你的任督二脉!

嵌入式工程师学习路线大总结&#xff08;一&#xff09; 引言&#xff1a;C语言——嵌入式领域的“屠龙宝刀”&#xff01; 兄弟们&#xff0c;如果你想在嵌入式领域闯出一片天地&#xff0c;C语言就是你手里那把最锋利的“屠龙宝刀”&#xff01;它不像Python那样优雅&#xf…

MCP server资源网站去哪找?国内MCP服务合集平台有哪些?

在人工智能飞速发展的今天&#xff0c;AI模型与外部世界的交互变得愈发重要。一个好的工具不仅能提升开发效率&#xff0c;还能激发更多的创意。今天&#xff0c;我要给大家介绍一个宝藏平台——AIbase&#xff08;<https://mcp.aibase.cn/>&#xff09;&#xff0c;一个…

修改Spatial-MLLM项目,使其专注于无人机航拍视频的空间理解

修改Spatial-MLLM项目&#xff0c;使其专注于无人机航拍视频的空间理解。以下是修改方案和关键代码实现&#xff1a; 修改思路 输入处理&#xff1a;将原项目的视频文本输入改为单一无人机航拍视频/图像输入问题生成&#xff1a;自动生成空间理解相关的问题&#xff08;无需用户…

攻防世界-Reverse-insanity

知识点 1.ELF文件逆向 2.IDApro的使用 3.strings的使用 步骤 方法一&#xff1a;IDA 使用exeinfo打开&#xff0c;发现是32位ELF文件&#xff0c;然后用ida32打开。 找到main函数&#xff0c;然后F5反编译&#xff0c;得到flag。 tip&#xff1a;该程序是根据随机函数生成…

【openp2p】 学习1:P2PApp和优秀的go跨平台项目

P2PApp下面给出一个基于 RESTful 风格的 P2PApp 管理方案示例,供二次开发或 API 对接参考。核心思路就是把每个 P2PApp 当成一个可创建、查询、修改、启动/停止、删除的资源来管理。 一、P2PApp 资源模型 P2PApp:id: string # 唯一标识name: string # …

边缘设备上部署模型的限制之一——显存占用:模型的参数量只是冰山一角

边缘设备上部署模型的限制之一——显存占用&#xff1a;模型的参数量只是冰山一角 在边缘设备上部署深度学习模型已成为趋势&#xff0c;但资源限制是其核心挑战之一。其中&#xff0c;显存&#xff08;或更广义的内存&#xff09;占用是开发者们必须仔细考量的重要因素。许多…

脑机新手指南(二十一)基于 Brainstorm 的 MEG/EEG 数据分析(上篇)

一、脑机接口与神经电生理技术概述 脑机接口&#xff08;Brain-Computer Interface, BCI&#xff09;是一种在大脑与外部设备之间建立直接通信通道的技术&#xff0c;它通过采集和分析大脑信号来实现对设备的控制或信息的输出。神经电生理信号作为脑机接口的重要数据来源&…

[Linux]内核态与用户态详解

内核态和用户态是针对CPU状态的描述。在内核态可以执行一切特权代码&#xff0c;在用户态只能执行那些受限级别的代码。如果需要调用特权代码需要进行内核态切换。 一、内核态和用户态概况 内核态&#xff1a; 系统中既有操作系统的程序&#xff0c;也有普通用户程序。为了安…

如何查看每个磁盘都安装了哪些软件或程序并卸载?

步骤如下&#xff1a; 1、点击电脑桌面左下角&#xff1a; 2、选择【应用和功能】 3、点击下拉框&#xff0c;选择想要查看的磁盘&#xff0c;下方显示的就是所有C磁盘下安装的软件和程序 卸载方法&#xff1a; 点击对应的应用&#xff0c;然后点击卸载即可&#xff1a;

记录一次莫名奇妙的跨域502(badgateway)错误

这里图片加载不了&#xff0c;原文请访问&#xff1a;原文链接 公司的项目&#xff0c;这几天添加了一个统计功能&#xff0c; 本地测试没太大问题&#xff0c;上线后有一个问题&#xff0c;具体现象描述如下&#xff1a; 统计首页接口大约有5-6个&#xff0c;也就是同时需要…

Linux之线程

Linux之线程 线程之形线程接口线程安全互斥锁条件变量&信号量生产者与消费者模型线程池 线程之形 进程是资源分配的基本单位&#xff0c;而线程是进程内部的一个执行单元&#xff0c;也是 CPU 调度的基本单位。 线程之间共享进程地址空间、文件描述符与信号处理&#xff0…

snail-job的oracle sql(oracle 11g)

官网版本的oracle sql中有自增主键&#xff0c;oracle 11g并不支持&#xff0c;所以改成新建索引和触发器的方式自增主键。&#xff08;tip&#xff1a;snail-job的最新版本1.0.0必须使用JDK17&#xff0c; jdk8会报错&#xff0c;所以最后没用起来&#xff09; /*SnailJob Dat…

Windows VMWare Centos Docker部署Nginx并配置对Springboot应用的访问代理

前置博文 Windows VMWare Centos环境下安装Docker并配置MySqlhttps://blog.csdn.net/u013224722/article/details/148928081 Windows VMWare Centos Docker部署Springboot应用https://blog.csdn.net/u013224722/article/details/148958480 # 将已存在的容器设置为宿主机重启后…

暑期数据结构第一天

暑期数据结构第一天 数据元素与数据对象 数据元素--组成数据的基本单位 与数据的关系&#xff1a;是集合的个体 数据对象--性质相同的数据元素的集合 与数据的关系&#xff1a;集合的子集 逻辑结构 &#xff08;1&#xff09;线性结构&#xff0c;所有结点都最多有一个直…

vsCode 扩展中 package.nls.json 文件的作用国际化支持

package.nls.json 代表英文语言文件 {"command.favourite.addtofavourite": "Add to Favourite","command.favourite.deletefavourite": "Remove from Favourite","command.favourite.moveup": "Move Up" } 在 …

结构型智能科技的关键可行性——信息型智能向结构型智能的转换(提纲)

结构型智能科技的关键可行性 ——信息型智能向结构型智能的转换 1.信息型智能科技概述 1.1传统计算机科技的信息型继承者 1.2 信息型智能环境 1.3信息型智能主体 1.4机器学习创造的智能 1.5信息型智能科技的问题 2.结构型智能科技概述 2.1传统计算机科技向真实生命结构…