init进程简析

来源:互联网 发布:xp如何查找网络打印机 编辑:程序博客网 时间:2024/06/05 04:15

由于执行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。

 

看到这里我突然想起了在嵌入式根文件系统中,也是先执行内核的init线程,该线程会执行脚本./linuxrc,在./linuxrc的最后有:execve /sbin/init,转去执行用户空间的init进程,该进程会执行脚本inittab(如果有的话)。

 

(1)init进程介绍    
  init进程是由内核启动的第一个也是唯一的一个用户态进程(其它进程均属于内核态),它也是内核启动的最后一个进程,其ID号为1.启动init进程时,它会根据配置文件来决定启动哪些程序,比如,由init进程可以启动用户指定的程序,或启动shell,或执行某些配置脚本.Init进程是后续所有进程的发起者.


(2)Init进程启动顺序
  启动Init进程,其实质是执行/sbin/init程序.即Init进程可以启动其它子进程,或启动shell,本质上是因为内核执行了可执行序/sbin/init.因此,可以说Init进程的作用只不过是可执行程序/sbin/init的作用.可以这样来理解,当执行可执行程序/sbin/init时,该程序就是一进程,名字是Init.当然,用户也可以根据需要编写自己的/sbin/init程序,或者传入命令行参数"init=xxxx"指定某个程序作为Init进程运行.在嵌入式领域内,一般来说多使用Busybox集成的Init程序.

内核启动的最后一步就是启动Init进程.该Init进程中,它主要做了以下几项工作:
  <1>读取系统初始化表格文件/etc/inittab.
  <2>建立getty进程,在终端上显示login提示符,以等待用户的登录.
  <3>进程getty会调用exec以执行login程序.该程序将会核对用户账号和密码.
  <4>login程序会调用exec以执行shell命令解释器,也可执行X-windows.
  <5>shell命令解释器会读取系统环境配置脚本/etc/profile.

0 0
原创粉丝点击