相关概念:递达 未决 / 阻塞 忽略
阻塞 vs 忽略
阻塞:
如果指定信号信号被阻塞, block期间该信号不能被递达,一直在pending表中。知道block被撤销后, 该信号才能递达,递达后对应pending位置置零。
忽略:
被忽略的信号可以正常递达,只是在递达时不会执行任何handler
block pending handler
block pending handler为task_struct中的三张表,是三个位图
- block 表:记录当前进程阻塞的信号集合,阻塞的信号不会立刻处理,直到解除阻塞。
- pending 表:保存已经发送但尚未处理的信号,当进程可以处理时,信号将被从待处理表中移到处理队列。
- handler 表:存储信号对应的处理函数,决定当信号到达时,进程如何响应这些信号。
三张表中都有31个信号,信号值减1为hander对应下标
对三张表进行查改
见:对block, pending, handler,三张表进行查改操作-CSDN博客
signal
signal:对handler表
#include <signal.h>typedef void (*sighandler_t)(int);sighandler_t signal(int signum, sighandler_t handler);
SIG_DEL, SIG_IGN 默认方法&忽略
signal只是设置作用,不执行实际捕捉过程。一次设置,一直可用
sigpromask:对block
sigset_t 结构体 信号集
block信号集也叫做信号屏蔽字(singal musk)
sigpending
检查pending表,不需要提供修改功能
只有输出型参数
三者关系
一个信号值被block了,只是挡住了pending到handler的道路,但改信号值还是可以进入pending。当block解除后,pending对应信号值可执行handler,执行后pending中该位置置零
信号捕捉
信号捕捉流程
为什么运行signalhandler要返回用户态:限制权限
为什么signalhandler之后进入sys_sigreturn而不是直接返回main:进入内核态才能从cpu得到下条指令地址,才能回到main
用户态&内核态
什么是用户态&内核态
用户态:我自己写的代码
内核态:操作系统的代码
如何切换用户态&内核态 cs寄存器
从用户态到内核态:cpu内cs(code segment)寄存器,两个bit位的值为0是内核态,3是用户态
只有cpu的cs为0才能访问内核态
调用int0x80或syscall时,cpu自动改cs为0,用户态为3
用户如何进入内核态
通过系统调用(system_call), 如write, read, fork, kill等等
int 0x80 & system_call
int 0x80是一条汇编指令, c语言调用system_call接口(write, read,fork等)时,其汇编语句中会调用int 0x80使该进程陷入内核态
操作系统是怎样运行的
操作系统基于中断来循环运行
硬件中断
IDT 中断向量表
可理解为函数指针数组
下标为中断号
通过外部设备中断,OS不必轮询/周期性检测
IDT表:
时钟元
时钟中断,一直在推进操作系统进行调度
什么是操作系统:操作系统就是基于中断向量表进行中断的
当代时钟元被集成到CPU内部
其中断频率称为主频
什么是时间片
本质是一个计数器
进程调度就是当前时间片进行--
所以说进程调度不一定切换,当时间片为0时才切换
软中断
上述为硬中断
也有软中断,由于软件问题,出发上述逻辑(系统调用)
陷阱&异常
陷阱:单纯让OS陷入内核态的软中断, 通常指system_call
异常:出错导致的软中断
所以中断不一定是错误,可能只是一种手段
系统调用过程
系统调用就是软中断
操作系统就是躺在中断处理例程上的代码块
系统调用表
系统调用号
系统调用
三者关系:系统调用通过调用sys_function(int index)向CPU指定寄存器写入系统调用号, CPU自动去系统调用表执行对应方法
中断时的上下文保护
见:上下文保护-CSDN博客
总结:将cpu与进程相关信息/状态保存到进程PCB中
CPU执行中断时如何保存数据
内核页表/用户页表
内核页表:整个OS,只有一份,映射3-4GB的内核区
用户页表:每个进程不一样,映射0-3GB
所以每个进程看到的都是同一OS
访问用户区不需要系统调用(这就是为什么访问共享内存不用系统调用:已经被映射到用户区中的共享区)
对于内核区,我们只/只能关心系统调用接口。
但我们没必要关心系统调用对应地址,glibc已经将其封装,用户只需知道调用号
tips
nohub指令
fg / bg 指令 移动到前/后台
nohub vs bg
man 7 singal 查看各种指令信息
函数 传参/return 通过寄存器
板书笔记