計算機硬件知識:BIOS、EFI與UEFI詳解!

本文估計很多小白看不懂,但是還是建議你硬着頭皮看完,這篇文章主要講解了這幾種“BIOS”的啓動方式,對電腦啓動問題判斷的理解會有益處。

BIOS是個程序,存儲在BIOS芯片中,而現在的新式電腦用的基本都是UEFI啓動,早期的過渡電腦用的都是EFI啓動。其實EFI或UEFI的一部分也是存儲在一個芯片中,由於它們在表面形式、基本功能上和BIOS差不多,所以習慣上我們也把存儲EFI/UEFI的芯片叫做EFI/UEFI BIOS芯片,EFI/UEFI也叫做EFI/UEFI BIOS,但在實際上它們和BIOS根本是不一樣的,所以最好還是把後面的“BIOS”尾巴去掉爲好,下面就來具體談一下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上實現文件讀寫,網絡瀏覽都是完全可能的。i,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語言程序),突破實模式限制,可以達到要求的最大尋址。

IT技術分享社區

個人博客網站:https://programmerblog.xyz

文章推薦程序員效率:畫流程圖常用的工具程序員效率:整理常用的在線筆記軟件遠程辦公:常用的遠程協助軟件,你都知道嗎?51單片機程序下載、ISP及串口基礎知識硬件:斷路器、接觸器、繼電器基礎知識

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