Basic Input Output System (基本輸入輸出系統(tǒng))
其實就是一組保存著計算機最重要的 基本輸入輸出的程序 、 開機后自檢程序 、 系統(tǒng)自啟動程序 , 并固化到計算機內(nèi)主板上的一個ROM芯片上的程序 。
“BIOS的最主要的功能:初始化硬件平臺和提供硬件的軟件抽象,引導操作系統(tǒng)啟動?!?/span>
所以:
輸入的是:硬件平臺的信息
輸出的是:硬件的軟件抽象
每個硬件平臺都需要發(fā)現(xiàn)IO總線,因為數(shù)據(jù)的傳輸離不開總線。
所謂的系統(tǒng)自檢,就是 Power On Self Test ,也就是圖中的 POST 過程。在傳統(tǒng) BIOS 的上電階段,通過 IO 枚舉發(fā)現(xiàn)總線,進入到標準描述的平臺接口部分。
自啟動了操作系統(tǒng)呀~畢竟按下電源只是啟動了 BIOS 程序。
此外,在傳統(tǒng) BIOS 程序中,還不支持文件系統(tǒng),不像上圖的 Dell 主板,可以手動的添加引導文件,在傳統(tǒng) BIOS 啟動之后, BIOS 會自動加載 MBR 的主引導記錄,使操作系統(tǒng)“自行啟動”
輸入:圍繞上圖進行展開,左邊部分剛好是硬件的初始化: CPU 初始化、內(nèi)存初始化……相當于是上面說的,輸入的硬件平臺信息。
自檢:再經(jīng)過中間部分的系統(tǒng)自檢,控制臺初始化、設備初始化、通過枚舉發(fā)現(xiàn)總線并初始化。
輸出&自啟動:選擇引導設備之后,通過 BIOS 將硬件平臺的軟件接口提供給 OS Loader ,以供操作系統(tǒng)運行使用。
BIOS 的脈絡就稍微有一些清楚了吧。
Unified Extensible Firmware Interface(統(tǒng)一可擴展固件接口)
由于安藤處理器芯片組的創(chuàng)新,64位架構(gòu)的處理器已經(jīng)不再適用傳統(tǒng)BIOS的16位運行模式,英特爾將系統(tǒng)固件和操作系統(tǒng)之間的接口完全重新定義為一個可擴展的,標準化的固件接口規(guī)范。
UEFI 名字聽起來和 BIOS 相差較大,但是作為業(yè)界的新 BIOS —— UEFI BIOS ,畢竟還是 BIOS ,所以它的主要目標就還是—— 初始化硬件,提供硬件的軟件抽象,并引導操作系統(tǒng)啟動
效率方面: BIOS 正是因為其閉源、接口混亂才導致其最終不適用于新架構(gòu)的芯片,那時候剛好趕上開源的浪潮, UEFI 開源且使用規(guī)定的標準接口,通過提供接口,也將大部分代碼移步到了 C 代碼,大大降低了開發(fā)難度,這也是其快速發(fā)展的根本原因。
性能方面: UEFI 舍棄了硬件外部中斷的低效方式,只保留了時鐘中斷,通過異步+事件來實現(xiàn)對外部設備的操作,性能因此得到極大的釋放。
擴展性和兼容性:由于規(guī)范的模塊化設計,在擴展功能時只需要動態(tài)鏈接其模塊即可,擴展十分方便。而且傳統(tǒng) BIOS 必須運行在 16 位的指令模式下,尋址范圍也十分有限,而 UEFI BIOS 支持64位的程序,兼容 32 位,這也是為什么 Windows XP 這么久了,稍微改改還可以安裝在新設備上。
安全性: UEFI 安裝的驅(qū)動設備需要經(jīng)過簽名驗證才可以,通過一定的加密機制進行驗證,其安全性也非常的高。
其他:傳統(tǒng) BIOS 只支持容量不超過 2TB 的驅(qū)動器,原因是:按照常見的 512Byte 扇區(qū),其分區(qū)表的單個分區(qū)的第 13-16 字節(jié)用來進行 LBA 尋址,也就是以扇區(qū)為單位進行尋址。
13-16 總共 4 個字節(jié), 1Byte=8bit ,這樣也就是 4*8=32 位,總共就是 2^32 個單位空間,以扇區(qū)為單位進行尋址,也就是每次 512Byte ,也就是:
232?512=241B=231KB=221MB=211GB=2TB232?512=241B=231KB=221MB=211GB=2TB
所以傳統(tǒng) BIOS 支持的最大容量的驅(qū)動器,不超過 2TB 。以硬件廠商 1000:1024 的計算方式,也就是 2.2TB :
241B/1000,000,000,000=2.2TB241B/1000,000,000,000=2.2TB
那么 UEFI 支持多大的呢?
采用類似的分區(qū)表,具體可以看[參考文章]。
UEFI 支持 64 位的地址空間,所以其尋址偏移恰好為一個機器長度—— 64 位,即 8Byte ,還是按照 LBA 尋址方式,按照上述計算:
264?512=273B=213EB=8ZB264?512=273B=213EB=8ZB
但是微軟關方和一些其他資料都顯示是 18EB (按照硬件廠商 1000:1024 計算):
264B/1060=18EB264B/1060=18EB
所以可以對微軟官網(wǎng)的數(shù)據(jù) 證偽 。
由于現(xiàn)在又由 8 個 512Byte 扇區(qū)偽裝一下,發(fā)展成了 4k 大小的扇區(qū),所以上述計算還可以再乘 8 ,即 GPT 最大分區(qū)容量可以是 64ZB ,而當前整個萬維網(wǎng)的大小也不過 1ZB
既然說到了 GPT 分區(qū)的大小問題,那就順便稍微說一說它的結(jié)構(gòu)吧,如上圖:
PMBR 是 Protective MBR ,就是當作 MBR 用,位置在 LBA0 ,如果是傳統(tǒng)引導,就從這個地方尋找引導文件,如果是 UEFI 引導,再從后面的 GPT HDR 尋找, GPT HDR 是 GPT 表頭 ,位置在 LBA1 ,記錄其他表項的位置;
LBA2-LBA33 總共 32 個分區(qū)表,記錄對應分區(qū)的信息,比如起始地址和結(jié)束地址等,每個分區(qū)的信息用 128Byte 記錄,也叫做 分區(qū)表項 ,比較有意思的一點是,由于 Windows 只允許最多 128 個分區(qū),所以 GPT 一般 也就只設 32 個分區(qū)表。那這是為什么呢?
前面介紹,一個扇區(qū)一般是 512Byte ,按照微軟的設定來, 128 個分區(qū),也就需要 128 個分區(qū)表項來記錄,一個分區(qū)表項 128Byte ,也就是總共
128?128=27?27=214128?128=27?27=214
32 個 512Byte 大小的扇區(qū),是不是剛好:
32?512=25?29=21432?512=25?29=214
這里可能只做了解即可。
至于后面的藍色區(qū)域,對應之后, LBA-1 是 GPT HDR 的備份表, LBA-2 - LBA-33 是分區(qū)表的備份表,如果前面的數(shù)據(jù)發(fā)生錯誤,就從后面恢復就好啦~
中間的 LBA34-LBA-34 也就是除去表頭、表項和備份表等信息的 分區(qū) 內(nèi)容啦
UEFI 純粹地是一個接口規(guī)范
它不會具體涉及平臺固件是如何實現(xiàn)的
UEFI 建立在被稱為平臺初始化( Platform Initialization ,簡稱 PI )標準的框架之上。
PI 是關于 UEFI 具體如何實現(xiàn)的規(guī)范
在 SEC 安全驗證,初始化 cpu 和 cpu 內(nèi)部資源,使 cache 作為 ram 提供堆棧運行C代碼( CAR —— Cache As Ram )
PEI 階段初始化內(nèi)存,并將需要傳遞的信息傳遞給 DXE
DXE 驅(qū)動執(zhí)行環(huán)境,內(nèi)存已經(jīng)可以完全被使用,初始化核心芯片,并將控制權(quán)轉(zhuǎn)交給 UEFI 接口
BDS 引導設備選擇,負責初始化所有啟動 OS 所需的設備,負責執(zhí)行所有符合 UEFI 驅(qū)動模型的驅(qū)動。
選擇完引導設備,就加載 OS loader 運行 OS
OS 啟動后,系統(tǒng)的控制權(quán)從UEFI轉(zhuǎn)交給 OS loader , UEFI 占用的資源被回收到 OS loader ,只保留 UEFI 運行是服務。
其實再統(tǒng)觀一下上面的流程,是不是就變成了: 基本輸入>>> PI >>> UEFI >>>基本輸出
這個過程是不是又像 BIOS 了?畢竟 UEFI 還是用作 BIOS 的。
如果還是覺得 UEFI 和 BIOS 是兩回事,那么可以換種解讀:
Rom Stage :一開始運行在 Rom 中,初始化 Cache 作為 Ram 運行,從而有了初步的 C 環(huán)境,運行 C 代碼。
Ram Stage :初始化一定的硬件之后, BIOS 程序進入到 Ram 中,繼續(xù)初始化芯片組、主板等硬件。
Find something to boot :最后找到啟動設備,把控制權(quán)交給操作系統(tǒng)內(nèi)核,開始操作系統(tǒng)的時代。
Boot Loader 是在操作系統(tǒng)內(nèi)核運行前執(zhí)行的一小段程序 ,執(zhí)行的工作聽起來和 BIOS 很像:初始化硬件,和引導系統(tǒng),相當于 UEFI 啟動過程中的 PEI 初始化硬件、 DXE 識別啟動設備, BDS 把權(quán)限交給啟動加載器,引導內(nèi)核。
對比一下 UEFI 和 Boot Loader 的啟動方式:
再分析 Boot Loader 的啟動過程:
首先硬件設備初始化。為加載 Boot Loader 的 stage2 準備 RAM 空間??截?Boot Loader 的 stage2 到 RAM 空間中。設置好堆棧。跳轉(zhuǎn)到 stage2 的 C 入口點。
初始化本階段要使用到的硬件設備。檢測系統(tǒng)內(nèi)存映射( memory map )。將 kernel 映像和根文件系統(tǒng)映像從 flash 上讀到 RAM 空間中。為內(nèi)核設置啟動參數(shù)。調(diào)用內(nèi)核。
PS:有的Boot Loader可能只有一個過程,上述為兩個階段的類型。
bios
為什么要有BIOS?BIOS那些惱人的小問題集錦(一)
UEFI與硬件初始化
統(tǒng)一可擴展固件接口
UEFI背后的歷史
UEFI和BIOS的區(qū)別優(yōu)缺點詳解
MBR分區(qū)表為什么最大只能識別2TB硬盤容量
MBR為什么最大只能用2TB
UEFI和UEFI論壇
筆記三(UEFI詳解)
UEFI 引導與 傳統(tǒng)BIOS 引導在原理上有什么區(qū)別?芯片公司在其中扮演什么角色?
一個UEFI引導程序的實現(xiàn)
ROM、PROM、EPROM、EEPROM、RAM、SRAM、DRAM的區(qū)別
Windows and GPT FAQ
GUID Partition Table (GPT)
GPT磁盤分區(qū)的結(jié)構(gòu)原理
《gpt_white_paper_1_1》
聯(lián)系客服