目录:
1.引入什么是合适的时候
2.内核态和用户态
3.信号的处理
4.sigaction函数
--------------------------------------------------------------------------------------------------------------------------------
1.引入什么是合适的时候
2.信号什么时候被处理
什么是内核态、什么是用户态呢??
内核态:执行操作系统的代码和数据时,计算机所处的状态就叫做内核态,OS的代码和执行全部都是在内核态!!
用户态:就是用户代码和数据被访问或者执行的时候,所处的状态,我们自己所写的代码全部都是在用户态执行的!!!
内核态和用户态的主要区别是在:在于权限
我们之前学的页表都是用户级页表,每一个进程都有一份,而在操作系统启动之后,会给linux内核(操作系统)也给一个系统级页表(内核页表)所以进程共享
这样的话,我们就从设计上能够,保证一个进程既能看到自己的代码,又能看到OS的代码
让你能够看到,你就一定能够访问吗??
我们需要有一个权限和身份认证,证明当前你的整个进程是属于哪种工作模式的(这种工作模式一般在我们进程里面有相关数据标识,这个数据会被加载进CPU当中)
所以在我们的CPU当中有一个寄存器(CR3),为0的时候代表操作系统,为3的时候代表普通用户(所以说当我们进程在执行的时候,怎么知道自己是内核态还是用户态,就是完完全全查CPU的寄存器(CR3))
进程具有了地址空间是能够看到用户和内核的所有内容的,不一定能访问
用户态使用的是用户级页表,只能访问用户数据和代码
内核态使用的内核级页表,只能访问内核级的数据和代码
区分我们是内核态还是用户态,CPU有寄存器保存了当前进程 的状态
进程之间无论如何切换,我们能够保证我们一定能够找到同一个OS,因为我们每一个进程都有3-4G的地址空间,使用同一张内核页表!!!!
--------------------------------------------------------------------------------------------------------------------------
3.信号的处理
这就是我们调用系统调用时,内核态和用户态之间的切换
我们要进行的信号处理
用户态调用系统调用进入内核态,把系统调用的内核代码执行完,准备返回用户态的时候,我不着急返回,反正我刚好也在内核,PCB也在内核当中,顺便对进程 的信号检测一下,有信号没有被block,直接执行它的方法,执行完必之后回到内核(默认和忽略是直接内核态执行就可以了,只要自定义捕捉的时候,需要我们切换回用户态)!!!
为何我一定要切换回用户态,才能执行我自定义信号的捕捉方法???
OS能不能直接执行用户的代码呢??理论上是可以的(毕竟是OS拥有权限高)
但是OS不相信任何人!!,既要把自己保护好,也不轻易执行别人的代码,OS身份特殊,不能直接执行用户的代码!!!
--------------------------------------------------------------------------------------------------------------------------------
4.sigaction函数
----------------------------------------------------------------------------------------------------------------------------
当某个信号的处理函数被调用时,内核(OS)会自动将当前信号加入进程的信号屏蔽字,当信号处理函数返回时自动恢复原来的信号屏蔽字,这样就保证了在处理某个信号时,如果这种信号再次产生,那么它就会被阻塞到当前处理结束为止!!!
在调用信号处理函数时,除了当前信号自动屏蔽之外,还希望自动屏蔽另外一些信号,则用sa_mask字段说明需要屏蔽额外的信号