(47) 介绍下 linux 0.11 中定义的信号量
(48) 接着介绍下逗号表达式 , linux 大师这么使用了 ,所以需要了解下:
(49) 关于进程调度、切换 的 schedule ( ) 与 switch_to ( ) 函数:
(50) 接着给出 pause ( ) 函数被执行时的函数调用链,以了解和跟踪操作系统和 CPU 的执行状态:
从以上的代码框架里得出几个结论:
一:0 号进程被称为怠速进程,其不断调用 pause(),看看是否有新进程可以调度,没有则 switch_to() 不进行进程切换,继续运行 0 号进程,再次循环调用 pause() 函数。
二:0 号进程的状态 state 是特例,不起作用的,当没有另外的进程时,对 0 号进程的调用是随时都可以的。
三:函数 switch_to() 的对任务的切换,是使用不带返回的跳转指令 jmp ,而非 call ,我们有个疑问是,那本进程剩余的程序还会被执行么?答案是会的,因为进程切换时 , CPU 进行的保存进程上下文和加载新进程 TSS 的过程,非常类似于 call 与 ret 的功能。所以日后调用 switch_to () 的进程再次获得调度运行后,是可以接着 jmp 的下一条指令继续执行的:完成 switch_to 的剩余代码,从 int 80H 中断返回。
关于 X86 架构的汇编指令 jmp far 的机器指令就是 0xEA ,是有依据的,来自王爽老师的汇编第三版课本:
(51) IDT 表中的中断描述符的 type : 陷阱门 = 1111 ,允许嵌套 ; 普通中断 = 1110 ,不允许嵌套 ; linux 0.11 中的系统调用门 int 80H = 1111 ,所以也允许嵌套。即 int 80H 的系统调用函数可以嵌套调用。第一个 int 80H 还没有返回,又调用另一个 int 80H 。
附 TSS 描述符 10B1 , LDT 描述符 : 0010 。
(52)以进程 0 对 进程 1 的调度为例,来说明系统调用中断 int 80H 是可以嵌套的:
(53)以上的说明,以探讨完 0 号进程的代码和功能。接着探讨被 0 号进程调度执行的 1 号进程的代码和功能, 1 号进程开始给系统挂载硬盘和文件系统。首先介绍相关的 函数 sys_setup()的来龙去脉,探讨其是被如何调用的:
以及启用博思白板会员后的图片:
(54)从已经探讨完所有的代码的进程 0 看, 进程 0 称为怠速进程,只需要很少的代码,就可以维持硬件 ,如 cpu 运转,不至于没有任务时候,系统停机。而进程 1 就比较复杂,开始打开了文件,关联到了硬盘,但这也是要操作数据的大多数进程的实际情况。
(55)再介绍一个关于硬盘分区的结构 partition :
(56a) 3-21a 函 sys_setup 的调用链上:
(56b)介绍读取硬盘信息并加载根文件系统的函数 sys_setup_() :
(56c) 接着再完善其调用链。涉及到的 iget ,iput 下图给出 :
(56d)接着补充函数 iget 的调用链,顾名思义,从磁盘上获取一个节点:
(56e)接着介绍把内存节点同步到磁盘节点的 iput 的调用链:
(57)
谢谢