(。・∀・)ノ゙嗨!你好这里是ky233的主页:这里是ky233的主页,欢迎光临~
https://blog.csdn.net/ky233?type=blog
点个关注不迷路⌯'▾'⌯
一、信号调用合适的时机
信号产生之后,可能无法被立即处理,会再合适的时候处理
1.在合适的时候是什么时候呢?
首先,信号相关的内核都是在进程的PCB内部的,这时属于内核范畴,普通用户无法进行改动,所以要检测当前信号是否被屏蔽,我们要处于内核态中,而我们运行代码则处于用户态,所以我们在从内核态返回用户态的时候进行,信号检测和处理!
那么为什么会进入内核态呢?这是因为我们在进行系统调用的时候
2.什么是用户态和内核态
当我们通过一些系统调用接口执行OS底层的代码时候就进入了内核态,在执行自己写的代码就是用户态!
- 用户态是一个受管控的状态
- 内核态是一个OS执行自己代码的一个状态,具备非常高的优先级,基本不受任何资源的约束
3.那么用户态是怎么跑到内核态之中的呢?
在进程地址空间中,0-3g属于用户地址空间,3-4g属于内核地址空间,我们的用户地址空间是通过页表映射到,物理内存空间,这张页表被称为用户级页表,每个进程的用户级页表都是不一样的,因为进程具有独立性!
每一个进程都有3-4g的进程地址空是给内核用的,那么内核是怎么用的呢?
注意我们的OS只有一份,所以我们还要有一张页表,就是内核级页表,可以被所有进程看到!这个页表只有一份,也就是说每个进程看到的都是同一个内核级页表!
所以,当我们进行系统调用的时候,无非就是从用户地址空间跳转到内核地址空间,然后经过内核级页表的映射,查找到物理内存就可以进行系统调用了!
所以所有的内核也是在进程的地址空间上下文中跑的!
4.那么我为什么可以操作OS的代码呢?
这是凭借我们是内核态还是用户态!这是凭借我们的cpu来进行判断的,是由操作系统帮我们做的,所以当我们进行系统调用的时候,首先调用的是,系统调用里面的int 80语句,然后OS更改CPU里面的状态寄存器,然后我们就进入了内核态,这是我们调用的也就是内核级页表了!这时候无论是切换进程也好,还是什么也罢,OS看到的都只有自己的这些代码!