1. 程式人生 > >Linux開機過程

Linux開機過程

相關內容

開機過程

  開機過程指的是從按下電源鍵開始,到進入系統登入畫面前所經歷的過程。

MBR與磁碟分割槽

  在目前x86的系統架構中,系統硬碟位於第0號磁軌:0到511KB的區塊為MBR(硬碟中的每一個磁軌容量為512KB),開機管理程式使用這塊區域來儲存第一階段開機載入程式(stage1)。接著位於1到62號磁軌作為第1.5階段的開機載入程式(stage1.5),從第63號磁軌開始才是作業系統的分割槽。

  主引導記錄(MBR,Master Boot Record)是位於磁碟最前邊的一段引導(Loader)程式碼。它負責磁碟作業系統(DOS)對磁碟進行讀寫時分割槽合法性的判別、分割槽引導資訊的定位,它由磁碟作業系統(DOS)在對硬碟進行初始化時產生。

  MBR的內容分為三部分:第一部分是0到445KB,是計算機的基礎導引程式,也稱為第一階段的導引程式;接著446KB到509KB為磁碟分割槽表,由四個分割槽表項構成(每個16個位元組)。負責說明磁碟上的分割槽情況。內容包括分割槽標記、分割槽的起始位置、分割槽的容量以及分割槽的型別。最後一部分為結束標誌只佔2KB,其值為AA55,儲存時低位在前,高位在後。

從百度百科借了張圖:

 

 

MBR中緊跟在主載入程式後的主分割槽表這64位元組(01BE~01FD)中包含了許多磁碟分割槽描述資訊,尤其是01BE~01CD這16位元組,包含了分割槽引導標誌bootid、分割槽起始源頭beghead、分割槽起始扇區relsect、分割槽起始柱面begcy1、作業系統型別systid、分割槽結尾磁頭endhead、分割槽結尾扇區begsect、分割槽結尾柱面begcy1、分割槽扇區起始位置relsect、分割槽扇區總數numsect。

其中分割槽引導標誌bootid表示當前分割槽是否可以引導,若為0x0,則表示該分割槽為非活動區;若為0x80,則為可開機啟動區。若有多個開機啟動區,則由使用者開機時的選擇而定(如GRUB的選單)。

分割槽扇區起始位置relsect表示分割槽中第一個扇區相對於磁碟起始點的偏移位置。

開機管理程式

linux上的開機管理程式有LiLO和GRUB,前者是早期的產物,在近年來的Linux作業系統都以GRUB作為預設軟體包。

GNU GRUB(GRand Unified Bootloader簡稱“GRUB”)是一個來自GNU專案的多作業系統啟動程式。GRUB是多啟動規範的實現,它允許使用者可以在計算機內同時擁有多個作業系統,並在計算機啟動時選擇希望執行的作業系統。GRUB可用於選擇作業系統分割槽上的不同核心,也可用於向這些核心傳遞啟動引數。

執行層級

執行層級(run level)共有7個,分別為0、1、2、3、4、5、6,其中0表示關機、1表示單人模式、6表示重新啟動。中間的2、3、4、5因Linux發行商而異。

過程解析

 從按下電源開始到登入畫面中所有的過程。

 登入程式依序分為BIOS、GRUB、核心載入、與init程式四個步驟。

BIOS

當按下電源按鈕後,系統就會執行BIOS檢測,包含檢查系統的硬體配置、執行系統診斷程式、找出系統硬碟,把第0號磁軌中的開機導引程式載入到記憶體中,之後就由GRUB接手後續的開機程式。

GRUB

GRUB是一個較大的程式,本身容量超過MBR的限制(512KB),因此GRUB將開機程式分割為stage1、stage2,並在1與2之中加上選用的程式stage1.5,如e2fs_stage1_5、fat_stage1_5等。

由BIOS接手後的GRUB,會由stage1轉接到stage2(或stage1.5),並找出和載入位於/boot的核心檔案。核心檔案位於/boot之下。

接著會將記憶體映像檔案(.img)載入到記憶體中,並使用cpio命令將內容解壓縮到/boot之下。如果硬體的功能都別編入核心中,這個動作是不需要的;但若編譯為模組且必須在開機時載入,這個步驟就是必要的。

將核心與必要的映像檔案載入後,系統開機的過程就交給核心處理了。

核心載入

 核心接手系統開機的程式之後,會進行初始化,包括檢測硬體、設定硬體裝置、時鐘設定、載入模組等,這動作完成後會釋放出曾佔用的記憶體空間。

 接著啟動檔案系統相關的設定,首先會掛接根目錄(“/”),再讀取分割槽表(/etc/fstab)並掛接所有的分割槽與啟動SWAP。最後系統啟動/sbin/init程式,並執行硬體與軟體相關的系統常駐程式。

 核心在開機的作用到此告一段落。

init程式

Init是系統的第一個程序,因此PID為0,也是所有程序的父程序,init啟動後會先執行etc/rc.d/rc.sysinit,並讀取配置檔案/etc/inittab中的設定

 init的具體內容可參考:

https://blog.csdn.net/u012206617/article/details/93088996