本頁使用了標題或全文手工轉換

統一可延伸韌體介面

維基百科,自由的百科全書
前往: 導覽搜尋
可擴展韌體介面在軟件堆疊裡的位置

統一可延伸韌體介面Unified Extensible Firmware Interface, UEFI)是一種個人電腦系統規格,用來定義作業系統與系統固件之間的軟件界面[需要消歧義],作為BIOS的替代方案[1]。可擴展固件接口負責加電自檢(POST)、連繫作業系統以及提供連接作業系統與硬體的介面。

UEFI的前身是Intel在1998年開始開發的Intel Boot Initiative,後來被重命名為可延伸韌體介面Extensible Firmware Interface, EFI)。Intel在2005年將其交由統一可擴展固件接口論壇(Unified EFI Forum)來推廣與發展,為了凸顯這一點,EFI也更名為UEFI(Unified EFI)。UEFI論壇的創始者是11家知名電腦公司,包括Intel、IBM等硬件廠商,軟件廠商Microsoft,及BIOS廠商AMIInsydePhoenix

規格[編輯]

可延伸韌體介面(EFI)最初是由英特爾開發,於2002年12月英特爾釋出其訂定的版本——1.1版,之後英特爾不再有其他關於EFI的規範格式發布。有關EFI的規範,英特爾已於2005年將此規範格式交由UEFI論壇來推廣與發展,後來並更改名稱為Unified EFI(UEFI)。UEFI論壇於2007年1月7日釋出並發放2.1版本的規格,其中較1.1版本增加與改進了加密編碼(cryptography)、網絡認證(network authentication)與用戶接口架構(User Interface Architecture)。

相關方面的制定[編輯]

2009年5月9日,發布2.3版本。截至今日為止,2.6(Errata A)版是最新的公開的版本。

統一可延伸韌體介面(UEFI)的產生[編輯]

EFI開機管理員與 EFI drivers的溝通方式

眾所周知,英特爾在近二十年來引領以x86系列處理器為基礎的PC技術潮流,其產品如CPU芯片組等在PC生產線中占據絕對領導的位置。因此,不少人認為此舉顯示了英特爾公司欲染指固件產品市場的野心。事實上,EFI技術源於英特爾安騰處理器(Itanium)平台的推出。安騰處理器是英特爾瞄準服務器高端市場投入近十年研發力量設計產生的與x86系列完全不同的64位新架構。在x86系列處理器進入32位的時代,由於相容性的原因,新的處理器(80386)保留了16位的運行方式(實模式),此後多次處理器的升級換代都保留了這種運行方式。甚至在含64位擴展技術至強系列處理器中,處理器加電啟動時仍然會切換到16位的實模式下運行。英特爾將這種情況歸咎於BIOS技術的發展緩慢。自從IBM PC兼容機廠商通過淨室的方式複製出第一套BIOS源程序,BIOS就以16位匯編代碼,寄存器參數調用方式,靜態鏈接,以及1MB以下內存固定編址的形式存在了十幾年。雖然由於各大BIOS廠商近年來的努力,有許多新元素添加到產品中,如PnP BIOS,ACPI,傳統USB設備支援等等,但BIOS的根本性質沒有得到任何改變。這迫使英特爾在開發新的處理器時,都必須考慮加進使效能大大降低的相容模式。有人曾打了一個比喻:這就像保時捷新一代的全自排跑車,被人套上去一個蹩腳打檔器。

然而,安騰處理器並沒有這樣的顧慮,它是一個新生的處理器架構,系統固件和操作系統之間的接口都可以完全重新定義。並且這一次,英特爾將其定義為一個可擴展的,標準化的固件接口規範,不同於傳統BIOS的固定的,缺乏文檔的,完全基於經驗和晦澀約定的一個事實標準。基於EFI的第一套系統產品的出現至今已經有五年的時間,如今,英特爾試圖將成功運用在高端服務器上的技術推廣到市場占有率更有優勢的PC產品線中,並承諾在2006年間會投入全力的技術支持。

比較統一可延伸韌體介面(UEFI)和BIOS[編輯]

二者顯著的區別就是UEFI是用模塊化,C語言風格的參數堆棧傳遞方式,動態鏈接的形式構建的系統,較BIOS而言更易於實現,容錯和糾錯特性更強,縮短了系統研發的時間。它可以執行於x86-64、IA32、IA64等架構上(在個人電腦上通常是x86-64平台),突破傳統16位代碼的尋址能力,達到處理器的最大尋址。它利用加載EFI驅動程序的形式,識別及操作硬件,不同於BIOS利用掛載真實模式中斷的方式增加硬件功能。後者必須將一段類似於驅動程序的16位代碼(如RAID卡的Option ROM)放置在固定的0x000C00000x000DFFFF之間存儲區中,運行這段代碼的初始化部分,它將掛載實模式下約定的中斷向量向其他程序提供服務。例如,VGA圖形及文本輸出中斷(INT 10h),磁盤存取中斷服務(INT 13h)等等。由於這段存儲空間有限(128KB),BIOS對於所需放置的驅動程序代碼大小超過空間大小的情況無能為力。另外,BIOS的硬件服務程序都以16位代碼的形式存在,這就給運行於增強模式的操作系統訪問其服務造成了困難。因此BIOS提供的服務在現實中只能提供給操作系統引導程序或MS-DOS類操作系統使用。而UEFI系統下的驅動程序可以由EFI Byte Code(EBC)編寫而成,EFI Byte Code是一組專用於EFI驅動程序的虛擬機器語言,必須在EFI驅動程序運行環境(Driver Execution Environment,或DXE)下被解釋運行。採用EBC編寫的EFI驅動程式擁有向下相容性,打個比方說,一個帶有EFI驅動程序的擴展設備,既可以將其安裝在安騰處理器的系統中,也可以安裝於支持UEFI的64位/32位PC系統中,而它的EFI驅動不需要重新編寫。這樣就無需對系統升級帶來的兼容性因素作考慮。另外,由於EFI驅動程序開發簡單,所有的PC部件提供商都可以參與,情形非常類似於現代操作系統的開發模式,這個開發模式曾使Windows在短短的兩三年時間內成為功能強大,性能優越的操作系統。基於EFI的驅動模型可以使UEFI系統接觸到所有的硬體功能,在作業系統執行以前瀏覽全球資訊網站,實現圖形化、多語言的BIOS設定界面,或者無需執行作業系統即可線上更新BIOS等等不再是天方夜譚,甚至實現起來也非常簡單。這對基於傳統BIOS的系統來說是件難以實現的任務,在BIOS中添加幾個簡單的USB設備支持都曾使很多BIOS設計師痛苦萬分,更何況除了添加對無數網絡硬件的支持外,還得憑空構建一個16位模式下的TCP/IP協議棧

一些人認為BIOS只不過是由於兼容性問題遺留下來的無足輕重的部分,不值得為它花費太大的升級努力。而反對者認為,當BIOS的出現約制了PC技術的發展時,必須有人對它作必要的改變。

統一可延伸韌體介面(UEFI)和操作系統[編輯]

UEFI在概念上非常類似於一個低階的操作系統,並且具有操控所有硬件資源的能力。不少人感覺它的不斷發展將有可能代替現代的操作系統。事實上,EFI的締造者們在第一版規範出台時就將EFI的能力限制於不足以威脅操作系統的統治地位。首先,它只是硬件和預啟動軟件間的接口規範;其次,UEFI環境下不提供中斷的機制,也就是說每個EFI驅動程序必須用輪詢(polling)的方式來檢查硬件狀態,並且需要以解釋的方式運行,較操作系統下的機械碼驅動效率更低;再則,UEFI系統不提供複雜的緩存器保護功能,它只具備簡單的緩存器管理機制,具體來說就是指運行在x64x86處理器的64位元模式或保護模式下,以最大尋址能力為限把緩存器分為一個平坦的段(Segment),所有的程序都有權限存取任何一段位置,並不提供真實的保護服務。當UEFI所有組件加載完畢時,便會啟動作業系統啟動程式,也可以啟動一個類似於操作系統Shell的命令解釋環境(即EFI Shell,部分UEFI固件內置EFI Shell),在這裡,用戶可以調入執行任何EFI應用程序,這些程序可以是硬件檢測及除錯軟件,開機管理軟體,設置軟件,作業系統的啟動程式等等,也可以載入EFI分區(ESP)中的EFI驅動程式(如檔案系統驅動程式)。EFI應用程式和EFI驅動程式可以是PE格式的.efi檔案,可用C語言編寫。在UEFI開機模式下,作業系統的啟動程式也是EFI應用程式,啟動程式的EFI檔案儲存在EFI系統分區(ESP)上。理論上來說,對於EFI應用程序的功能並沒有任何限制,任何人都可以編寫這類軟件,並且效果較以前MS-DOS下的軟件更華麗,功能更強大。一旦引導軟件將控制權交給操作系統,所有用於引導的服務代碼將全部停止工作,部分運行時,代服務程序還可以繼續工作,以便於操作系統一時無法找到特定設備的驅動程序時,該設備還可以繼續被使用。

UEFI韌體區分架構,在UEFI開機模式下,通常只能執行特定架構的UEFI作業系統和特定架構的EFI應用程式(EBC程式除外)。比如,採用64位元UEFI韌體的PC,在UEFI開機模式下只能執行64位元作業系統;而在Legacy開機模式(即BIOS相容開機模式)下,通常不區分作業系統的位元數,既可以執行16位元的作業系統(如DOS),也可以執行32位元或64位元的作業系統,和BIOS一樣。

統一可延伸韌體介面(UEFI)的組成[編輯]

一般認為,UEFI由以下幾個部分組成:

  1. Pre-EFI初始化模塊
  2. EFI驅動程序執行環境
  3. EFI驅動程序
  4. 兼容性支持模塊(CSM)
  5. EFI高層應用
  6. GUID磁盤分區表

在實現中,統一可延伸韌體介面(UEFI)初始化模塊和驅動執行環境通常被集成在一個只讀存儲器中。Pre-EFI初始化程序在系統開機的時候最先得到執行,它負責最初的CPU,主橋及存儲器的初始化工作,緊接着載入EFI驅動程序執行環境(DXE)。當DXE被載入運行時,系統便具有了枚舉並加載其他EFI驅動程序的能力。在基於PCI架構的系統中,各PCI橋及PCI適配器的EFI驅動程序會被相繼加載及初始化;這時,系統進而枚舉並加載各橋接器及適配器後面的各種總線及設備的EFI驅動程序,周而復始,直到最後一個設備的EFI驅動程序被成功加載。正因如此,EFI驅動程序可以放置於系統的任何位置,只要能保證它可以按順序被正確枚舉。例如一個具PCI-E總線接口的RAID存儲適配器,其EFI驅動程序一般會放置在這個設備的符合PCI規範的擴展只讀存儲器(PCI Expansion ROM)中,當PCI總線驅動程序被加載完畢,並開始枚舉其子設備時,這個存儲適配器旋即被正確識別並加載它的EFI驅動程序。部分EFI驅動程序還可以放置在某個磁盤的EFI系統分區(ESP)中,只要這些驅動程序不是用於加載這個磁盤的驅動的必要部件。在EFI規範中,一種突破傳統MBR磁盤分區結構限制的GUID磁盤分區系統(GPT)被引入,新結構中,磁盤的主分區數不再受限制(在MBR結構下,只能存在4個主分區),另外EFI/UEFI+GUID結合還可以支持2.1 TB以上硬盤(有測試顯示,3TB硬盤使用MBR,並且安裝Windows 6.x 64位系統,只能識別到2.1TB),並且分區類型將由GUID來表示。在眾多的分區類型中,EFI系統分區可以被UEFI固件存取,可用於存放操作系統的引導程序、EFI應用程序和EFI驅動程序。EFI系統分區採用FAT檔案系統(UEFI不支援exFAT),容量小,在Windows作業系統下,預設是隱藏的。UEFI韌體通過執行EFI系統分區中的啟動程式啟動作業系統。CSM是在x86平台UEFI系統中的一個特殊的模塊,它將為不具備UEFI引導能力的操作系統(如Windows XP)以及16位的傳統Option ROM(即非EFI的Option ROM)提供類似於傳統BIOS的系統服務。Secure Boot和CSM不相容,因此在UEFI韌體設定中開啟CSM前,需要在UEFI韌體設定中關閉Secure Boot。

統一可延伸韌體介面(UEFI)的發展[編輯]

英特爾無疑是推廣EFI的積極因素,近年來由於業界對其認識的不斷深入,更多的廠商正投入這方面的研究。包括英特爾,AMD在內的一些PC生產廠家聯合成立了UEFI論壇。另外各大BIOS提供商如Insyde,Phoenix,AMI等,他們原先被認為是EFI發展的阻礙力量,現在也不斷的推出各自的解決方案。分析人士指出,這是由於BIOS廠商在EFI架構中重新找到了諸如Pre-EFI啟動環境之類的市場位置,然而隨着EFI在PC系統上的成功運用,以及英特爾新一代芯片組的推出,這一部分市場份額將會不出意料的在英特爾的掌控之中。2011年以後生產的電腦主機板大多數採用UEFI技術。部分採用EFI技術的BIOS並不支援EFI開機。

作業系統支援[編輯]

Linux內核自2000年開始,已經支援EFI啟動。早期使用ELILO作為EFI下的啟動程式。現在,GRUB的EFI版本已代替ELILO,大多數Linux發行版已使用GRUB作為UEFI下的啟動程式。

安騰版本的Windows 2000已於2002年加入對EFI 1.10的支持。安騰版本的Windows Server 2003Windows XP 64-Bit Edition(以IA-64架構作為執行平台)已支援EFI。

Windows Vista SP1開始,x86-64架構的Windows作業系統已支援UEFI。但是,若在UEFI模式下安裝和啟動Windows Vista SP1或Windows 7,需要在UEFI韌體設定中開啟CSM。32位元的Windows Vista和Windows 7不支援UEFI啟動。從Windows 8開始,支援SecureBoot,UEFI模式下的啟動亦無須CSM,32位元版本的Windows 8亦支援32位元的UEFI(不支援64位元的UEFI)。

現在,x86-64架構的FreeBSDOpenBSDNetBSD已支援UEFI。

虛擬機器對UEFI的模擬[編輯]

VMware Workstation支援對UEFI的模擬,但是在VMware Workstation 11以前,VMware Workstation並未正式支援UEFI,需要手動編輯虛擬機的.vmx檔案以開啟虛擬機器的UEFI。VMware Workstation 11及以後的版本正式支援對UEFI的模擬。

VirtualBox支援對UEFI的模擬,但是VirtualBox的UEFI並不支援Windows Vista和Windows 7。

QEMU/KVM可通過OVMF支援對UEFI的模擬。

微軟Hyper-V英語Hyper-V的第二代虛擬機器支援對UEFI的模擬,以及Secure Boot。

批評[編輯]

Ronald G. Minnich(coreboot的共同作者)和 Cory Doctorow(科幻小說家)和數位權利運動者批評EFI是企圖藉由禁止使用者完整控制他們的電腦,來保護智慧財產權[2][3]它並沒有解決BIOS長期以來對多數硬體需要兩種不同驅動程式的問題--一個給韌體,一個給作業系統[4]

TianoCore(一個提供製作基於UEFI自由韌體工具的開放原始碼專案)[5]缺乏用來啟動晶片組的專門的驅動程式,因此需要晶片組廠商提供額外的功能。TianoCore是coreboot的一個附加選項,它包含了啟動晶片組的程式碼。

由於UEFI比起原先的BIOS技術可以對遠端網路開機提供更高的彈性,因此在標準的安全規定有一些疑慮。[6]

Secure Boot[編輯]

在UEFI 2.3.1 Errata C規範中定義了一項名為「Secure Boot」的協定,Secure Boot只允許載入有適當數位簽章的EFI驅動程式和EFI啟動程式,因此Secure Boot可讓開機過程更安全。但是Red Hat開發者Matthew Garrett在他的文章"UEFI secure booting"中憂慮UEFI的Secure Boot功能可能會影響Linux(貼有Windows 8認證貼紙的機器,預設Secure Boot啟動,只預載了OEM微軟金鑰,可能無法以Linux開機)。[7][8]微軟回應稱顧客可以停用UEFI韌體中的secure boot。[9][10]然而,某些OEM廠商仍然可能在其產品中省略這項功能。稍晚,報告指出微軟顯然禁止在ARM系統上實作停用Secure Boot的功能。[11][12]

自由軟體基金會(FSF)的Josh Gay對UEFI的"secure boot"實作提出憂慮,並發表公開聲明及連署說:

我們—連署者—敦促所有實作了UEFI中稱為"Secure Boot"的電腦製造商立即允許自由的作業系統可以被安裝。基於尊重使用者的自由權以及確切保護使用者安全,製造商必須允許電腦擁有者停用開機限制,或是提供一個確切可能的方法讓他們安裝並執行自由的作業系統。我們承諾我們將不會購買、也不會推薦剝奪使用者重要自由的電腦,並且,我們將積極地敦促社會大眾避免如此禁錮使用者的系統。[13][14]

2012年1月,微軟釋出一份關於OEM硬體認證的文件,指出所有的x86x86-64裝置應該將UEFI Secure Boot啟動,不過可以改用一個可讓使用者增加數位簽章的自訂secure boot模式。然而,在執行Windows的ARM裝置上使用自訂secure boot模式或停用都是不可能的[15]。這份稱為Windows Hardware Certification Requirements(Windows硬體認證需求)[16]證實了執行Windows 8、基於ARM的裝置被禁止了任何安裝其他作業系統的可能性。現在,UbuntuFedoraopenSUSERHEL(從RHEL 7開始)、CentOS(從CentOS 7開始)等Linux發行版已經支援SecureBoot。Windows 7並不支援Secure Boot。

注釋[編輯]

參看[編輯]

外部連結[編輯]