本文是前 2 篇博文 Linux 内核学习笔记:初始化程序(第 1 部分)和 Linux 内核学习笔记:初始化程序(第 2 部分)的续篇。
初始化进程 0
进程 0 是 Linux 操作系统中运行的第一个进程,也是 Linux 操作系统父子进程创建机制的第一个父进程。
对于进程 0 能够正常运行,《Linux 内核设计的艺术》有一个简明的阐述:
more >>
- 系统先初始化进程 0。
进程 0 管理结构 task_struct 的母本(init_task={INIT_TAST,})已经在代码设计阶段事先设计好了,但这并不代表进程 0 已经可用了,还要将进程 0 的 task_struct 中的 LDT、TSS 与 GDT 相挂接,并对 GDT、task[64] 以及与进程调度相关的寄存器进行初始化设置。
- Linux 0.11 作为一个现代操作系统,其最重要的标志就是能够支持多进程轮流执行,这要求进程具备参与多进程轮询的能力。系统这里对
时钟中断
进行设置,以便在进程 0 运行后,为进程 0 以及后续由它直接、间接创建出来的进程能够参与轮转奠定基础。- 进程 0 要具备处理
系统调用
的能力。每个进程在运算时都可能需要与内核进行交互,而交互的端口就是系统调用程序。系统通过函数 set_system_gate 将 system_call 与 IDT 相挂接,这样进程 0 就具备了处理系统调用的能力了。这个 system_call 就是系统调用的总入口。