Linux 内核创世与创生
Linux宇宙诞生之时,创建了三个PID分别为0,1,2的进程, 你可以想象成成组件一个创业团队,第一步需要找到CEO,CTO,CFO,有管理,有技术,有钱,啥事都好办,可以继续发展壮大,三个角色就相当与LINUX内核的这三个初创进程。
创始成员的工号当然要从最前面开始选择,首先,由于初始从GRUB或者UBOOT跳入时刻没有进程存在,bringup阶段首先捏造了PID为0的swapper进程,之所以说是“捏造”,是因为创建0号进程没有依赖进程模板,0号进程之后的所有进程都有parent,但它没有parent,swapper对应task_struct对象init_task是静态分配,并且由bringup流程手动填充的,就好像凭空出现的一样,如同女娲造人一般创建的。有了第一个进程之后就好办了,新剩下的所有进程都是按照init_task swapper进程的样子clone的(通过内核fork),就不再是捏造了。swapper进程最后演化为内核idle进程,它是如此特殊,以至于用任何工具或者/proc文件系统,都找不到它的影子,但是它是却是实实在在存在着的。
swaper在完成自己的任务之前,创建了kernel thread init进程和kthreadd进程,然后就去养老了。把后面的工作留给了两个后继者。其中kernel_thread init进程完成了内核各类驱动的初始化,你看到的modue_init发起的内核驱动初始化调用,多半都是由处于内核态的kernel init进程发起的,kenrel_thread最终不满足于内核的禁闭,在内核态执行的最后阶段,完成了内核驱动初始化使命的init终于破土而出,成为了用户空间的第一个进程&