1.信号处理相关问题
信号处理,不是可以立即处理的,而是在合适的时候
不懂点击: 信号的产生第三点
什么时候是合适的时候?
当进程从内核态切换回用户态的时候,进程会在操作系统的指导下,进行信号的检测与处理
内核态与用户态概念的理解
用户态:执行你写的代码的时候,用户所处的状态
内核态:执行操作系统的代码的时候,进程所处的状态
执行操作系统代码的情况:
1.进程时间片到了,需要切换,就要执行进程切换逻辑
2.系统调用
0-3G属于用户空间
3-4G属于内核空间
将磁盘中的可执行程序加载到物理内存中
这张页表,被称为用户级页表
用户地址空间当中经过用户级页表映射到物理内存
所有的代码和数据都属于自己的代码和数据
操作系统也有代码和数据
如何找到操作系统的代码和数据的呢?
实际上还存在一个内核级页表
所有的进程0-3G是不同的,每一个进程都有自己的用户级页表
所有的进程3-4G是相同的, 每一个进程都可以看到同一张内核级页表
所以所有的进程都可以通过统一的窗口,看到同一个操作系统
操作系统运行的本质:在进程的地址空间处运行
无论进程如何切换,3-4G不变,看到操作系统的内容与进程切换无关
系统调用的本质:就相当于调用库函数中的方法,在自己的地址空间中进行函数跳转并返回
为什么要有 用户态和内核态
为了解决通过虚拟地址的方式随便去访问操作系统里面的代码和数据
提出用户态和内核态
若为用户态,想要去访问操作系统里面的代码和数据时,CPU就会拒绝执行代码,操作系统就可以识别非法访问,即硬件异常,向目标进程发送信号终止进程
CR3寄存器的使用
如何知道当前运行的用户态还是内核态?
在CPU中存在一种寄存器,被称为CR3寄存器,其中有对应的比特位
若为3,则表征正在运行的进程,执行级别为用户态
若为0,则表征正在运行的进程,执行级别为内核态
谁来更改执行级别?
用户无法直接更改
操作系统提供的所有的系统调用,内部在正式执行调用逻辑的时候,会去修改执行级别
信号处理的整体过程
进程返回时,需要进行信号检测
当执行完某种任务时,先找到对应的进程,检测对应的信号
若block为0(阻塞信号不执行),pending为1(收到信号),执行处理方法
若为忽略信号,则将pending由1改为0
若为自定义捕捉,当系统跳转过去执行的是自己写的方法
实际上自己写的方法是由用户态实现的,
虽然说可以使用内核态去执行自己实现的方法,但是不可以这样做,因为有可能方法内部做了一些非法操作
共分为四步
1.代码执行时,因为系统调用或者时间片到了,切换到内核态
2.返回用户态之前,先做信号检测,没有block(阻塞),已经被pending(收到)
由内核态切换到用户态,执行自定义的handler方法
3.执行handler方法后,在由用户态切换到内核态
4. 最后执行特定的系统调用,返回用户态继续执行