(四)进程的生命周期——起源

操作系统:linux
处理器:arm
内核版本:4.x

目录:


提到进程生命周期就不得不说一说进程的起源:进程是怎么来的?第一个进程是谁?

0号进程

实际上计算机中第一个进程并不是动态产生的,0号进程的信息在数据段中,预先设定好了,其对应的内核栈也在特定的位置(数据段中,由链接脚本arch/arm/kernel/vmlinux.lds.S决定)。

这里写图片描述

这里写图片描述

cpu在汇编阶段建立完页表、开启MMU,跳转到start_kernel之前,会将指针指向0号进程的栈顶偏移8 byte的位置。
这里写图片描述
这里写图片描述

#define THREAD_START_SP>>   (THREAD_SIZE - 8)

可以用QEMU验证上面的结论,进入start_kernel时,sp指向了0号进程的栈,其对应的进程PCB是init_task。
这里写图片描述


1号进程、2号进程

在start_kernel最后一步,rest_init中会依据进程0的PCB为模板创建出kernel_init进程和kthreadd进程。(kernel_thread就是调用do_fork)
这里写图片描述
kernel_init进程会去解析用户配置好的脚本,是用户空间的第一个进程。
这里写图片描述
kthreadd进程是内核线程的父进程,每当有内核线程需要创建,通过调用kthread_create将自己添加到kthread_create_list时,kthreadd会被唤醒来创捷这些内核线程。
这里写图片描述
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_33160790/article/details/81057004