BIOS/UEFI基礎

基礎

BIOS,全稱Basic  Input/Output System。

知道BIOS的人並不多,可能自己安裝過操作系統的人會了解一些,但是大多也僅限於在BIOS setup下操作一些東西,比如說啓動順序等。

下面是一個BIOS的setup界面:

幾乎所有的PC都有BIOS,它被存放在主板上的非易失性介質中,是主機上電後運行的第一個軟件。

而由於它不同於一般的軟件,當然也不是硬件,所以它被歸類爲固件(英文是firmware,通常被存放在SpiFlash或者EEPROM或者EMMC中),它可以說是硬件和軟件之間的橋樑,之後會講到,BIOS會獲取大量的硬件信息,並傳遞個OS,算是名副其實的橋樑。

除了這個橋樑作用,BIOS的其它使命還包括:初始化硬件、測試硬件等,當然,最終的目的就是加載操作系統。

 
歷史

通常BIOS會被認爲是隨着IBM PC的出現而產生的。

實際上BIOS要早於IBM PC,早在1975年,BIOS的概念就在CP/M系統上出現。

之後的八九十年代MS-DOS佔了操作系統的主流,而它跟BIOS是好朋友,事實上,MS-DOS上的中斷就是BIOS提供的。

這一二十年中,BIOS一直保持着比較穩定的狀態,貌似發展不大,反正沒有找到具體的資料說BIOS在這個計算機巨大變革的時代中有什麼出彩的事例。

九十年代的中期,Intel在它的Intel–HP Itanium系統中,由於受到BIOS固有的一些限制(畢竟太老了),Intel有了尋找BIOS替代品的打算。

最初並不是叫UEFI,先是叫Intel Boot Initiative,然後更名爲EFI(全稱Extensible Firmware Interface,因爲BIOS是固件嘛,它就是擴展的固件),再然後Intel將EFI開源了,就叫作了Unified EFI,簡稱UEFI。

在2000年,Intel自家的Itanium平臺用上了EFI。到2014年的時候,基本出廠的x86架構的PC都使用了UEFI。不僅是x86,目前ARM也開始支持UEFI了。

所以,基本上以後就是UEFI來替代BIOS了。

 

UEFI概述

下面主要講的是UEFI的東西,傳統的BIOS不在這裏講了,其實是因爲知道的也不多。

UEFI的基礎主要通過幾張圖來展示。

第一張是UEFI的概念圖:

紅框部分都屬於BIOS。下面簡單的介紹下:

1)最右下角的部分是Platform Hardware,主要是指硬件的初始化;在這裏裏面,還有一個圓柱形,表示的是存儲介質(比如硬盤,它常用圓柱形來表示),其中存放着與OS相關的東西,比如OS,以及OS Loader;常見的OS Loader有grub、lilo等,不過它們是legacy的,意思是支持的是傳統的OS;對於支持UEFI的OS,在系統安裝時通常會有一個名爲Boot.efi(具體名字有點記不得了,反正類似,根據32位和64位還會不同)的UEFI應用,系統啓動時UEFI會搜索儲存介質中的這個文件並運行,而它的工作就是加載OS。

2)在Platform Hardware之上的是EFI Services,它主要分爲Boot Services和Runtime Services,它們提供了一些基礎的服務,來保證UEFI和OS的基本功能。兩者主要的差別簡單來講就是前者在UEFI階段用,後者在OS下用(當然前提是OS支持)。

3)上圖的左側,並排放置着一些表示接口的東西,比如ACPI、SMBIOS等。它們本身是與UEFI沒有直接聯繫的一些計算機協議,不過UEFI下有相關的實現,這些協議保證了UEFI和OS的聯繫。

4)紅框部分最上層是OS Loader,就是用來加載OS的了。以後有機會可以講講grub、lilo和Boot.efi,其中grub分1和2兩個版本,兩者差別極大;lilo有個EFI的版本稱爲elilo,可以在EFI Shell下直接運行並加載OS。這裏還需要說明下BIOS和UEFI加載OS的一個區別:BIOS不支持文件系統,因此對於OS Loader,只支持從特定的位置去讀取(比如MBR);而UEFI支持文件系統,因此在UEFI啓動的過程中就可以識別到存儲介質的文件系統並獲取到需要的文件。

下一張圖是UEFI的流程圖:

UEFI大致分爲4個階段(就是從左到右的前4個):

1)SEC:這個階段的代碼以彙編爲主;做的事情大致有:獲取CPU檢測結果,找到PEI相關的二進制,跳轉到PEI入口;

2)PEI:這個階段開始,代碼都是C語言爲主了;主要做的事情是CPU的初始化和內存的初始化(也可以看做是CPU初始化的一部分,因爲內存控制器也是CPU的一部分,單獨把它列出來是因爲它的重要性),最終將CPU和內存等信息通過一種稱爲HOB的東西傳遞到下一階段;

3)DXE:這個階段會運行很多稱爲Driver的模塊,每一個模塊都可以是獨立的,並完成不同的工作,它們之中有的提供功能,有的用來初始化硬件,不一而足;

4)BDS:這個部分從名字上來看,應該是用來生成啓動選項並選擇一個啓動選項來加載OS的,這確實是它的一個主要功能。但是除此之外,它還有一個功能就是硬件的初始化。之前的DXE階段也有硬件初始化,但是如果想要系統能夠運行的更快,《UEFI Spec》建議在這裏初始化硬件,這就要求這個硬件初始化模塊滿足一個的格式,稱爲UEFI Driver Model。這裏不具體介紹,可以參考《UEFI Spec》

在這之後就是加載OS和OS的運行,這個過程中UEFI可以有部分的參與,但是作爲UEFI的階段已經結束。

下面一張圖與上一張類似,也是流程圖,不過下圖涉及到了UEFI實現中的一些具體部分:

 
兼容性

UEFI需要兼容之前的OS。

前面已經提到,支持UEFI的OS會在安裝好的系統中存放Boot.efi文件供UEFI來獲取並加載系統。

而對於老的OS(legacy OS),並沒有這樣的東西,它的OS Loader一般都放在MBR中。

除了這一點,對於一些老一點的外設,它可能需要使用中斷來進行初始化,而UEFI本身並沒有提供傳統的INT中斷。

所以在UEFI中提供了一個兼容模塊,稱爲CSM,全稱Compatibility Support Module。
————————————————
版權聲明:本文爲CSDN博主「jiangwei0512」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/jiangwei0512/article/details/51527315

————————————————
版權聲明:本文爲CSDN博主「jiangwei0512」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/jiangwei0512/article/details/51527315

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章