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