一、操作系统启动生成的进程树
下图是我在做实验时调试出来的操作系统生成的进程树,计算机在刚开始启动时执行的是汇编代码,然后执行的第一行C代码是
1 | start_kernel |
在执行这个函数之后,正在执行的程序成为0号进程,0号进程会先后调用
1 | __do_fork |
两个函数去执行$\verb+fork+$和$\verb+exec+$两个系统调用,生成1号和2号进程,1号进程就是大名鼎鼎的$init$进程,所有用户程序的根进程(包括$shell$进程和用户登录进程等等)。2号进程负责创建和维护所有内核线程(在本图中是960号及之前的进程)。最后0号进程调用
1 | cpu_dile |
函数进入休眠状态,CPU在没有活跃任务可调度时就执行它。
二、计算机启动过程
本科做实验时画的图,描绘的时MBR启动的图,计算机先执行BIOS,然后跳转到$\verb+0x7c00+$地址执行MBR,然后执行Loader,完成实模式向保护模式切换、页表初始化等工作,然后进入内核。