天天看點

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

轉載于:https://www.cnblogs.com/sdphome/archive/2011/10/25/2224582.html