天天看點

CentOS6開機啟動流程CentOS 6開機啟動流程

CentOS 6開機啟動流程

[!] 表示注釋,詳細資訊請到文檔末尾檢視

宏觀上:

BIOS自檢——>系統引導——>啟動核心——init程序

BOIS

對于個人計算機,Linux從0xffff0位址的BIOS開始啟動。BIOS的第一步是上電自檢(POST)。上電自檢的工作是檢查硬體。第二步是枚舉和初始化本地裝置。

​ 鑒于BIOS的不同用途,BIOS主要有兩部分組成:上電自檢代碼和運作服務。

​ 在上電自檢完成後,上電自檢代碼從記憶體被清除,但是運作服務被保留并且對目标作業系統任然有效。

​ 要引導一個作業系統,BIOS運作時會按照CMOS的設定定義的順序來搜尋處于活動狀态并且可以引導的裝置。引導裝置可以為軟碟,CD-ROM,硬碟的分區,網絡上的裝置以及U盤

​ .Linux一般從MBR[!1]包含初級引導程式的硬碟啟動。MBR是一個512位元組的扇區,為于硬碟的第一個扇區。在MBR被加載到RAM中後,由BIOS去控制它。

系統引導

  1. 第一階段引導程式————MBR系統引導

初級引導程式位于512位元組的MBR鏡像,MBR鏡像有一個小型分區表和代碼組成。前446位元組是初級引導程式代碼,包括執行代碼和錯誤資訊。接下來的64位元組但是一個分區表,包含4個16位元組的分區記錄。MBR最後的位元組定義了一個magic數字(00xaa55)。這個magic數字用來校驗檢查MBR。

初級引導程式主要就是找到并且加載第二階段引導程式。其通過分區表尋找一個活的動的分區并将其 啟動記錄加載到RAM中執行。

  1. 第二階段引導程式————核心引導程式

    任務就是加載Linux核心和可選的初始磁盤

    在x86環境中,第一階段和第二階段引導程式結合一起叫做Linux引導程式LILO或者GRand Unified BootLoader 簡寫GRUB。我們重點介紹一下GRUB引導流程。

    GRUB

    在系統自檢通過後,就會加載磁盤上的MBR,并将控制權交給MBR中的程式(stage1),stage1執行,判斷自己是否GRUB,如果是且配置了stage1_5,則加載stage1_5,否則就轉去加載啟動扇區,接着,stage2被加載并執行,由stage2借助stage1_5驅動檔案系統,并查找grub.conf,顯示啟動菜單供使用者選擇,然後根據使用者的選擇或預設配置加載作業系統核心,并将控制權交給作業系統核心,由核心完成作業系統的啟動,并且可以用附加的核心參數改進它。另外還能通過shell終端指令行的方式手動控制整個啟動過程。

​ 第二階段引導程式被加載進記憶體後,将查詢檔案系統,加載預設核心鏡像和initrd鏡像到記憶體。當所有鏡像準備好後,将從第二階段跳轉到核心鏡像。

核心

​ 随着核心鏡像加載到記憶體并且從第二階段引導程式獲得控制權,核心階段開始了。核心鏡像不是一個可以執行的核心,而是一個被壓縮的核心鏡像。通常是用zlib工具壓縮的一個zImage(被壓縮的鏡像,小于512kb)或者一個bzImage(大的壓縮鏡像,大于512kb)。在核心鏡像的頭部有一個小型程式routine,其做少量的硬體設定,然後自解壓核心鏡像并放到高端記憶體。如果存在初始磁盤鏡像(initrd),routine将拷貝initrd以供稍後安裝使用。然後routine将調用核心開始核心啟動。

​ 當bzImage(i1386的鏡像)被調用,将從彙程式設計式“./arch/i386/boot/head.S”的start入口開始。這段程式做些基本的硬體設定然後調用“./arch/i386/boot/compressed/head.S”中的startup_32。startup_32設定一些基本的環境(如堆棧等),并且清除BBS(Block Started by Symbol - 以符号啟始的區塊)。然後調用一個c函數decompress_kernel(位于./arch/i386/boot/compressed/misc.c)解壓核心鏡像。當核心被解壓到記憶體後,将調用另一個位于“./arch/i386/kernel/head.S”的startup_32函數。

​ 在這個新的startup_32函數(也叫清除程式或者程序0)中,會對頁表進行初始化,并啟用記憶體分頁功能。然後會為任何可選的浮點單元(FPU)檢測 CPU 的類型,并将其存儲起來供以後使用。然後調用 start_kernel 函數(在 init/main.c 中),它會将您帶入與體系結構無關的 Linux 核心部分。從本質上講,這才是Linux核心的主要功能。

​ 調用start_kernel函數之後,會調用一系列初始化函數來設定中斷,執行進一步的記憶體配置,并加載初始RAM磁盤。最後将掉用kernel_thread(在arch/i386/kernel/process.c中)啟動一個init函數,init函數是使用者控件的第一個程序。最後,空閑程序将會開始執行并且程序排程器将獲得控制權(當cpu調用cpu_idle後)。通過啟用中斷,搶占式的排程器就可以周期性地接管控制權,進而提供多任務處理能力。

在核心引導過程中,初始 RAM 磁盤(initrd)是由第 2 階段引導程式加載到記憶體中的,它會被複制到 RAM 中并挂載到系統上。這個 initrd作為 RAM 中的臨時根檔案系統使用,并允許核心在沒有挂載任何實體磁盤的情況下完整地實作引導。由于與外圍裝置進行互動所需要的子產品可是 initrd 的一部分,是以核心可以非常小,但是仍然支援大量可能的硬體配置。在核心啟動後,就可以正式裝備根檔案系統了(通過 pivot_root),此時會将 initrd 根檔案系統解除安裝掉,并挂載真正的根檔案系統。

initrd 函數讓我們可以建立一個小型的 Linux 核心,其中包括作為可加載子產品編譯的驅動程式。這些可加載的子產品為核心提供了通路磁盤和磁盤上的檔案系統的方法,并為其他硬體提供了驅動程式。由于根檔案系統是磁盤上的一個檔案系統,是以 initrd 函數會提供一種啟動方法來獲得對磁盤的通路,并挂載真正的根檔案系統。在沒有硬碟的嵌入式目标中,initrd 可以是最終的根檔案系統,或者也可以通過網絡檔案系統(NFS)來挂載最終的根檔案系統。

init程序

​ 在核心被啟動并初始化後,核心啟動第一個使用者空間應用程式。這是調用的第一個使用标準 C 庫編譯的程式。在此程序之前,還沒有執行任何标準的 C 應用程式。

注釋:

一、MBR

MBR:Main Boot Record 主引導記錄,通常稱為主引導扇區。因為該扇區中,引導代碼占有絕大部分的空間,故而習慣将該扇區稱為MBR扇區。

​ 主引導扇區有三部分組成(共占用512個位元組):

  1. 主引導程式 即主引導記錄 (占用446個位元組)

    可在FDISK程式中找到,他用于磁盤啟動時将系統控制轉給使用者指定的并在分區表中登記了的某個作業系統。

    1. 磁盤分區表 (DPT,Disk Partition Table)

      有四個分區表項構成(每個16個位元組)

    2. 結束标志(占2個位元組)

      其值為AA55,存儲是地位在前,高位在後,即看上去是55AA(十六進制)

二、GRUB重要檔案

  1. stage1:它被安裝在MBR扇區(0面0磁道的第一扇區),大小為512位元組(446位元組代碼+64位元組的分區表+2位元組标志55AA),負責加載存在于0面0道第2扇區的start程式。
  2. stage1_5:stage1_5負責識别檔案系統和加載stage2,是以stage1_5往往有多個,以支援不同檔案系統的讀取。在安裝GRUB的時候,GRUB會根據目前/boot/分區類型,加載響應的stage1_5到0面0磁道的第3扇區。stage1_5是由start加載的。
  3. stage2:他負責顯示啟動菜單和提供使用者互動接口,并根據使用者選擇或預設配置加載作業系統核心。同前兩個檔案步同。stage2是存放在磁盤上/boot/grub下。
  4. menu.lst:/boot/grub/grub.conf的連接配接。grub.conf是一個基于腳本的文本檔案,其中包含菜單顯示的配置和各個作業系統的核心加載配置。GRUB正式根據使用者選擇或預設配置和grub.conf的核心配置加載相應的齧合程式,并把控制權交個核心程式,是的核心程式完成真正的作業系統的啟動。

Linux 引導方式 1. LILO

​ 2. GRUB