
1.
进程0是所有其他进程的祖先,
也称作idle进程或swapper进程.
2.
进程0是在系统初始化时由kernel自身从无到有创建.
3.
进程0的数据成员大部分是静态定义的,即由预先定义好的INIT_TASK,
INIT_MM等宏初始化.
进程0的描述符init_task定义在arch/arm/kernel/init_task.c,由INIT_TASK宏初始化。
init_mm等结构体定义在include/linux/init_task.h内,为init_task成员的初始值,分别由对应的初始化宏如INIT_MM等初始化
Process
1
进程0最终会通过调用kernel_thread创建一个内核线程去执行init函数,这个新创建的内核线程即Process
1(这时还是共享着内核线程0的资源属性如地址空间等)。init函数继续完成剩余的内核初始化,并在函数的最后调用execve系统调用装入用户空间的可执行程序/sbin/init,这时进程1就拥有了自己的属性资源,成为一个普通进程(init进程)。至此,内核初始化和启动过程结束。下面就进入了用户空间的初始化,最后运行shell登陆界面。(注:Init进程一直存活,因为它创建和监控在 *** 作系统外层执行的所有进程的活动。)
——————
这段对进程0的描述引用自《Understanding
The
Linux
Kernel
-
Third
Edtion》
The
ancestor
of
all
processes,
called
process
0,
the
idle
process,
or,
for
historical
reasons,
the
swapper
process,
is
a
kernel
thread
created
from
scratch
during
the
initialization
phase
of
Linux.
This
ancestor
process
uses
the
following
statically
allocated
data
structures
(data
structures
for
all
other
processes
are
dynamically
allocated)
由于执行init()函数的内核线程和init进程的进程标识符都是1,它们又都叫init,因此init()函数和init进程容易造成概念上的模糊不清。主要区别:
1、init()函数是内核代码的一部分,在内核态运行,是独立的可执行代码的一部分。
2、init进程在Linux *** 作系统中是一个具有特殊意义的进程,它是由内核启动并运行的第一个用户进程,因此它不是运行在内核态,而是运行在用户态。它的代码不是内核本身的一部分,而是存放在硬盘上可执行文件的映象中,和其他用户进程没有什么两样。
0号进程-->1号内核线程-->1号内核进程-->init进程(1号用户进程)
0号进程:这是系统引导时自动形成的一个进程,实际上就是内核本身。它是系统中后来产生的所有进程的祖先。当内核系统完成自身初始化工作后,由内核本身调用函数kernel_thread(),它使用int
0x80系统调用创建了第一个内核线程。
1号内核线程:所谓内核线程,在Linux系统中是指没有虚拟存储空间的进程,内核线程可以直接使用物理地址空间,运行在内核态中。在软中断系统调用返回后,通过比较ESP和ESI寄存器的值来判断父、子进程。如果ESP寄存器的值就等于ESI寄存器的值,系统认为是父进程,就是内核本身,它就是0号进程。否则就是内核创建的第一个内核线程。所以此线程就是1号线程。
1号内核进程:如果是1号内核线程,程序控制该子程序直接去执行init()函数,随后,1号线程将演变成1号内核进程。
init进程:init()函数调用execve()从文件/etc/inittab中装入可执行程序init()并执行,从此执行init()函数的1
号内核进程演变成为init进程。也就是说由init()函数产生了init进程。在这个演变过程中没有使用fork(),因此,init进程的进程标识符仍然是1号内核进程的标识符1。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)