BIOS、UEFI、Boot Loader都是些什麼
阿新 • • 發佈:2020-12-12
# BIOS、UEFI、Boot Loader都是些什麼
[toc]
## 什麼是BIOS
> `Basic Input Output System`(基本輸入輸出系統)
>
> 其實就是一組儲存著計算機最重要的**基本輸入輸出的程式**、**開機後自檢程式**、**系統自啟動程式**,**並固化到計算機內主機板上的一個ROM晶片上的程式**。
### 基本的輸入輸出是什麼
**BIOS的終極目標:**
> “BIOS的最主要的功能:初始化硬體平臺和提供硬體的軟體抽象,引導作業系統啟動。”
所以:
輸入的是:硬體平臺的資訊
輸出的是:硬體的軟體抽象
然後**將引導檔案載入至記憶體引導作業系統啟動**
### 自檢程式“檢”了什麼
![image-20201209230345560](https://img-blog.csdnimg.cn/img_convert/72876ece49824deb316d4b9a2ca56dd9.png)
每個硬體平臺都需要發現IO匯流排,因為資料的傳輸離不開匯流排。
所謂的系統自檢,就是`Power On Self Test`,也就是圖中的`POST`過程。在傳統`BIOS`的上電階段,通過`IO`枚舉發現匯流排,進入到標準描述的平臺介面部分。
### 系統自啟動了什麼
![image-20201209231643209](https://img-blog.csdnimg.cn/img_convert/4b199d7ab5a63e8904ccb2e46b3bede3.png)
自啟動了作業系統呀~畢竟按下電源只是啟動了`BIOS`程式。
此外,在傳統`BIOS`程式中,還不支援檔案系統,不像上圖的`Dell`主機板,可以手動的新增引導檔案,在傳統`BIOS`啟動之後,`BIOS`會自動載入`MBR`的主引導記錄,使作業系統“自行啟動”
**所以我們再看什麼是`BIOS`?**
![image-20201209230345560](https://img-blog.csdnimg.cn/img_convert/72876ece49824deb316d4b9a2ca56dd9.png)
**輸入**:圍繞上圖進行展開,左邊部分剛好是硬體的初始化:`CPU`初始化、記憶體初始化……相當於是上面說的,輸入的硬體平臺資訊。
**自檢**:再經過中間部分的系統自檢,控制檯初始化、裝置初始化、通過枚舉發現匯流排並初始化。
**輸出&自啟動**:選擇引導裝置之後,通過`BIOS`將硬體平臺的軟體介面提供給`OS Loader`,以供作業系統執行使用。
`BIOS`的脈絡就稍微有一些清楚了吧。
## 什麼是UEFI BIOS
> Unified Extensible Firmware Interface(統一可擴充套件韌體介面)
>
> 由於安藤處理器晶片組的創新,64位架構的處理器已經不再適用傳統BIOS的16位執行模式,英特爾將系統韌體和作業系統之間的介面完全重新定義為一個可擴充套件的,標準化的韌體介面規範。
`UEFI`名字聽起來和`BIOS`相差較大,但是作為業界的新`BIOS`——`UEFI BIOS`,畢竟還是`BIOS`,所以它的主要目標就還是——**初始化硬體,提供硬體的軟體抽象,並引導作業系統啟動**
### UEFI和BIOS的區別
![image-20201209233106533](https://img-blog.csdnimg.cn/img_convert/1b0ac5caae112d7d64082890a9f87e01.png)
**效率方面:**`BIOS`正是因為其閉源、介面混亂才導致其最終不適用於新架構的晶片,那時候剛好趕上開源的浪潮,`UEFI`開源且使用規定的標準介面,通過提供介面,也將大部分程式碼移步到了`C`程式碼,大大降低了開發難度,這也是其快速發展的根本原因。
**效能方面:**`UEFI`捨棄了硬體外部中斷的低效方式,只保留了時鐘中斷,通過非同步+事件來實現對外部裝置的操作,效能因此得到極大的釋放。
**擴充套件性和相容性**:由於規範的模組化設計,在擴充套件功能時只需要動態連結其模組即可,擴充套件十分方便。而且傳統`BIOS`必須執行在`16`位的指令模式下,定址範圍也十分有限,而`UEFI BIOS`支援64位的程式,相容`32`位,這也是為什麼`Windows XP`這麼久了,稍微改改還可以安裝在新裝置上。
**安全性:**`UEFI`安裝的驅動裝置需要經過簽名驗證才可以,通過一定的加密機制進行驗證,其安全性也非常的高。
**其他**:傳統`BIOS`只支援容量不超過`2TB`的驅動器,原因是:按照常見的`512Byte`扇區,其分割槽表的單個分割槽的第`13-16`位元組用來進行`LBA`定址,也就是以扇區為單位進行定址。
![image-20201209234539804](https://img-blog.csdnimg.cn/img_convert/7412304a8130df9ec0039569d5ac0efb.png)
`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](https://img-blog.csdnimg.cn/img_convert/a56d5deb358d26a9450e5d116862cde0.png)
採用類似的分割槽表,具體可以看[參考文章]。
`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大小的解釋](https://img-blog.csdnimg.cn/img_convert/a47be70854e8c5a676ccafeb6ea94715.png)
![Intel白皮書未對GPT大小進行說明](https://img-blog.csdnimg.cn/img_convert/ae39cc3c6fd3d1c44b67b50db43eb124.png)
![NTFS官網上的計算大小](https://img-blog.csdnimg.cn/img_convert/8fa207990e387e6c5a984d8efa1e5c4f.png)
所以可以對微軟官網的資料**證偽**。
> 由於現在又由`8`個`512Byte`扇區偽裝一下,發展成了`4k`大小的扇區,所以上述計算還可以再乘`8`,即`GPT`最大分割槽容量可以是`64ZB`,而當前整個全球資訊網的大小也不過`1ZB`
### GPT分割槽的結構
既然說到了`GPT`分割槽的大小問題,那就順便稍微說一說它的結構吧,如上圖:
![NTFS官網的圖](https://img-blog.csdnimg.cn/img_convert/ba2719aa6a2c95530bef73ac3dd8d064.png)
`PMBR`是`Protective MBR`,就是當作`MBR`用,位置在`LBA0`,如果是傳統引導,就從這個地方尋找引導檔案,如果是`UEFI`引導,再從後面的`GPT HDR`尋找,`GPT HDR`是**`GPT`表頭**,位置在`LBA1`,記錄其他表項的位置;
`LBA2-LBA33`總共`32`個分割槽表,記錄對應分割槽的資訊,比如起始地址和結束地址等,每個分割槽的資訊用`128Byte`記錄,也叫做**分割槽表項**,比較有意思的一點是,由於`Windows`只允許最多`128`個分割槽,所以`GPT`**一般**也就只設`32`個分割槽表。那這是為什麼呢?
前面介紹,一個扇區一般是`512Byte`,按照微軟的設定來,`128`個分割槽,也就需要`128`個分割槽表項來記錄,一個分割槽表項`128Byte`,也就是總共
$$
128*128=2^7*2^7=2^{14}
$$
`32`個`512Byte`大小的扇區,是不是剛好:
$$
32*512=2^5*2^9=2^{14}
$$
這裡可能只做瞭解即可。
至於後面的藍色區域,對應之後,`LBA-1`是`GPT HDR`的備份表,`LBA-2 - LBA-33`是分割槽表的備份表,如果前面的資料發生錯誤,就從後面恢復就好啦~
中間的`LBA34-LBA-34`也就是除去表頭、表項和備份表等資訊的**分割槽**內容啦
### UEFI與硬體初始化
> `UEFI`純粹地是一個介面規範
>
> 它不會具體涉及平臺韌體是如何實現的
>
> `UEFI`建立在被稱為平臺初始化(`Platform Initialization`,簡稱`PI`)標準的框架之上。
>
> **`PI`是關於`UEFI`具體如何實現的規範**
![image-20201210000457886](https://img-blog.csdnimg.cn/img_convert/583c7343423588035a21fe5834c4be13.png)
在`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`的。
![image-20201210001009450](https://img-blog.csdnimg.cn/img_convert/cd83eb661ebe399ecc622cff6799060a.png)
如果還是覺得`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`的啟動方式:
![UEFI啟動](https://img-blog.csdnimg.cn/img_convert/583c7343423588035a21fe5834c4be13.png)
![Boot Loader啟動](https://img-blog.csdnimg.cn/img_convert/0c314844bd0b12760820f7a04eac498a.png)
再分析`Boot Loader`的啟動過程:
首先硬體裝置初始化。為載入 `Boot Loader` 的 `stage2` 準備 `RAM` 空間。拷貝 `Boot Loader` 的 `stage2` 到 `RAM` 空間中。設定好堆疊。跳轉到 `stage2` 的 `C` 入口點。
初始化本階段要使用到的硬體裝置。檢測系統記憶體對映(`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](https://baike.baidu.com/item/bios/91424)
[為什麼要有BIOS?BIOS那些惱人的小問題集錦(一)](https://zhuanlan.zhihu.com/p/45352657)
[UEFI與硬體初始化](https://zhuanlan.zhihu.com/p/25941340)
[統一可擴充套件韌體介面](https://baike.baidu.com/item/%E7%BB%9F%E4%B8%80%E5%8F%AF%E6%89%A9%E5%B1%95%E5%9B%BA%E4%BB%B6%E6%8E%A5%E5%8F%A3/22786233?fromtitle=UEFI&fromid=3556240)
[UEFI背後的歷史](https://zhuanlan.zhihu.com/p/25281151)
[UEFI和BIOS的區別優缺點詳解](http://www.dnxtc.net/zixun/yingyongjiqiao/2018-06-13/2605.html)
[MBR分割槽表為什麼最大隻能識別2TB硬碟容量](https://www.cnblogs.com/harrymore/p/13782261.html)
[MBR為什麼最大隻能用2TB](https://blog.csdn.net/hyy5801965/article/details/51136395)
[UEFI和UEFI論壇](https://zhuanlan.zhihu.com/p/25676417)
[筆記三(UEFI詳解)](https://www.cnblogs.com/ScvQ/p/9224963.html)
[UEFI 引導與 傳統BIOS 引導在原理上有什麼區別?晶片公司在其中扮演什麼角色?](https://zhuanlan.zhihu.com/p/81960137)
[一個UEFI載入程式的實現](https://www.ituring.com.cn/book/tupubarticle/26793)
[ROM、PROM、EPROM、EEPROM、RAM、SRAM、DRAM的區別](https://wenku.baidu.com/view/d5ec5fe4ad51f01dc281f1cd.html)
[Windows and GPT FAQ](https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/windows-and-gpt-faq)
[GUID Partition Table (GPT)](http://www.ntfs.com/guid-part-table.htm)
[GPT磁碟分割槽的結構原理](https://www.dgxue.com/huifu/124.html)
《gpt_white_paper_1_1》
>PS : 個人理解,學術