引導 Linux? 系統(tǒng)的過程包括很多階段。不管您是引導一個標準的 x86 桌面系統(tǒng),還是引導一臺嵌入式的 PowerPC? 機器,很多流程都驚人地相似。本文將探索 Linux 的引導過程,從最初的引導到啟動第一個用戶空間應用程序。在本文介紹的過程中,您將學習到各種與引導有關的主題,例如引導加載程序、內(nèi)核解壓、初始 RAM 磁盤以及 Linux 引導的其他一些元素。 早期時,啟動一臺計算機意味著要給計算機喂一條包含引導程序的紙帶,或者手工使用前端面板地址/數(shù)據(jù)/控制開關來加載引導程序。盡管目前的計算機已經(jīng)裝備了很多工具來簡化引導過程,但是這一切并沒有對整個過程進行必要的簡化。 讓我們先從高級的視角來查看 Linux 引導過程,這樣就可以看到整個過程的全貌了。然后將回顧一下在各個步驟到底發(fā)生了什么。在整個過程中,參考一下內(nèi)核源代碼可以幫助我們更好地了解內(nèi)核源代碼樹,并在以后對其進行深入分析。 圖 1 是我們在 20,000 英尺的高度看到的視圖。 圖 1. Linux 引導過程在 20,000 英尺處的視圖 ![]() 當系統(tǒng)首次引導時,或系統(tǒng)被重置時,處理器會執(zhí)行一個位于已知位置處的代碼。在個人計算機(PC)中,這個位置在基本輸入/輸出系統(tǒng)(BIOS)中,它保存在主板上的閃存中。嵌入式系統(tǒng)中的中央處理單元(CPU)會調(diào)用這個重置向量來啟動一個位于閃存/ROM 中的已知地址處的程序。在這兩種情況下,結果都是相同的。因為 PC 提供了很多靈活性,BIOS 必須確定要使用哪個設備來引導系統(tǒng)。稍后我們將詳細介紹這個過程。 當找到一個引導設備之后,第一階段的引導加載程序就被裝入 RAM 并執(zhí)行。這個引導加載程序在大小上小于 512 字節(jié)(一個扇區(qū)),其作用是加載第二階段的引導加載程序。 當?shù)诙A段的引導加載程序被裝入 RAM 并執(zhí)行時,通常會顯示一個動畫屏幕,并將 Linux 和一個可選的初始 RAM 磁盤(臨時根文件系統(tǒng))加載到內(nèi)存中。在加載映像時,第二階段的引導加載程序就會將控制權交給內(nèi)核映像,然后內(nèi)核就可以進行解壓和初始化了。在這個階段中,第二階段的引導加載程序會檢測系統(tǒng)硬件、枚舉系統(tǒng)鏈接的硬件設備、掛載根設備,然后加載必要的內(nèi)核模塊。完成這些操作之后啟動第一個用戶空間程序( 這就是 Linux 引導的整個過程?,F(xiàn)在讓我們深入挖掘一下這個過程,并深入研究一下 Linux 引導過程的一些詳細信息。
系統(tǒng)啟動階段依賴于引導 Linux 系統(tǒng)上的硬件。在嵌入式平臺中,當系統(tǒng)加電或重置時,會使用一個啟動環(huán)境。這方面的例子包括 U-Boot、RedBoot 和 Lucent 的 MicroMonitor。嵌入式平臺通常都是與引導監(jiān)視器搭配銷售的。這些程序位于目標硬件上的閃存中的某一段特殊區(qū)域,它們提供了將 Linux 內(nèi)核映像下載到閃存并繼續(xù)執(zhí)行的方法。除了可以存儲并引導 Linux 映像之外,這些引導監(jiān)視器還執(zhí)行一定級別的系統(tǒng)測試和硬件初始化過程。在嵌入式平臺中,這些引導監(jiān)視器通常會涉及第一階段和第二階段的引導加載程序。
在 PC 中,引導 Linux 是從 BIOS 中的地址 0xFFFF0 處開始的。BIOS 的第一個步驟是加電自檢(POST)。POST 的工作是對硬件進行檢測。BIOS 的第二個步驟是進行本地設備的枚舉和初始化。 給定 BIOS 功能的不同用法之后,BIOS 由兩部分組成:POST 代碼和運行時服務。當 POST 完成之后,它被從內(nèi)存中清理了出來,但是 BIOS 運行時服務依然保留在內(nèi)存中,目標操作系統(tǒng)可以使用這些服務。 要引導一個操作系統(tǒng),BIOS 運行時會按照 CMOS 的設置定義的順序來搜索處于活動狀態(tài)并且可以引導的設備。引導設備可以是軟盤、CD-ROM、硬盤上的某個分區(qū)、網(wǎng)絡上的某個設備,甚至是 USB 閃存。 通常,Linux 都是從硬盤上引導的,其中主引導記錄(MBR)中包含主引導加載程序。MBR 是一個 512 字節(jié)大小的扇區(qū),位于磁盤上的第一個扇區(qū)中(0 道 0 柱面 1 扇區(qū))。當 MBR 被加載到 RAM 中之后,BIOS 就會將控制權交給 MBR。
MBR 中的主引導加載程序是一個 512 字節(jié)大小的映像,其中包含程序代碼和一個小分區(qū)表(參見圖 2)。前 446 個字節(jié)是主引導加載程序,其中包含可執(zhí)行代碼和錯誤消息文本。接下來的 64 個字節(jié)是分區(qū)表,其中包含 4 個分區(qū)的記錄(每個記錄的大小是 16 個字節(jié))。MBR 以兩個特殊數(shù)字的字節(jié)(0xAA55)結束。這個數(shù)字會用來進行 MBR 的有效性檢查。 圖 2. MBR 剖析 ![]() 主引導加載程序的工作是查找并加載次引導加載程序(第二階段)。它是通過在分區(qū)表中查找一個活動分區(qū)來實現(xiàn)這種功能的。當找到一個活動分區(qū)時,它會掃描分區(qū)表中的其他分區(qū),以確保它們都不是活動的。當這個過程驗證完成之后,就將活動分區(qū)的引導記錄從這個設備中讀入 RAM 中并執(zhí)行它。
次引導加載程序(第二階段引導加載程序)可以更形象地稱為內(nèi)核加載程序。這個階段的任務是加載 Linux 內(nèi)核和可選的初始 RAM 磁盤。
在 x86 PC 環(huán)境中,第一階段和第二階段的引導加載程序一起稱為 Linux Loader(LILO)或 GRand Unified Bootloader(GRUB)。由于 LILO 有一些缺點,而 GRUB 克服了這些缺點,因此下面讓我們就來看一下 GRUB。(有關 GRUB、LILO 和相關主題的更多內(nèi)容,請參閱本文后面的 參考資料 部分的內(nèi)容。) 關于 GRUB,很好的一件事情是它包含了有關 Linux 文件系統(tǒng)的知識。GRUB 不像 LILO 一樣使用裸扇區(qū),而是可以從 ext2 或 ext3 文件系統(tǒng)中加載 Linux 內(nèi)核。它是通過將兩階段的引導加載程序轉(zhuǎn)換成三階段的引導加載程序來實現(xiàn)這項功能的。階段 1 (MBR)引導了一個階段 1.5 的引導加載程序,它可以理解包含 Linux 內(nèi)核映像的特殊文件系統(tǒng)。這方面的例子包括 當階段 2 加載之后,GRUB 就可以在請求時顯示可用內(nèi)核列表(在 將第二階段的引導加載程序加載到內(nèi)存中之后,就可以對文件系統(tǒng)進行查詢了,并將默認的內(nèi)核映像和
當內(nèi)核映像被加載到內(nèi)存中,并且階段 2 的引導加載程序釋放控制權之后,內(nèi)核階段就開始了。內(nèi)核映像并不是一個可執(zhí)行的內(nèi)核,而是一個壓縮過的內(nèi)核映像。通常它是一個 zImage(壓縮映像,小于 512KB)或一個 bzImage(較大的壓縮映像,大于 512KB),它是提前使用 zlib 進行壓縮過的。在這個內(nèi)核映像前面是一個例程,它實現(xiàn)少量硬件設置,并對內(nèi)核映像中包含的內(nèi)核進行解壓,然后將其放入高端內(nèi)存中,如果有初始 RAM 磁盤映像,就會將它移動到內(nèi)存中,并標明以后使用。然后該例程會調(diào)用內(nèi)核,并開始啟動內(nèi)核引導的過程。 當 bzImage(用于 i386 映像)被調(diào)用時,我們從 在這個新的 圖 3. Linux 內(nèi)核 i386 引導的主要函數(shù)流程 ![]() 通過調(diào)用 在內(nèi)核引導過程中,初始 RAM 磁盤(
當內(nèi)核被引導并進行初始化之后,內(nèi)核就可以啟動自己的第一個用戶空間應用程序了。這是第一個調(diào)用的使用標準 C 庫編譯的程序。在此之前,還沒有執(zhí)行任何標準的 C 應用程序。 在桌面 Linux 系統(tǒng)上,第一個啟動的程序通常是
與 Linux 本身非常類似,Linux 的引導過程也非常靈活,可以支持眾多的處理器和硬件平臺。最初,加載引導加載程序提供了一種簡單的方法,不用任何花架子就可以引導 Linux。LILO 引導加載程序?qū)σ龑芰M行了擴充,但是它卻缺少文件系統(tǒng)的感知能力。最新一代的引導加載程序,例如 GRUB,允許 Linux 從一些文件系統(tǒng)(從 Minix 到 Reise)上進行引導。
學習
獲得產(chǎn)品和技術
|
|