BIOS、UEFI、Boot Loader都是些什么
什么是BIOS
Basic Input Output System(基本輸入輸出系統)其實就是一組保存着計算機最重要的基本輸入輸出的程序、開機后自檢程序、系統自啟動程序,並固化到計算機內主板上的一個ROM芯片上的程序。
基本的輸入輸出是什么
BIOS的終極目標:
“BIOS的最主要的功能:初始化硬件平台和提供硬件的軟件抽象,引導操作系統啟動。”
所以:
輸入的是:硬件平台的信息
輸出的是:硬件的軟件抽象
然后將引導文件加載至內存引導操作系統啟動
自檢程序“檢”了什么

每個硬件平台都需要發現IO總線,因為數據的傳輸離不開總線。
所謂的系統自檢,就是Power On Self Test,也就是圖中的POST過程。在傳統BIOS的上電階段,通過IO枚舉發現總線,進入到標准描述的平台接口部分。
系統自啟動了什么

自啟動了操作系統呀~畢竟按下電源只是啟動了BIOS程序。
此外,在傳統BIOS程序中,還不支持文件系統,不像上圖的Dell主板,可以手動的添加引導文件,在傳統BIOS啟動之后,BIOS會自動加載MBR的主引導記錄,使操作系統“自行啟動”
所以我們再看什么是BIOS?

輸入:圍繞上圖進行展開,左邊部分剛好是硬件的初始化:CPU初始化、內存初始化……相當於是上面說的,輸入的硬件平台信息。
自檢:再經過中間部分的系統自檢,控制台初始化、設備初始化、通過枚舉發現總線並初始化。
輸出&自啟動:選擇引導設備之后,通過BIOS將硬件平台的軟件接口提供給OS Loader,以供操作系統運行使用。
BIOS的脈絡就稍微有一些清楚了吧。
什么是UEFI BIOS
Unified Extensible Firmware Interface(統一可擴展固件接口)
由於安藤處理器芯片組的創新,64位架構的處理器已經不再適用傳統BIOS的16位運行模式,英特爾將系統固件和操作系統之間的接口完全重新定義為一個可擴展的,標准化的固件接口規范。
UEFI名字聽起來和BIOS相差較大,但是作為業界的新BIOS——UEFI BIOS,畢竟還是BIOS,所以它的主要目標就還是——初始化硬件,提供硬件的軟件抽象,並引導操作系統啟動
UEFI和BIOS的區別

效率方面:BIOS正是因為其閉源、接口混亂才導致其最終不適用於新架構的芯片,那時候剛好趕上開源的浪潮,UEFI開源且使用規定的標准接口,通過提供接口,也將大部分代碼移步到了C代碼,大大降低了開發難度,這也是其快速發展的根本原因。
性能方面:UEFI舍棄了硬件外部中斷的低效方式,只保留了時鍾中斷,通過異步+事件來實現對外部設備的操作,性能因此得到極大的釋放。
擴展性和兼容性:由於規范的模塊化設計,在擴展功能時只需要動態鏈接其模塊即可,擴展十分方便。而且傳統BIOS必須運行在16位的指令模式下,尋址范圍也十分有限,而UEFI BIOS支持64位的程序,兼容32位,這也是為什么Windows XP這么久了,稍微改改還可以安裝在新設備上。
安全性:UEFI安裝的驅動設備需要經過簽名驗證才可以,通過一定的加密機制進行驗證,其安全性也非常的高。
其他:傳統BIOS只支持容量不超過2TB的驅動器,原因是:按照常見的512Byte扇區,其分區表的單個分區的第13-16字節用來進行LBA尋址,也就是以扇區為單位進行尋址。

13-16總共4個字節,1Byte=8bit,這樣也就是4*8=32位,總共就是2^32個單位空間,以扇區為單位進行尋址,也就是每次512Byte,也就是:
所以傳統BIOS支持的最大容量的驅動器,不超過2TB。以硬件廠商1000:1024的計算方式,也就是2.2TB:
那么UEFI支持多大的呢?

采用類似的分區表,具體可以看[參考文章]。
UEFI支持64位的地址空間,所以其尋址偏移恰好為一個機器長度——64位,即8Byte,還是按照LBA尋址方式,按照上述計算:
但是微軟關方和一些其他資料都顯示是18EB(按照硬件廠商1000:1024計算):



所以可以對微軟官網的數據證偽。
由於現在又由
8個512Byte扇區偽裝一下,發展成了4k大小的扇區,所以上述計算還可以再乘8,即GPT最大分區容量可以是64ZB,而當前整個萬維網的大小也不過1ZB
GPT分區的結構
既然說到了GPT分區的大小問題,那就順便稍微說一說它的結構吧,如上圖:

PMBR是Protective MBR,就是當作MBR用,位置在LBA0,如果是傳統引導,就從這個地方尋找引導文件,如果是UEFI引導,再從后面的GPT HDR尋找,GPT HDR是GPT表頭,位置在LBA1,記錄其他表項的位置;
LBA2-LBA33總共32個分區表,記錄對應分區的信息,比如起始地址和結束地址等,每個分區的信息用128Byte記錄,也叫做分區表項,比較有意思的一點是,由於Windows只允許最多128個分區,所以GPT一般也就只設32個分區表。那這是為什么呢?
前面介紹,一個扇區一般是512Byte,按照微軟的設定來,128個分區,也就需要128個分區表項來記錄,一個分區表項128Byte,也就是總共
32個512Byte大小的扇區,是不是剛好:
這里可能只做了解即可。
至於后面的藍色區域,對應之后,LBA-1是GPT HDR的備份表,LBA-2 - LBA-33是分區表的備份表,如果前面的數據發生錯誤,就從后面恢復就好啦~
中間的LBA34-LBA-34也就是除去表頭、表項和備份表等信息的分區內容啦
UEFI與硬件初始化
UEFI純粹地是一個接口規范它不會具體涉及平台固件是如何實現的
UEFI建立在被稱為平台初始化(Platform Initialization,簡稱PI)標准的框架之上。
PI是關於UEFI具體如何實現的規范

在SEC安全驗證,初始化cpu和cpu內部資源,使cache作為ram提供堆棧運行C代碼(CAR——Cache As Ram)
PEI階段初始化內存,並將需要傳遞的信息傳遞給DXE
DXE驅動執行環境,內存已經可以完全被使用,初始化核心芯片,並將控制權轉交給UEFI接口
BDS引導設備選擇,負責初始化所有啟動OS所需的設備,負責執行所有符合UEFI驅動模型的驅動。
選擇完引導設備,就加載OS loader運行OS
OS啟動后,系統的控制權從UEFI轉交給OS loader,UEFI占用的資源被回收到OS loader,只保留UEFI運行是服務。
其實再統觀一下上面的流程,是不是就變成了:基本輸入>>>PI>>>UEFI>>>基本輸出
這個過程是不是又像BIOS了?畢竟UEFI還是用作BIOS的。

如果還是覺得UEFI和BIOS是兩回事,那么可以換種解讀:
Rom Stage:一開始運行在Rom中,初始化Cache作為Ram運行,從而有了初步的C環境,運行C代碼。
Ram Stage:初始化一定的硬件之后,BIOS程序進入到Ram中,繼續初始化芯片組、主板等硬件。
Find something to boot:最后找到啟動設備,把控制權交給操作系統內核,開始操作系統的時代。
什么是Boot Loader
Boot Loader是在操作系統內核運行前執行的一小段程序,執行的工作聽起來和BIOS很像:初始化硬件,和引導系統,相當於UEFI啟動過程中的PEI初始化硬件、DXE識別啟動設備,BDS把權限交給啟動加載器,引導內核。
對比一下UEFI和Boot Loader的啟動方式:


再分析Boot Loader的啟動過程:
首先硬件設備初始化。為加載 Boot Loader 的 stage2 准備 RAM 空間。拷貝 Boot Loader 的 stage2 到 RAM 空間中。設置好堆棧。跳轉到 stage2 的 C 入口點。
初始化本階段要使用到的硬件設備。檢測系統內存映射(memory map)。將kernel 映像和根文件系統映像從 flash 上讀到 RAM 空間中。為內核設置啟動參數。調用內核。
PS:有的Boot Loader可能只有一個過程,上述為兩個階段的類型。
幾個問題:
-
BIOS為什么固化到ROM芯片上?因為掉電不丟失
-
只讀存儲器的話,又不能作修改,還有界面干什么?
要作修改,修改內容在
CMOS中 -
現在的
BIOS固化到哪了?ROM->PROM->EPROM->EEPROM->FLASH。-
一開始是在
ROM上,但是只能檢驗,不能修改,十分的不方便,所以就轉到了PROM -
PROM可編程ROM,但是寫入后也不能改, -
然后就是
EPROM,可擦除可編程ROM,但是人們又覺得不方便, -
於是又有了
EEPROM,電可擦除可編程ROM,而且雙電壓可防毒。 -
Flash閃存,更方便,只要用專用程序即可修改,
-
UEFI 引導與 傳統BIOS 引導在原理上有什么區別?芯片公司在其中扮演什么角色?
ROM、PROM、EPROM、EEPROM、RAM、SRAM、DRAM的區別
《gpt_white_paper_1_1》
PS : 個人理解,學術慎用!
