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不是一个意思

相关推荐
百万蹄蹄向前冲13 分钟前
密码都对Node.js却连不上Linux数据库
linux·mysql
彧azz14 分钟前
Linux 网络编程学习总结
linux·网络·笔记·学习·面试
浅念-39 分钟前
Redis基础详解:单线程模型、String与Hash数据结构
服务器·数据库·redis·sql·mysql·nosql数据库·nosql
日常筹谋记43 分钟前
自动化仓储安全防护工况评估:明治传感器AS-33C技术适配性分析
大数据·运维·创业创新·业界资讯
susplus1 小时前
【ARM 裸机开发 (IMX6ULL-mini)】GNU工具、Makefile 工程构建、链接脚本详解|C 语言点灯 + 蜂鸣器驱动
linux·arm·makefile·imx6ull
Shadow(⊙o⊙)1 小时前
Linux进阶知识1.0
linux·运维·服务器
>Andre<2 小时前
UFS5.0标准中文全译·卷一:范围、术语与架构
android·linux·嵌入式硬件
用户0510122572962 小时前
Linux下有关QT显示环境变量设置
linux·嵌入式
闲云自留地2 小时前
告别命令恐惧症,openEuler 基础操作 + 文本 + 网络管理实战
linux·运维·云计算
剑指offer.2 小时前
ARM裸机开发-点亮LED灯
linux·服务器·嵌入式硬件