linux(信号发送后)

目录:

           1.引入什么是合适的时候

           2.内核态和用户态

           3.信号的处理

           4.sigaction函数

--------------------------------------------------------------------------------------------------------------------------------

1.引入什么是合适的时候

linux(信号发送后)_第1张图片

 2.信号什么时候被处理

 什么是内核态、什么是用户态呢??

内核态:执行操作系统的代码和数据时,计算机所处的状态就叫做内核态,OS的代码和执行全部都是在内核态!!
用户态:就是用户代码和数据被访问或者执行的时候,所处的状态,我们自己所写的代码全部都是在用户态执行的!!!

内核态和用户态的主要区别是在:在于权限

linux(信号发送后)_第2张图片

linux(信号发送后)_第3张图片

 我们之前学的页表都是用户级页表,每一个进程都有一份,而在操作系统启动之后,会给linux内核(操作系统)也给一个系统级页表(内核页表)所以进程共享

linux(信号发送后)_第4张图片

这样的话,我们就从设计上能够,保证一个进程既能看到自己的代码,又能看到OS的代码

 让你能够看到,你就一定能够访问吗??

我们需要有一个权限和身份认证,证明当前你的整个进程是属于哪种工作模式的(这种工作模式一般在我们进程里面有相关数据标识,这个数据会被加载进CPU当中)

所以在我们的CPU当中有一个寄存器(CR3),为0的时候代表操作系统,为3的时候代表普通用户(所以说当我们进程在执行的时候,怎么知道自己是内核态还是用户态,就是完完全全查CPU的寄存器(CR3))

进程具有了地址空间是能够看到用户和内核的所有内容的,不一定能访问

用户态使用的是用户级页表,只能访问用户数据和代码

内核态使用的内核级页表,只能访问内核级的数据和代码

区分我们是内核态还是用户态,CPU有寄存器保存了当前进程 的状态

进程之间无论如何切换,我们能够保证我们一定能够找到同一个OS,因为我们每一个进程都有3-4G的地址空间,使用同一张内核页表!!!!

linux(信号发送后)_第5张图片

 --------------------------------------------------------------------------------------------------------------------------

3.信号的处理

linux(信号发送后)_第6张图片

这就是我们调用系统调用时,内核态和用户态之间的切换

 我们要进行的信号处理

linux(信号发送后)_第7张图片

 用户态调用系统调用进入内核态,把系统调用的内核代码执行完,准备返回用户态的时候,我不着急返回,反正我刚好也在内核,PCB也在内核当中,顺便对进程 的信号检测一下,有信号没有被block,直接执行它的方法,执行完必之后回到内核(默认和忽略是直接内核态执行就可以了,只要自定义捕捉的时候,需要我们切换回用户态)!!!

linux(信号发送后)_第8张图片

 为何我一定要切换回用户态,才能执行我自定义信号的捕捉方法???

OS能不能直接执行用户的代码呢??理论上是可以的(毕竟是OS拥有权限高)

但是OS不相信任何人!!,既要把自己保护好,也不轻易执行别人的代码,OS身份特殊,不能直接执行用户的代码!!!

--------------------------------------------------------------------------------------------------------------------------------

4.sigaction函数

linux(信号发送后)_第9张图片

 linux(信号发送后)_第10张图片

linux(信号发送后)_第11张图片

 

linux(信号发送后)_第12张图片

 ----------------------------------------------------------------------------------------------------------------------------

当某个信号的处理函数被调用时,内核(OS)会自动将当前信号加入进程的信号屏蔽字,当信号处理函数返回时自动恢复原来的信号屏蔽字,这样就保证了在处理某个信号时,如果这种信号再次产生,那么它就会被阻塞到当前处理结束为止!!!        

在调用信号处理函数时,除了当前信号自动屏蔽之外,还希望自动屏蔽另外一些信号,则用sa_mask字段说明需要屏蔽额外的信号

你可能感兴趣的:(Linux模块学习,linux,运维,服务器)