linux 啓動-shell進程由來

linux創建新進程的過程。

系統允許一個進程創建新進程,新進程即爲子進程,子進程還可以創建新的子進程,形成進程樹結構模型。整個linux系統的所有進程也是一個樹形結構。樹根是系統自動構造的,即在內核態下執行的0號進程,它是所有進程的祖先。由0號進程創建1號進程(內核態),1號負責執行內核的部分初始化工作及進行系統配置,並創建若干個用於高速緩存和虛擬主存管理的內核線程。隨後,1號進程調用execve()運行可執行程序init,並演變成用戶態1號進程,即init進程。它按照配置文件/etc/initab的要求,完成系統啓動工作,創建編號爲1號、2號...的若干終端註冊進程getty。每個getty進程設置其進程組標識號,並監視配置到系統終端的接口線路。當檢測到來自終端的連接信號時,getty進程將通過函數execve()執行註冊程序login,此時用戶就可輸入註冊名和密碼進入登錄過程,如果成功,由login程序再通過函數execv()執行shell,該shell進程接收getty進程的pid,取代原來的getty進程。再由shell直接或間接地產生其他進程。

上述過程可描述爲:0號進程->1號內核進程->1號內核線程->1號用戶進程(init進程)->getty進程->shell進程

注意,上述過程描述中提到:1號內核進程調用執行init並演變成1號用戶態進程(init進程),這裏前者是init是函數,後者是進程。兩者容易混淆,區別如下:

1.init()函數在內核態運行,是內核代碼

2.init進程是內核啓動並運行的第一個用戶進程,運行在用戶態下。

3.init()函數調用execve()從文件/etc/inittab中加載可執行程序init並執行,這個過程並沒有使用調用do_fork(),因此兩個進程都是1號進程。

發佈了26 篇原創文章 · 獲贊 9 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章