BIOS、UEFI、Boot Loader都是些什麼

mxdon發表於2020-12-12

BIOS、UEFI、Boot Loader都是些什麼

什麼是BIOS

Basic Input Output System(基本輸入輸出系統)

其實就是一組儲存著計算機最重要的基本輸入輸出的程式開機後自檢程式系統自啟動程式並固化到計算機內主機板上的一個ROM晶片上的程式

基本的輸入輸出是什麼

BIOS的終極目標:

“BIOS的最主要的功能:初始化硬體平臺和提供硬體的軟體抽象,引導作業系統啟動。”

所以:

輸入的是:硬體平臺的資訊

輸出的是:硬體的軟體抽象

然後將引導檔案載入至記憶體引導作業系統啟動

自檢程式“檢”了什麼

image-20201209230345560

每個硬體平臺都需要發現IO匯流排,因為資料的傳輸離不開匯流排。

所謂的系統自檢,就是Power On Self Test,也就是圖中的POST過程。在傳統BIOS的上電階段,通過IO列舉發現匯流排,進入到標準描述的平臺介面部分。

系統自啟動了什麼

image-20201209231643209

自啟動了作業系統呀~畢竟按下電源只是啟動了BIOS程式。

此外,在傳統BIOS程式中,還不支援檔案系統,不像上圖的Dell主機板,可以手動的新增引導檔案,在傳統BIOS啟動之後,BIOS會自動載入MBR的主開機記錄,使作業系統“自行啟動”

所以我們再看什麼是BIOS

image-20201209230345560

輸入:圍繞上圖進行展開,左邊部分剛好是硬體的初始化:CPU初始化、記憶體初始化……相當於是上面說的,輸入的硬體平臺資訊。

自檢:再經過中間部分的系統自檢,控制檯初始化、裝置初始化、通過列舉發現匯流排並初始化。

輸出&自啟動:選擇引導裝置之後,通過BIOS將硬體平臺的軟體介面提供給OS Loader,以供作業系統執行使用。

BIOS的脈絡就稍微有一些清楚了吧。

什麼是UEFI BIOS

Unified Extensible Firmware Interface(統一可擴充套件韌體介面)

由於安藤處理器晶片組的創新,64位架構的處理器已經不再適用傳統BIOS的16位執行模式,英特爾將系統韌體和作業系統之間的介面完全重新定義為一個可擴充套件的,標準化的韌體介面規範。

UEFI名字聽起來和BIOS相差較大,但是作為業界的新BIOS——UEFI BIOS,畢竟還是BIOS,所以它的主要目標就還是——初始化硬體,提供硬體的軟體抽象,並引導作業系統啟動

UEFI和BIOS的區別

image-20201209233106533

效率方面:BIOS正是因為其閉源、介面混亂才導致其最終不適用於新架構的晶片,那時候剛好趕上開源的浪潮,UEFI開源且使用規定的標準介面,通過提供介面,也將大部分程式碼移步到了C程式碼,大大降低了開發難度,這也是其快速發展的根本原因。

效能方面:UEFI捨棄了硬體外部中斷的低效方式,只保留了時鐘中斷,通過非同步+事件來實現對外部裝置的操作,效能因此得到極大的釋放。

擴充套件性和相容性:由於規範的模組化設計,在擴充套件功能時只需要動態連結其模組即可,擴充套件十分方便。而且傳統BIOS必須執行在16位的指令模式下,定址範圍也十分有限,而UEFI BIOS支援64位的程式,相容32位,這也是為什麼Windows XP這麼久了,稍微改改還可以安裝在新裝置上。

安全性:UEFI安裝的驅動裝置需要經過簽名驗證才可以,通過一定的加密機制進行驗證,其安全性也非常的高。

其他:傳統BIOS只支援容量不超過2TB的驅動器,原因是:按照常見的512Byte扇區,其分割槽表的單個分割槽的第13-16位元組用來進行LBA定址,也就是以扇區為單位進行定址。

image-20201209234539804

13-16總共4個位元組,1Byte=8bit,這樣也就是4*8=32位,總共就是2^32個單位空間,以扇區為單位進行定址,也就是每次512Byte,也就是:

\[2^{32}*512=2^{41}B=2^{31}KB=2^{21}MB=2^{11}GB=2TB \]

所以傳統BIOS支援的最大容量的驅動器,不超過2TB。以硬體廠商1000:1024的計算方式,也就是2.2TB

\[2^{41}B/1000,000,000,000=2.2TB \]

那麼UEFI支援多大的呢?

image-20201209235422385

採用類似的分割槽表,具體可以看[參考文章]。

UEFI支援64位的地址空間,所以其定址偏移恰好為一個機器長度——64位,即8Byte,還是按照LBA定址方式,按照上述計算:

\[2^{64}*512=2^{73}B=2^{13}EB=8ZB \]

但是微軟關方和一些其他資料都顯示是18EB(按照硬體廠商1000:1024計算):

\[2^{64}B/10^{60}=18EB \]

微軟對GPT大小的解釋

Intel白皮書未對GPT大小進行說明

NTFS官網上的計算大小

所以可以對微軟官網的資料證偽

由於現在又由8512Byte扇區偽裝一下,發展成了4k大小的扇區,所以上述計算還可以再乘8,即GPT最大分割槽容量可以是64ZB,而當前整個全球資訊網的大小也不過1ZB

GPT分割槽的結構

既然說到了GPT分割槽的大小問題,那就順便稍微說一說它的結構吧,如上圖:

NTFS官網的圖

PMBRProtective MBR,就是當作MBR用,位置在LBA0,如果是傳統引導,就從這個地方尋找引導檔案,如果是UEFI引導,再從後面的GPT HDR尋找,GPT HDRGPT表頭,位置在LBA1,記錄其他表項的位置;

LBA2-LBA33總共32個分割槽表,記錄對應分割槽的資訊,比如起始地址和結束地址等,每個分割槽的資訊用128Byte記錄,也叫做分割槽表項,比較有意思的一點是,由於Windows只允許最多128個分割槽,所以GPT一般也就只設32個分割槽表。那這是為什麼呢?

前面介紹,一個扇區一般是512Byte,按照微軟的設定來,128個分割槽,也就需要128個分割槽表項來記錄,一個分割槽表項128Byte,也就是總共

\[128*128=2^7*2^7=2^{14} \]

32512Byte大小的扇區,是不是剛好:

\[32*512=2^5*2^9=2^{14} \]

這裡可能只做瞭解即可。

至於後面的藍色區域,對應之後,LBA-1GPT HDR的備份表,LBA-2 - LBA-33是分割槽表的備份表,如果前面的資料發生錯誤,就從後面恢復就好啦~

中間的LBA34-LBA-34也就是除去表頭、表項和備份表等資訊的分割槽內容啦

UEFI與硬體初始化

UEFI純粹地是一個介面規範

它不會具體涉及平臺韌體是如何實現的

UEFI建立在被稱為平臺初始化(Platform Initialization,簡稱PI)標準的框架之上。

PI是關於UEFI具體如何實現的規範

image-20201210000457886

SEC安全驗證,初始化cpucpu內部資源,使cache作為ram提供堆疊執行C程式碼(CAR——Cache As Ram

PEI階段初始化記憶體,並將需要傳遞的資訊傳遞給DXE

DXE驅動執行環境,記憶體已經可以完全被使用,初始化核心晶片,並將控制權轉交給UEFI介面

BDS引導裝置選擇,負責初始化所有啟動OS所需的裝置,負責執行所有符合UEFI驅動模型的驅動。

選擇完引導裝置,就載入OS loader執行OS

OS啟動後,系統的控制權從UEFI轉交給OS loaderUEFI佔用的資源被回收到OS loader,只保留UEFI執行是服務。

其實再統觀一下上面的流程,是不是就變成了:基本輸入>>>PI>>>UEFI>>>基本輸出

這個過程是不是又像BIOS了?畢竟UEFI還是用作BIOS的。

image-20201210001009450

如果還是覺得UEFIBIOS是兩回事,那麼可以換種解讀:

Rom Stage:一開始執行在Rom中,初始化Cache作為Ram執行,從而有了初步的C環境,執行C程式碼。

Ram Stage:初始化一定的硬體之後,BIOS程式進入到Ram中,繼續初始化晶片組、主機板等硬體。

Find something to boot:最後找到啟動裝置,把控制權交給作業系統核心,開始作業系統的時代。

什麼是Boot Loader

Boot Loader是在作業系統核心執行前執行的一小段程式,執行的工作聽起來和BIOS很像:初始化硬體,和引導系統,相當於UEFI啟動過程中的PEI初始化硬體、DXE識別啟動裝置,BDS把許可權交給啟動載入器,引導核心。

對比一下UEFIBoot Loader的啟動方式:

UEFI啟動

Boot Loader啟動

再分析Boot Loader的啟動過程:

首先硬體裝置初始化。為載入 Boot Loaderstage2 準備 RAM 空間。拷貝 Boot Loaderstage2RAM 空間中。設定好堆疊。跳轉到 stage2C 入口點。

初始化本階段要使用到的硬體裝置。檢測系統記憶體對映(memory map)。將kernel 映像和根檔案系統映像從 flash 上讀到 RAM 空間中。為核心設定啟動引數。呼叫核心。

PS:有的Boot Loader可能只有一個過程,上述為兩個階段的型別。

幾個問題:

  1. BIOS為什麼固化到ROM晶片上?

    因為掉電不丟失

  2. 只讀儲存器的話,又不能作修改,還有介面幹什麼?

    要作修改,修改內容在CMOS

  3. 現在的BIOS固化到哪了?

    ROM->PROM->EPROM->EEPROM->FLASH

    • 一開始是在ROM上,但是隻能檢驗,不能修改,十分的不方便,所以就轉到了PROM

    • PROM可程式設計ROM,但是寫入後也不能改,

    • 然後就是EPROM,可擦除可程式設計ROM,但是人們又覺得不方便,

    • 於是又有了EEPROM,電可擦除可程式設計ROM,而且雙電壓可防毒。

    • Flash快閃記憶體,更方便,只要用專用程式即可修改,

bios

為什麼要有BIOS?BIOS那些惱人的小問題集錦(一)

UEFI與硬體初始化

統一可擴充套件韌體介面

UEFI背後的歷史

UEFI和BIOS的區別優缺點詳解

MBR分割槽表為什麼最大隻能識別2TB硬碟容量

MBR為什麼最大隻能用2TB

UEFI和UEFI論壇

筆記三(UEFI詳解)

UEFI 引導與 傳統BIOS 引導在原理上有什麼區別?晶片公司在其中扮演什麼角色?

一個UEFI載入程式的實現

ROM、PROM、EPROM、EEPROM、RAM、SRAM、DRAM的區別

Windows and GPT FAQ

GUID Partition Table (GPT)

GPT磁碟分割槽的結構原理

《gpt_white_paper_1_1》

PS : 個人理解,學術慎用!

相關文章