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