1. 程式人生 > 實用技巧 >Linux 啟動

Linux 啟動

原文:https://www.cnblogs.com/hzcya1995/archive/2004/01/13/13307961.html

下面來聊一聊 Linux 是如何啟動的。

當計算機電源通電後,BIOS會進行開機自檢(Power-On-Self-Test, POST),對硬體進行檢測和初始化。因為作業系統的啟動會使用到磁碟、螢幕、鍵盤、滑鼠等裝置。下一步,磁碟中的第一個分割槽,也被稱為MBR(Master Boot Record)主引導記錄,被讀入到一個固定的記憶體區域並執行。這個分割槽中有一個非常小的,只有 512 位元組的程式。程式從磁碟中調入 boot 獨立程式,boot 程式將自身複製到高位地址的記憶體從而為作業系統釋放低位地址的記憶體。

複製完成後,boot 程式讀取啟動裝置的根目錄。boot 程式要理解檔案系統和目錄格式。然後 boot 程式被調入核心,把控制權移交給核心。直到這裡,boot 完成了它的工作。系統核心開始執行。

核心啟動程式碼是使用組合語言完成的,主要包括建立核心堆疊、識別 CPU 型別、計算記憶體、禁用中斷、啟動記憶體管理單元等,然後呼叫 C 語言的 main 函式執行作業系統部分。

這部分也會做很多事情,首先會分配一個訊息緩衝區來存放調試出現的問題,除錯資訊會寫入緩衝區。如果調試出現錯誤,這些資訊可以通過診斷程式調出來。

然後作業系統會進行自動配置,檢測裝置,載入配置檔案,被檢測裝置如果做出響應,就會被新增到已連結的裝置表中,如果沒有相應,就歸為未連線直接忽略。

配置完所有硬體後,接下來要做的就是仔細手工處理程序0,設定其堆疊,然後執行它,執行初始化、配置時鐘、掛載檔案系統。建立init 程序(程序 1 )守護程序(程序 2)

init 程序會檢測它的標誌以確定它是否為單使用者還是多使用者服務。在前一種情況中,它會呼叫 fork 函式建立一個 shell 程序,並且等待這個程序結束。後一種情況呼叫 fork 函式建立一個執行系統初始化的 shell 指令碼(即 /etc/rc)的程序,這個程序可以進行檔案系統一致性檢測、掛載檔案系統、開啟守護程序等。

然後 /etc/rc 這個程序會從 /etc/ttys 中讀取資料,/etc/ttys 列出了所有的終端和屬性。對於每一個啟用的終端,這個程序呼叫 fork 函式建立一個自身的副本,進行內部處理並執行一個名為getty

的程式。

getty 程式會在終端上輸入

login:

等待使用者輸入使用者名稱,在輸入使用者名稱後,getty 程式結束,登陸程式/bin/login開始執行。login 程式需要輸入密碼,並與儲存在/etc/passwd中的密碼進行對比,如果輸入正確,login 程式以使用者 shell 程式替換自身,等待第一個命令。如果不正確,login 程式要求輸入另一個使用者名稱。

整個系統啟動過程如下