愛伊米

BIOS、EFI與UEFI 詳解

本文轉載自IT之家,作者:wkdubhe1987

大家好呀,今天和大家談一下BIOS、EFI和UEFI。

前一篇文已經說過BIOS是個程式(詳情點此),儲存在BIOS晶片中,而現在的新式電腦用的基本都是UEFI啟動,早期的過渡電腦用的都是EFI啟動。

其實EFI或UEFI的一部分也是儲存在一個晶片中,由於它們在表面形式、基本功能上和BIOS差不多,所以習慣上我們也把儲存EFI/UEFI的晶片叫做EFI/UEFI BIOS晶片,EFI/UEFI也叫做EFI/UEFI BIOS,但在實際上它們和BIOS根本是不一樣的,所以最好還是把後面的“BIOS”尾巴去掉為好,下面就來具體談一下BIOS、EFI和UEFI。

BIOS、EFI與UEFI 詳解

前篇文指出BIOS用於計算機硬體自檢、CMOS設定、引導作業系統啟動、提供硬體I/O、硬體中斷等4項主要功能,因此BIOS程式可以分為若干模組,主要有Boot Block引導模組、CMOS設定模組、擴充套件配置資料(ESCD)模組、DMI收集硬體資料模組,其中引導模組直接負責執行BIOS程式本身入口、計算機基本硬體的檢測和初始化,ESCD用於BIOS與OS交換硬體配置資料,DMI則充當了硬體管理工具和系統層之間介面的角色,透過DMI,使用者可以直觀地獲得硬體的任何資訊,CMOS設定模組就是實現對硬體資訊進行設定,並儲存在CMOS中,是除了啟動初始化以外BIOS程式最常用的功能。

BIOS本身是組合語言程式碼,是在16位真實模式下呼叫INT 13H中斷執行的,由於x86-64是一個高度相容的指令集,也為了遷就BIOS的16位真實模式的執行環境,所以即使現在的CPU都已是64位,如果還是在BIOS啟動(基本見於09年以前的主機板),在開機時仍然都是在16位真實模式下執行的。16位真實模式直接能訪問的記憶體只有1MB,就算你安了4G、8G或者16G還是32G記憶體,到了BIOS上一律只先認前1MB。在這1MB記憶體中,前640K稱為基本記憶體,後面384K記憶體留給開機必要硬體和各類BIOS本身使用,瞭解了這些,下面談一下BIOS啟動計算機的具體過程。

當按下電源開關時,電源就開始向主機板和其他裝置供電,這時電壓還不穩定,在早期的南北橋主機板上,由主機板北橋向CPU發覆位訊號,對CPU初始化;穩定電壓後復位訊號便撤掉。而對於現在的單南橋主機板,則由CPU自身調整穩定電壓達到初始化的目的,當電壓穩定後,CPU便在系統BIOS保留的記憶體地址處執行跳轉BIOS起始處指令,開始執行POST自檢。

在POST自檢中,BIOS只檢查系統的必要核心硬體是否有問題,主要是CPU、640K基本記憶體、顯示卡是否正常,PS/2鍵盤控制器、系統時鐘是否有錯誤等等。由於POST檢查在顯示卡初始化以前,因此在這個階段如發生錯誤,是無法在螢幕上顯示的,不過主機板上還有個報警揚聲器,而且如果主機板的8255外圍可程式設計介面晶片沒有損壞的話,POST報警聲音一定是會出來的。可以根據報警聲的不同大致判斷錯誤所在,一般情況下,一聲短“嘀”聲基本代表正常啟動,不同的錯誤則是不同的短“嘀”聲和長“嘀”聲組合。POST自檢結束後,BIOS開始呼叫中斷完成各種硬體初始化工作。

硬體初始化工作中,主要說明兩點,首先經過POST檢測後,電腦終於出現了開機啟動畫面,這就是已經檢測到了顯示卡並完成了初始化。

但是請注意,由於BIOS是在16位真實模式執行,因此該畫面是以VGA解析度(640*480,縱橫比4:3)顯示的,因為真實模式最高支援的就是VGA。以前的小14-17寸CRT顯示器由於都是4:3比例,最高解析度也比較低,因此這個開機啟動畫面沒有什麼違和感,但現在的液晶顯示器基本上都是寬屏16:9的,解析度也較高,因此在這樣的顯示屏下,啟動畫面上的一切東西顯示都可以說“慘不忍睹”——圖形被拉長,字型很大很模糊,可以很明顯看到顯示字型的鋸齒。

第二,BIOS只識別到由主引導記錄(MBR)初始化的硬碟,之所以說明這點,是因為後續的EFI或UEFI採用了一種新的GUID磁碟分割槽系統(GPT)格式,這種硬碟在BIOS下是無法識別的。硬體全部初始化完畢後,接下來進入更新ESCD階段。

在ESCD更新階段中,BIOS將對儲存在CMOS中和作業系統交換的硬體配置資料進行檢測,如果系統硬體發生變動,則會更新該資料,否則不更新保持原狀不變,ESCD檢測或更新結束後,BIOS將完成最後一項工作,就是啟動作業系統。

最後這一步中,BIOS根據CMOS中使用者指定的硬體啟動順序,讀取相應裝置的啟動或引導記錄,引導相應裝置上的作業系統啟動,進入作業系統,此後便由作業系統接替BIOS負責硬體和軟體間的相互通訊。如果發現所有硬體都沒有能引導作業系統的記錄,則會在螢幕上顯示相應錯誤資訊,並將電腦維持在16位真實模式。

雖然BIOS作為電腦加電啟動所必不可少的部分,但是從其於1975年誕生之日起近30餘年,16位組合語言程式碼,1M記憶體定址,呼叫中斷一條條執行的理念和方式竟然一點都沒有改變,雖然經各大主機板商不懈努力,BIOS也有了ACPI、USB裝置支援,PnP即插即用支援等新東西,但是這在根本上沒有改變BIOS的本質,而英特爾為了遷就這些舊技術,不得不在一代又一代處理器中保留著16位真實模式(否則根本無法開機的)。

但是,英特爾在2001年開發了全新的安騰處理器,採用IA-64架構,並推出了全新的EFI。後來證明,安騰處理器、IA-64架構沒有推廣開來,而EFI和後繼的UEFI卻發揚光大,成為現在電腦的主要預啟動環境。

EFI,是Extensible Firmware Interface的詞頭縮寫,直譯過來就是可擴充套件韌體介面,它是用模組化、高階語言(主要是C語言)構建的一個小型化系統

,它和BIOS一樣,主要在啟動過程中完成硬體初始化,但它是直接利用載入EFI驅動的方式,識別系統硬體並完成硬體初始化,徹底摒棄讀各種中斷執行。EFI驅動並不是直接面向CPU的程式碼,而是由EFI位元組碼編寫成,EFI位元組碼是專用於EFI的虛擬機器器指令,需要在EFI驅動執行環境DXE下解釋執行,這樣EFI既可以實現通配,又提供了良好的相容。

此外,EFI完全是32位或64位,摒棄16位真實模式,在EFI中就可以實現處理器的最大定址,因此可以在任何記憶體地址存放任何資訊。另外,由於EFI的驅動開發非常簡單,基於EFI的驅動模型原則上可以使EFI接觸到所有硬體功能,在EFI上實現檔案讀寫,網路瀏覽都是完全可能的。

BIOS上的的CMOS設定程式在EFI上是作為一個個EFI程式來執行的,硬體設定是硬體設定程式、而啟動管理則是另一個程式,儲存CMOS又是另一個程式,雖然它們在形式的Shell上是在一起的。

EFI在功能上完全等同於一個輕量化的OS,但是EFI在制定時就定位到不足以成為專業OS的地位上。

首先,它只是一個硬體和作業系統間的一個介面;其次,EFI不提供中斷訪問機制,EFI必須用輪詢的方式檢查並解釋硬體,較OS下的驅動執行效率較低,最後,EFI只有簡單的儲存器管理機制,在段保護模式下只將儲存器分段,所有程式都可以存取任何一段位置,不提供真實的保護服務。

伴隨著EFI,一種全新的GUID磁碟分割槽系統(GPT)被引入支援,傳統MBR磁碟只能存在4個主分割槽,只有在建立主分割槽不足4個時,可以建立一個擴充套件分割槽,再在其上建立被系統識別的邏輯分割槽,邏輯分割槽也是有數量的,太多的邏輯分割槽會嚴重影響系統啟動,MBR硬碟分割槽最大僅支援2T容量,對於現在的大容量硬碟來說也是浪費。

GPT支援任意多的分割槽,每個分割槽大小原則上是無限制的,但實際上受到OS的規定限制不能做到無限,不過比MBR的2T限制是非常重要的進步。GPT的分割槽型別由GUID表唯一指定,基本不可能出現重複,其中的EFI系統分割槽可以被EFI存取,用來存取部分驅動和應用程式,雖然這原則上會使EFI系統分割槽變得不安全,但是一般這裡放置的都是些“邊緣”資料,即使其被破壞,一般也不會造成嚴重後果,而且也能夠簡單的恢復回來。

當EFI發展到1。1的時候,英特爾決定把EFI公之於眾,於是後續的2。0吸引了眾多公司加入,EFI也不再屬於英特爾,而是屬於了Unified EFI Form的國際組織,EFI在2。0後也遂改稱為UEFI,UEFI,其中的EFI和原來是一個意思,U則是Unified(一元化、統一)的縮寫,所以

UEFI的意思就是“統一的可擴充套件韌體介面”

,與前身EFI相比,UEFI主要有以下改進:

首先,UEFI具有完整的圖形驅動功能,之前的EFI雖然原則上加入了圖形驅動,但為了保證EFI和BIOS的良好過渡,EFI多數還是一種類DOS介面(仍然是640*480VGA解析度),只支援PS/2鍵盤操作(極少數支援滑鼠操作),不支援USB鍵盤和滑鼠。到了UEFI,則是擁有了完整的圖形驅動,無論是PS/2還是USB鍵盤和滑鼠,UEFI一律是支援的,而且UEFI在顯示卡也支援GOP VBIOS的時候,顯示的設定介面是顯示卡高解析度按640*480或1024*768顯示,因此畫面雖小但很清楚,但是這樣會導致螢幕周圍大片留黑,不過魚和熊掌不可兼得,除非UEFI預設視窗大小也是最高解析度。

其次,UEFI具有一個獨特的功能,安全啟動,而EFI是沒有安全啟動的,安全啟動(Secure Boot),實際上通俗的解釋是叫做韌體驗證。開啟UEFI的安全啟動後,主機板會根據TPM晶片(或者CPU內建的TPM)記錄的硬體簽名對各硬體判斷,只有符合認證的硬體驅動才會被載入,而Win8以後的Windows則是在作業系統載入的過程中對硬體驅動繼續查簽名,符合Windows記錄的硬體才能被Windows載入,這在一定程度上降低了啟動型程式在作業系統啟動前被預載入造成的風險,但是這也會造成系統安裝變得壟斷。

無論EFI還是UEFI,都必須要有預載入環境、驅動執行環境、驅動程式等必要部分組成,為了支援部分舊裝置(如在UEFI下掛載傳統MBR硬碟,不支援UEFI啟動的顯示卡在UEFI下仍然支援執行等),還需要一個CSM相容性支援模組、EFI或UEFI都是僅支援GPT磁碟引導系統的,下面就具體談一下EFI或UEFI啟動計算機的過程。

一般地,預載入環境和驅動執行環境是儲存在UEFI(UEFI BIOS)晶片中的,當開啟電源開關時,電腦的主要部件都開始有了供電,與BIOS不同的是,UEFI預載入環境首先開始執行,負責CPU和記憶體(是全部容量)的初始化工作,這裡如出現重要問題,電腦即使有報警喇叭也不會響,因為UEFI沒有去驅動8255發聲,不過預載入環境只檢查CPU和記憶體,如果這兩個主要硬體出問題,螢幕沒顯示可以立即確定,另外一些主機板會有提供LED提示,可根據CPU或記憶體亮燈大致判斷故障。

CPU和記憶體初始化成功後,驅動執行環境(DXE)載入,當DXE載入後,UEFI就具有了列舉並載入UEFI驅動程式的能力,在此階段,UEFI會列舉搜尋各個硬體的UEFI驅動並相繼載入,完成硬體初始化工作,這相比BIOS的讀中斷載入速度會快的多,同樣如載入顯示卡的UEFI驅動成功,電腦也會出現啟動畫面,硬體驅動全部載入完畢後,最後同BIOS一樣,也得去啟動作業系統。

在啟動作業系統的階段,同樣是根據啟動記錄的啟動順序,轉到相應裝置(僅限GPT裝置,如果啟動傳統MBR裝置,則需要開啟CSM支援)的引導記錄,引導作業系統並進入,這裡需要注意的是,UEFI在檢測到無任何作業系統啟動裝置時,會直接進入UEFI設定頁面,而不是像BIOS那樣黑屏顯示相關資訊。

綜上對BIOS和UEFI啟動計算機過程的敘述,可以概括為:BIOS先要對CPU初始化,然後跳轉到BIOS啟動處進行POST自檢,此過程如有嚴重錯誤,則電腦會用不同的報警聲音提醒,接下來採用讀中斷的方式載入各種硬體,完成硬體初始化後進入作業系統啟動過程;而UEFI則是執行預載入環境先直接初始化CPU和記憶體,CPU和記憶體若有問題則直接黑屏,其後啟動PXE採用列舉方式搜尋各種硬體並載入驅動,完成硬體初始化,之後同樣進入作業系統啟動過程。

此外,BIOS是16位組合語言程式,只能執行在16位真實模式,可訪問的記憶體只有1MB,而UEFI是32位或64位高階語言程式(C語言程式),突破真實模式限制,可以達到要求的最大定址。