37 内核与用户_信号

lesson 28操作系统是基于中断的软件集合。

看大表,拿到虚拟地址就能访问用户区,通过页表映射,内核页表和用户页表区别就是,一个进程一个用户页表,操作系统只存在一份,操作系统代码数据只有一分,内核页表,系统只有一份,每个进程都能通过进程地址空间 内核页表找到同一个操作系统,

cpu内部有个代码段寄存器,后两位0代表内核,为1代表用户,如果发现用户访问内核直接通过中断停止访问。

这个命令让cs段寄存器转而指向操作系统的代码区,并将11设置为0,这叫陷入内核,但是操作系统不允许去直接通过地址访问代码数据,所以执行int syscall就是执行0x80的系统调用方法,否则都是非法状态,。。权限标志代表用户态还是内核态。

所谓的用户态 ,就是 CPU 的权限级别为 3(Ring 3),并且我们只允许用户进程访问 0 到 3GB 的虚拟地址空间。那么,什么叫做内核态呢?CPU 的执行级别为 0(Ring 0)。

操作系统允许用户以系统调用 的方式,把系统调用号传递到我们的 EAX 寄存器 中,然后再切换我们的地址空间,使用内核页表映射操作系统内核。系统会根据中断处理机制,查找对应的系统调用表 来执行系统调用。

这个权限位有专门的名词叫CPL,CPL = Current Privilege Level 中文翻译当前特权级

硬件中断,除灵野指针异常,系统调用进入内核,中断走中断处理方法,异常,操作系统中断处理方法发信号,系统调用要求封装的系统调用,int 80陷入内核,在内部执行操作系统上的功能,1.访问3-4GB地址空间,2. 访问内核级页表 3.CPU工作模式由3变0,此时就以操作系统的身份运行,返回时可以检查信号,若发现是用户级别方法就要回到用户层,级别由0-3,然后弹栈返回回到sigreturn,再次陷入内核,执行级别3-0。返回用户态0-3。

涉及4次身份变化。

捕捉信号:硬件中断信号产生->执行中断处理方法,修改当前进程taststruct pending表,中断处理完,进程继续运行,发生陷阱,异常中断,导致陷入内核,返回时检查。

捕捉信号另一个方法sigaction,

看代码 ,如果不用这种机制,会让大量相同 信号递归处理,十分复杂,,递达之前pending1-0 block 0-1

  • 你正在愉快地执行 信号 A 的处理函数

  • 此时来了一个没被屏蔽的 信号 B。因为硬件中断或时间片轮转,CPU 陷入了内核态。

  • 内核发现有未屏蔽的信号 B 需要处理,于是保存当前正在执行的信号 A 处理函数的上下文(类似于保存案发现场)

  • 内核篡改返回地址,切换回用户态,强制 CPU 去执行 信号 B 的处理函数

  • 信号 B 的处理函数执行完毕 ,通过 sigreturn 再次陷入内核。

  • 内核恢复之前保存的上下文,回到 信号 A 的处理函数 被打断的地方,继续把 A 执行完。

  • 最后,A 执行完毕,再返回到 main 主函数的正常逻辑。


    volatile

while(flag)就是一直执行1,2步骤导入,运算,有些不需要写回就不需要,

还有一种情况,编译器发现while只检查不修改,所以给flag带一个建议性关键字register,在内存照样定义出来为0,我编译时直接把0加载到cpu寄存器,从此往后while循环在进行检测时,检测寄存器里值是否为真就不用访存了,就提高运算速度了,所以可能这样优化。

看代码,flag优化后,while循环再检测时只看寄存器,内存变了也不看 ,不知道优化级别,用valatile修饰,进程能正常结束,就是不省略从内存mov到编译器这一步。


sigchld信号

看代码,这是用阻塞方式循环,子进程全回收之后下次就返回错误,期间还有子进程发送信号在pending,还要执行一次,这次子进程全都回收直接错误,,要是有几个没退就阻塞了就采用非阻塞方式

这样不关心子进程,不会有僵尸进程,子进程退出就退出了。父进程也不管,不过拿不到退出码

但是默认就是ign,为什 还要设置一次,因为默认是def,这个是缺省动作 这两个ign不是一个意思

相关推荐
AlfredZhao6 小时前
生产环境里,为什么不建议把普通端口直接暴露到公网?
linux·https·443·80
戴为沐1 天前
Linux内存扩容指南
linux
zylyehuo2 天前
Linux 彻底且安全地删除文件
linux
用户805533698032 天前
主线 U-Boot 上 RK3506:和闭源 rkbin 拔河的三个隐性契约
linux·嵌入式
用户034095297912 天前
linux fcitx 5 雾凇拼音 设置在中文输入法下仍然输入英文标点
linux
乘云数字DATABUFF2 天前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
Web3探索者4 天前
可视化服务器管理和传统命令行区别是什么?新手教程:Linux 运维到底该用图形界面还是 SSH 命令行?
linux·ssh
zylyehuo4 天前
Linux系统中网线与USB网络共享冲突
linux
荣--4 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森4 天前
动手实战学 Docker — 从零到集群编排完全指南
运维