init程序的建立
linux將要建立的第乙個程序是init程序,建立該程序是以呼叫kernel_thread(init ,null,0)這個函式的形式進行的。init程序是很特殊的——它是linux的第乙個程序,也是其它所有程序的父程序。讓我們來看一下它是怎樣產生的。
在呼叫kernel_thread(init,null,0)函式時,會呼叫main.c中的另外乙個函式——init()。請注意init()函式和init程序是不同的概念。通過執行inin()函式,系統完成了下述的工作:
·建立dbflush、kswapd兩個新的核心執行緒。
·初始化tty1裝置。該裝置對應了多個終端(concole),使用者登入時,就是登入在這些終端上的。
·啟動init程序。linux首先尋找「/etc/init」檔案,如果找不到,就接著找「/bin/init」檔案,若仍找不到,再去找「/sbin/init」。如果仍無法找到的話,啟動將無法進行下去。否則,便執行init檔案,從而建立init程序。
(1) 檔案系統檢查。
(2) 啟動系統的守護程序。
(3) 對每個聯機終端建立乙個「getty」程序。
(4) 執行「/etc/rc」下的命令檔案。
此後,「getty」會在每個終端上顯示「login」提示符,以等待使用者的登入。此時「getty」會呼叫「exec」執行「login」程式,「login」將核對使用者帳戶和密碼,如果密碼正確,「login」呼叫「exec」執行shell的命令列解釋程式(當然,也可以執行x-windows,如果使用者設定了的話)。shell接著去執行使用者預設的系統環境配置指令碼檔案(通常是使用者的home目錄下的profile檔案)。
init還有另外乙個任務,當某個終端或虛擬控制台上的使用者登出之後,init 程序要為該終端或虛擬控制台重新啟動乙個 「getty」,以便能夠讓其他使用者登入。這是為什麼呢?你應該發現,當使用者登入時,「getty」用的是「exec」而不是「fork」系統呼叫來執行「login」,這樣,「login」在執行的時候會覆蓋「getty」的執行環境。(同理,使用者註冊成功後,「login」的執行環境也會被shell占用)所以,如果想再次使用同一終端,必須再啟動乙個「getty」。
此外,init 程序還負責管理系統中的「孤兒」程序。如果某個程序建立子程序之後,在子程序終止之前終止,則子程序成為孤兒程序。init 程序負責「收養」該程序,即孤兒程序會立即成為 init 程序的子程序。這是為了保持程序樹的完整性。
init 程序的變種較多,大多數 linux 的發行版本採用 sysvinit(由 miquel van smoorenburg)。這是乙個編譯好的軟體包。由於 system v 而得名。unix 的 bsd 版本有不同的 init,主要區別在於是否具有執行級別(關於執行級別的問題下面會有專門的描述):system v 有執行級別,而 bsd 沒有執行級別。但這種區別並不是本質的區別。
圖5.12是上述流程的流程圖。
圖5.12 init程序的啟動流程
Linux init程序詳解
一 什麼是init init是linux系統操作中不可缺少的程式之一。所謂的init程序,它是乙個由核心啟動的使用者級程序。核心自行啟動 已經被載入記憶體,開始執行,並已初始化所有的裝置驅動程式和資料結構等 之後,就通過啟動乙個使用者級程式init的方式,完成引導程序。所以,init始終是第乙個程序...
Linux init程序詳解
一 什麼是init init是linux系統操作中不可缺少的程式之一。所謂的init程序,它是乙個由核心啟動的使用者級程序。核心自行啟動 已經被載入記憶體,開始執行,並已初始化所有的裝置驅動程式和資料結構等 之後,就通過啟動乙個使用者級程式init的方式,完成引導程序。所以,init始終是第乙個程序...
Linux init程序詳解
init模組 一 什麼是init init是linux系統操作中不可缺少的程式之一。所謂的init程序,它是乙個由核心啟動的使用者級程序。核心自行啟動 已經被載入記憶體,開始執行,並已初始化所有的裝置驅動程式和資料結構等 之後,就通過啟動乙個使用者級程式init的方式,完成引導程序。所以,init始...