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 : 個人理解,學術慎用!