Linux信号之信号的处理

(。・∀・)ノ゙嗨!你好这里是ky233的主页:这里是ky233的主页,欢迎光临~icon-default.png?t=N7T8https://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看到的都只有自己的这些代码!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值