歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

init函數和init進程的區別

由於執行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(如果有的話)。

Copyright © Linux教程網 All Rights Reserved