Linux系統啓動的標準流程

系統的啓動是指從計算機加電到顯示用戶登陸提示的整個過程。我們將在這裏對整個流程以及關係到的一些內容做討論。過程主要可以分爲兩個階段:載入內核和準備運行環境,我們分別進行討論。本部分的討論只基於i386硬件架構,但大部分內容是有共通性的。

載入內核(將內核載入內存,並將控制權傳遞給它)

計算機加電到Boot Loader開始工作,硬件含量遠大於軟件含量,所以這裏暫不提及,如果實在有關心的朋友,請先彆着急,我們將在下期裏討論它。

這一階段是 Boot Loader 的主戰場。它必須將可執行的內核映像和內核啓動所需的額外數據信息從存儲介質上載入內存,這並不是件簡單的工作,因爲除了從硬盤載入,可能還會需要從網絡引導服務器這樣的外部介質上載入。各種紛繁蕪雜的文件系統類型也給載入帶來了巨大的挑戰。

Boot Loader 可能還需要改變CPU的運行特權級別,然後就可以讓內核投入運行了。

除此之外, Boot Loader 還要完成一些其它功能,比如從BIOS中獲取系統信息,或者從啓動時的命令行參數中提取信息等。有的 Boot Loader 還要扮演引導選擇工具的角色,方便用戶選擇不同的操作系統。
Boot Loader的職責:
l         判斷到底要載入什麼,這可以要求用戶進行選擇
l         載入內核和它可能需要用到的相關數據,比如initrd或者其它參數
l         爲內核準備好運行環境,比如,讓CPU進入特權模式

l         讓內核投入運行

Boot Loader的歷史變遷:

早期的Linux只支持軟盤引導扇區和 Shoelace 兩種 Boot Loader。 Shoelace 是從Minix繼承下來的、文件系統相關的 Boot Loader。它只支持 Minix 文件系統。當時Linux只使用 Minix 一種文件系統,所以這樣做並沒什麼問題。可是, Minix 文件系統存在不能保存創建、修改和訪問時間信息;文件名長度限制在14個字節等問題。隨着Linux的發展,這些與傳統Unix文件系統大相徑庭的缺陷越來越讓人難以忍受,它已經不適合作爲Linux的主要文件系統了。

爲了支持其它文件系統的實現,Linux引入了VFS(虛擬文件系統)。這個舉措很快就引起了熱烈的反響,一大批新的文件系統實現出現了。其中一個 Minix 文件系統的變體,擴展文件系統 Xiafs (根據它的作者命名)突破了 Minix 文件系統的文件名長度限制,將此長度一舉提高到全部30個字符。當時文件系統之間的競爭着實激烈,很難看出誰會勝出,甚至搞不清楚會不會有一個最終的“贏家”。

儘管不確定性很大,但是有一點卻是清楚的:不管最後哪種文件系統會受到青睞,但是除了 Minix 作爲根文件系統,誰也不能從硬盤上啓動,因爲Shoelace只支持Minix文件系統。LILO應運而生了。由於支持多種文件系統(當時內核支持的主流文件系統已經有 Minix ,擴展文件系統 ext ,Xiafs 。還有人在移植 BSD 的 FFS ,根本看不出來什麼時候是個盡頭)在實現和維護上難度太大,而 Boot Loader 也不應該成爲人們試驗新的文件系統的絆腳石,所以LILO採取了和文件系統無關的設計。

這種設計經受住了時間的考驗,被證明是非常成功的。即使在今天,LILO仍舊可以從內核支持的絕大部分文件系統的硬盤上啓動。但是,由於ext2歷經了這麼長的時間一直沒有大的演變,成爲了事實上的標準,所以跟文件系統相關的Boot Loader又漸漸流行了起來。

儘管ext2已經能滿足大部分人的日常需要,但是文件系統的設計者們還是在研製以日誌機制爲特徵的新的文件系統,並且已經取得了相當大的進展。考慮到當前又有可能出現多種文件系統的實現同時並存的情況,因此對與文件系統無關的Boot Loader的需求可能會再次變得強勁。

初始化基本的操作環境

一旦內核開始運行,它會初始化內部的數據結構,檢測硬件,並且激活相應的驅動程序,爲應用軟件的準備運行環境。期間包含一個重要操作——應用軟件的運行環境必須要有一個文件系統,所以內核必須首先裝載root文件系統。由於我們的目的是介紹基本流程,所以相關的硬件初始化細節就不再討論,相關內容在下一期雜誌中會有詳細介紹。

硬件初始化完成後,內核着手創建第一個進程——初始進程。說是創建, 其實也不盡然,該進程其實是整個硬件上電初始化過程的延續,只不過執行到這裏,進程的邏輯已經完備,所以我們就按照進程的創建方式給它進行了“規格化” ——我們把這個初始進程也叫做“硬件進程”,它會佔據進程描述符表的第一個位置,所以可以用task[0][k1] 或INIT_TASK表示。該進程進而會再創建一個新進程去執行init()函數,其實,這個新進程纔是系統第一個實際有用的進程,它會負責接着執行下一個階段的初始化操作; 而初始進程(INIT_TASK)自己則會開始執行idle循環,也就是說,內核初始化完成之後,初始進程唯一的任務就是在沒有任何其它進程需要執行的時候, 消耗空閒的CPU時 間(因此初始進程也被稱爲idle進程)。

下一階段的初始化工作要比前一階段輕鬆一點,因爲現在是由一個真正進程來接手負責完成它們了,而前一階段都是由“硬件進程”手工去做的。在此階段,這個由INIT_TASK創建的新進程需要初始化總線、網絡並啓動系統中的各種系統內核後臺線程,然後再初始化外設、設置文件格式,在這之後,它要爲進入系統做最後的準備——初始化文件系統,安裝root文件系統,打開/dev/console


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章