一、信号捕捉处理的概述
1、信号捕捉处理全过程
如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号。过程比较复杂:首先我们在执行主控制流程的某条指令时因为系统调用等原因会进入内核,然后内核处理完成后发送信号,如果信号的处理动作是自定义的信号处理函数就回到用户区执行信号处理函数,执行完之后因为信号处理函数的特殊性,它要再次进入内核区,然后回到用户模式继续执行。
我们在用户区和内核区来回切换的时候,操作系统负责做我们的身份(用户身份和内核身份)切换工作,用户态陷入内核态是通过汇编指令 int 80 完成的。
在进程从内核态返回用户态时进行信号的检测和处理。
并且 main 函数和自定义信号捕捉处理函数使用不同的堆栈空间,它们之间不存在调用和被调用的关系
2、用户态和内核态的区别
用户态和内核态是操作系统中 CPU 的两种运行状态,它们在访问权限、资源使用等方面存在显著差异,以下是对这两种状态的标准解释:
(一)用户态
用户态是操作系统为普通用户程序提供的一种运行模式,在用户态下运行的程序拥有较低的特权级别,只能访问受限的系统资源和执行特定的操作,大部分用户编写的应用程序(如文本编辑器、浏览器等)都是在用户态下运行的。
用户态程序只能访问自己的内存空间,不能直接访问系统的核心资源,如硬件设备、操作系统内核的数据结构等,并且只能执行一部分指令,一些具有高风险或对系统影响较大的指令(如修改系统时钟、控制硬件中断等)是被禁止执行的。
由于用户态程序的权限受到限制,即使程序出现错误(如内存越界、死循环等),也不会对整个操作系统造成严重影响,只会影响到该程序自身。
(二)内核态
内核态是操作系统内核运行的模式,具有最高的特权级别,操作系统内核负责管理系统的核心资源,如内存、进程、文件系统、设备驱动等,因此需要在高特权的内核态下运行。
内核态程序可以访问系统的所有资源,包括硬件设备、内核数据结构、所有进程的内存空间等,并且可以执行所有的 CPU 指令,包括那些在用户态下被禁止执行的特权指令,这些特权指令可以用于实现系统的关键功能,如进程调度、内存管理、中断处理等。
由于内核态程序具有最高的权限,一旦内核态程序出现错误,可能会导致整个操作系统崩溃或出现严重的系统故障。
(三)用户态与内核态的切换
在操作系统的运行过程中,程序需要在用户态和内核态之间进行切换,以完成不同的任务,常见的切换场景包括:
- 系统调用:当用户态程序需要访问系统资源或执行特权操作时,会通过系统调用(如
open、read、write等)请求操作系统内核的服务,在执行系统调用时,程序会从用户态切换到内核态,由操作系统内核来处理请求,处理完成后再切换回用户态。 - 中断处理:当系统发生硬件中断(如时钟中断、键盘中断等)或软件中断(如异常、陷阱等)时,CPU 会自动从用户态切换到内核态,由操作系统内核来处理中断事件,处理完成后,根据情况决定是否切换回用户态。
但是操作系统是不相信用户的,所以用户态和内核态进行切换的时候是操作系统完成的。
(四)硬件条件
在 CPU 中有一个 CS 寄存器,它的后两个 bit 位就标记了当前是处于用户态还是内核态,其中 00 表示处于内核态,11 表示处于用户态,int 80 指令本质上就是将 11 修改成 00。
二、再谈进程地址空间











