計算機啟動原理
- 啟動流程概述
- BIOS
- BIOS 執行流程
- UEFI 與 BIOS
- MBR
- GPT
- BootLoader
- GRUB 引導核心的過程
- Linux Kernel 加載
- 啟動流程圖
- CentOS 6.x 系統啟動過程
- 其他
- 參考
啟動流程概述
- 開機加電;
- CPU 跳轉到 BIOS 指令的的實體位址(在 Intel 平台為 0XFFFF0);
- BIOS 執行 POST(Power-On Self Test,硬體自檢);
- 找到可啟動的裝置;
- 從 MBR 加載引導扇區;
- BIOS 将控制權移交給作業系統的 Boot Loader(引導加載程式)。
BIOS
BIOS(Basic Input/Output System)是基本輸入輸出系統,它為電腦提供最低級、最直接的硬體控制與支援,是聯系底層的硬體系統和軟體系統的橋梁。為了在關機後使 BIOS 不會丢失,早期的 BIOS 存儲在 ROM(Read-Only Memory)中,并且其大小不會超過 64KB;目前的 BIOS 大多有 1MB 到 2MB,是以會被存儲在 閃存(Flash Memory)中。
BIOS 是一組固化到計算機主機闆上一個 ROM 晶片中的程式,它儲存着計算機最重要的基本輸入輸出的程式、開機後自檢程式和系統自啟動程式,它可從 CMOS(一種 RAM 晶片)中讀寫系統設定的具體資訊。
BIOS 通常與 硬體系統內建在一起(在計算機主機闆的 ROM 或 EEPROM 中),是以也被稱為固件。
BIOS 執行流程
BIOS 存放在 ROM 中,是以斷電後不會丢失。電腦開機時,CPU 加電後會跳轉到 BIOS 的第一條指令的實體位址 0xFFFF0 上,BIOS 開始執行。
- 第一次啟動檢查計算機硬體和外圍裝置(第二次自檢由核心完成),例如 CPU、記憶體、風扇燈。當 BIOS 啟動,就會做一個自我檢測的工作,自檢過程被稱為 POST(Power On Self Test);
- 如果自檢沒有問題,BIOS 開始對硬體進行初始化,并規定目前可啟動裝置的先後順序,選擇由哪個裝置來開機。選擇好開機裝置後,就會從該裝置的 MBR(主引導目錄)中讀取 Boot Loader(啟動引導程式)并執行。啟動引導程式用于引導作業系統啟動(例如 GRUB)。
當 MBR 被加載到 RAM 之後,BIOS 就會将控制權交給 MBR,進入系統引導的第二階段。
- 硬體自檢(Power-On Self Test,POST)
如果硬體出現問題,主機闆會發出蜂鳴,終止啟動;否則檢查沒有問題,則 BIOS 調用 GPU 在螢幕上顯示出 CPU、記憶體、硬碟等相關資訊。BIOS 在執行完硬體自檢和初始化後,将自己複制到從 0xA0000 開始的實體記憶體中繼續執行。
UEFI 與 BIOS
BIOS 存在一些問題:
- 開發效率低:BIOS 使用彙編語言開發,開發效率較低,代碼與硬體密切相關,耦合性高,難以移植;
- 性能較低:BIOS 基本輸出/輸出服務需要通過中斷完成,導緻開銷,且 BIOS 沒有提供異步工作模式,将在等待時消耗時間;
- 功能擴充性差:BIOS 代碼采用靜态連結,需要增加硬體功能時,必須将 16 位代碼放置在 0x0C0000~0x0DFFFF 位址,初始化時将其設定為約定的中斷處理程式。而且 BIOS 沒有提供動态加載裝置驅動的方案;
- 安全性:BIOS 運作過程沒有考慮任何安全性;
- 不支援從硬碟 2T 容量以上的位址引導,受限于 BIOS 的尋址方式,BIOS 硬碟采用 32 位位址,那麼引導扇區的最大邏輯位址是 2^32,約為
。2^32 * 512 = 2T
為了解決 BIOS 的問題,UEFI 産生了。
UEFI(Unified Extensible Firmware Interface)是統一可擴充固件接口,它是一種個人電腦規格,用來定義作業系統與系統固件之間的軟體接口,作為 BIOS 的替代方案,UEFI 負責加電自檢(POST),聯系作業系統以及提供連接配接作業系統與硬體的接口。
EFI 引導管理者與 EFI drivers 的溝通方式(圖檔來自維基百科):

UEFI 優于 BIOS 的幾個特點:
- EFI 是使用子產品化、C 語言風格的參數堆棧傳遞方式以及動态連結的形式建構的系統,相對于 BIOS 而言更容易實作,同時具有更強的容錯性,降低開發時間;
- 運作于 32 位或 64 位模式,面對未來的增強處理器模式下,能夠突破 BIOS 16 位代碼的尋址能力,達到處理器最大尋址;
- UEFI 具有良好的滑鼠操控圖形和界面,開機速度也優于 BIOS。
BIOS 啟動過程:
UEFI 過程:
MBR
MBR(Master Boot Record)是主引導記錄或者開機記錄,是一個 512 byte 的扇區,位于磁盤的固定位置。
MBR 存在于硬碟驅動器最開始部分的一個特殊扇區,這個扇區包含已安裝的作業系統啟動記錄器和驅動器的邏輯分區資訊。BIOS 完成 POST 和初始化後,會根據 CMOS 中設定的啟動順序選擇引導的裝置,裝置可以是 U 盤或硬碟。如果為硬碟,則 BIOS 就會讀取 MBR,MBR 中包含了一段引導程式,一個分區表和 Magic Number。
MBR 結構圖:
标準 MBR 結構描述:
位址 | 描述 | 長度(位元組) |
---|---|---|
0000 | 代碼區 | 440(最大 460) |
01B8 | 磁盤标志 | 4 |
01BC | 一般為空值;0x0000 | 2 |
01BE | 标準 MBR 分區表規劃(4 個主分區表入口) | 64 |
01FE | MBR 有效标志(Magic Number):0x55FA | 2 |
MBR,總大小:
446 + 64 + 2 = 512 byte
分區表的長度為 64 byte,共有 4 項,每個 16 byte,那麼一個硬碟隻能分為 4 個一級分區。
每個分區表項結構描述如下:
偏移 | 長度(位元組) | 描述 |
---|---|---|
00H | 1 | 分區狀态:00 非活動分區;80 活動分區;其他無意義 |
01H | 1 | 分區起始磁頭号(HEAD),用到全部 8 位 |
02H | 2 | 分區起始扇區号(SECTOR),占據 02H 的 0-5 位;該分區的起始磁柱号(CYLINDER),占據 02H 的 6-7 位和 03H 的全部 8 位 |
04H | 1 | 檔案系統标志位 |
05H | 1 | 分區結束磁頭号(HEAD),用到全部8位 |
06H | 2 | 分區結束扇區号(SECTOR),占據 06H 的 0-5 位;該分區的結束磁柱号(CYLINDER),占據 06H 的 6-7 位和 07H 的全部 8 位 |
08H | 4 | 分區起始相對扇區号 |
0CH | 4 | 分區總的扇區數 |
在分出主分區後,其他部分可分為擴充分區,或者不分,擴充分區必須再分成若幹邏輯分區後才能使用,所有的邏輯分區都是擴充分區。
硬碟基本結構:
GPT
GPT(GUID Partition Table)是全局唯一辨別分區表,它是一個實體硬碟的分區表的結構布局的标準。它是 UEFI(可擴充固件接口)标準的一部分,被用于替代 BIOS 系統中的存儲邏輯塊位址和大小資訊的主引導記錄(MBR)分區表。對于那些扇區為512 byte 的磁盤,MBR 分區表不支援容量大于 2.2TB(2.2×1012 byte)的分區。
BootLoader
下圖為 Linux 系統普通模式下的啟動過程:
Boot Loader(啟動引導加載程式)又叫做作業系統核心加載器(OS Kernel Loader),一個在作業系統核心運作前運作的一段小程式,通過這段小程式可以初始化硬體裝置,建立記憶體空間的映射,将系統軟硬體環境帶到一個合适的狀态,以便為最終調用作業系統核心準備好正确的環境。通常,Boot Loader 是嚴重地依賴于硬體而實作的,特别是在嵌入式世界。是以,在嵌入式世界裡建立一個通用的 Boot Loader 幾乎是不可能的。
啟動引導程式擁有以下功能:
- 加載作業系統的核心。這是啟動引導程式最主要的功能;
- 擁有一個可以讓使用者選擇的菜單,來選擇到底啟動哪個系統。如果安裝過雙 Windows 系統,就可以看到類似的選擇菜單,不過這個選擇菜單是由 Windows 的啟動引導程式提供的,不是 GRUB;
- 可以調用其他的啟動引導程式,這是多系統啟動的關鍵。需要注意的是,Windows 的啟動引導程式不能調用 Linux 的啟動引導程式,是以一般建議先安裝 Windows,後安裝 Linux,是為了将 Linux 的啟動引導程式安裝到 MBR 中,覆寫 Windows 的啟動引導程式。
Lniux 下的 Boot Loader 程式常見有兩種:LILO 和 GNU GRUB。
LILO 沒有指令互動界面,不支援網絡引導,MBR 配置錯誤将導緻系統無法引導;
GRUB 具有指令互動界面,支援網絡引導,如果 MBR 配置出現錯誤,則預設跳轉到 GRUB 指令行界面。
早期的 LILO 引導程式已經不常見了,GRUB 擁有更多優勢:
- 支援更多的檔案系統;
- GRUB 的主程式可以直接在檔案系統中查找核心檔案;
- 在系統啟動時,可以利用 GRUB 的互動界面編輯和修改啟動選項;
- 可以動态修改 GRUB 的配置檔案,這樣在修改配置檔案之後不需要重新安裝 GRUB,而隻需重新啟動就可以生效。
GRUB 引導核心的過程
按照啟動流程,BIOS 在完成自檢後,會到第一個啟動裝置的 MBR 中讀取 GRUB。在 MBR 中用來放置啟動引導程式的空間隻有 446 Byte,不足以容納 GRUB 主程式代碼,那麼 Linux 将 GRUB 的程式分為三段執行:
- Stage 1:執行 GRUB 主程式
第一階段用來執行 GRUB 主程式,主程式必須放在啟動區中(MBR 或者引導扇區中)。但是 MBR 容量有限,是以隻能安裝 GRUB 的最小的主程式,而不能安裝 GRUB 的相關配置檔案。這個主程式用來啟動 Stage 1.5 和 Stage 2。
- Stage 1.5:識别不同的檔案系統
Stage 2 比較大,隻能放在檔案系統中(分區),但是 Stage 1 不能識别不同的檔案系統,是以不能直接加載 Stage 2。這時需要先加載 Stage 1.5,由 Stage 1.5 來加載不同檔案系統中的 Stage 2。
Stage 1.5 沒有放在檔案系統中,而是在安裝 GRUB 時,直接安裝到緊跟 MBR 之後的 32KB 的空間中,這段硬碟空間是空白無用的,而且是沒有檔案系統的,是以 Stage 1 才能直接讀取 Stage 1.5。讀取了 Stage 1.5 後就能識别不同的檔案系統,才能加載 Stage 2。
- Stage 2:加載 GRUB 的配置檔案
加載 GRUB 的配置檔案 /boot/grub/grub.conf,根據配置檔案中的定義,加載核心和虛拟檔案系統。接下來核心就可以接管啟動過程,繼續自檢與加載硬體子產品了。
Linux Kernel 加載
- 根據 GRUB 設定的核心映像所在路徑,系統讀取記憶體映像,并進行解壓縮核心;
- 系統将核心解解壓至記憶體中,調用初始化函數初始化各種裝置,完成 Linux 核心環境的建立。
啟動流程圖
CentOS 6.x 系統啟動過程
- 電腦加電,加載 BIOS 資訊,BIOS 進行系統檢測。依照 BIOS 設定,找到第一個可以啟動的裝置(一般是硬碟);
- 讀取第一個啟動裝置的 MBR (主引導記錄),加載 MBR 中的 Boot Loader(啟動引導程式,常見為 GRUB);
- 依據 Boot Loader 的設定加載核心,核心會再進行一遍系統檢測。系統一般會采用核心檢測硬體的資訊,而不一定采用 BIOS 的自檢資訊。核心在檢測硬體的同時,還會通過加載動态子產品的形式加載硬體的驅動;
- 核心啟動系統的第一個程序,也就是 /sbin/init;
- 由 /sbin/init 程序調用 /etc/init/rcS.conf 配置檔案,通過這個配置檔案調用 /etc/rc.d/rc.sysinit 配置檔案。而 /etc/rc.d/rc.sysinit 配置檔案是用來進行系統初始化的,主要用于配置計算機的初始環境;
- 還是通過 /etc/init/rcS.conf 配置檔案調用 /etc/inittab 配置檔案。通過 /etc/inittab 配置檔案來确定系統的預設運作級别;
- 确定預設運作級别後,調用 /etc/init/rc.conf 配置檔案;
- 通過 /etc/init/rc.conf 配置檔案調用并執行 /etc/rc.d/rc 腳本,并傳入運作級别參數;
- /etc/rc.d/rc 确定傳入的運作級别,然後運作相應的運作級别目錄 /etc/rc[0-6].d/ 中的腳本;
- /etc/rc[0-6].d/ 目錄中的腳本依據設定好的優先級依次啟動和關閉;
- 最後執行 /etc/rc.d/rc.local 中的程式;
- 如果是字元界面啟動,就可以看到登入界面了。如果是圖形界面啟動,就會調用相應的 X Window 接口;
其他
Android 裝置啟動過程
Android 裝置與 PC 的硬體差異較大,雖然啟動過程不相同,但是過程類似。
Android 裝置通用啟動流程圖:
參考
- https://www.cnblogs.com/adamwong/p/10582183.html
- http://c.biancheng.net/linux_tutorial/