UEFI_Rootkit

**統一可延伸韌體介面**（英語：Unified Extensible Firmware Interface，縮寫 **UEFI**）是一種個人電腦系統規格，用來定義作業系統與系統韌體之間的軟體介面，作為 BIOS 的替代方案。可延伸韌體介面負責加電自檢（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 廠商安邁科技、Insyde、Phoenix。

## 規格

可延伸韌體介面（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.9 版是最新的公開的版本。

## 產生

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

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

## 與 BIOS 的比較

二者顯著的區別就是 UEFI 是用模組化，C 語言風格的參數堆疊傳遞方式，動態連結的形式構建的系統，較 BIOS 而言更易於實現，容錯和糾錯特性更強，縮短了系統研發的時間。它可以執行於 x86-64、IA32、ARM 等架構上（在個人電腦上通常是 x86-64 平台），突破傳統 16 位元代碼的定址能力，達到處理器的最大定址。它利用載入 UEFI 驅動程式的形式，辨識及操作硬體，不同於 BIOS 利用掛載真實模式中斷的方式增加硬體功能。後者必須將一段類似於驅動程式的 16 位元代碼（如 RAID 卡的 Option ROM）放置在固定的 0x000C0000 至 0x000DFFFF 之間儲存區中，執行這段代碼的初始化部分，它將掛載真實模式下約定的中斷向量向其他程式提供服務。例如，VGA 圖形及文字輸出中斷（INT 10h），磁碟存取中斷服務（INT 13h）等等。BIOS 以真實模式執行，因此這段記憶體空間很有限（在真實模式下僅能尋址最多 1MB 的記憶體），BIOS 對於所需放置的驅動程式代碼大小超過空間大小的情況無能為力。另外，BIOS 的硬體服務程式都以 16 位元代碼的形式存在，這就給執行於保護模式或長模式的作業系統存取其服務造成了困難。因此 BIOS 提供的 BIOS 中斷呼叫在現實中只能提供給作業系統的啟動程式或 MS-DOS 類作業系統使用。而 UEFI 系統下的驅動程式可以由 EFI Byte Code（EBC）編寫而成，EFI Byte Code 是一組專用於 EFI 驅動程式的虛擬機器語言，必須在 UEFI 驅動程式執行環境（Driver Execution Environment，DXE）下被解釋執行。由於 UEFI 驅動程式開發簡單，所有的 PC 部件提供商都可以參與，情形非常類似於現代作業系統的開發模式，這個開發模式曾使 Windows 在短短的兩三年時間內成為功能強大，效能優越的作業系統。基於 UEFI 驅動模型（UEFI driver model，UDM）可以使 UEFI 系統接觸到所有的硬體功能，在作業系統執行以前瀏覽全球資訊網站，實現圖形化、多語言的 BIOS 設定介面，或者無需執行作業系統即可線上更新 BIOS 等等不再是天方夜譚，甚至實現起來也非常簡單。這對基於傳統 BIOS 的系統來說是件難以實現的任務，在 BIOS 中添加幾個簡單的 USB 裝置支援都曾使很多 BIOS 設計師痛苦萬分，更何況除了添加對無數網路硬體的支援外，還得憑空構建一個 16 位元模式下的 TCP/IP 協定棧。

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

## 與作業系統的關係

UEFI 在概念上類似於一個低階的作業系統，並且具有操控所有硬體資源的能力。不少人感覺它的不斷發展將有可能代替現代的作業系統。事實上，EFI 的締造者們在第一版規範出台時就將 EFI 的能力限制於不足以威脅作業系統的統治地位。首先，它只是硬體和預啟動軟體間的介面規範；其次，UEFI 環境下不提供中斷的機制，也就是說每個 UEFI 驅動程式必須用輪詢（polling）的方式來檢查硬體狀態，並且需要以解釋的方式執行，較作業系統下的機械碼驅動效率更低；再則，UEFI 系統不提供複雜的快取記憶體保護功能，它只具備簡單的快取記憶體管理機制，具體來說就是指執行在 x64 或 x86 處理器的長模式或保護模式下，以最大定址能力為限把快取記憶體分為一個平坦的段（Segment），所有的程式都有權限存取任何一段位置，並不提供真實的保護服務。當 UEFI 所有組件載入完畢時，便會啟動作業系統的啟動程式，如果 UEFI 韌體內建 UEFI Shell，也可以啟動 UEFI Shell 命令提示。UEFI 應用程式（UEFI Application）和 UEFI 驅動程式（UEFI driver）是 PE 格式的.efi 檔案，可用 C 語言編寫。在 UEFI 啟動模式下，作業系統的啟動程式也是 UEFI 應用程式，啟動程式的 EFI 檔案儲存在 EFI 系統分割區（ESP）上。

UEFI 韌體區分架構，在 UEFI 啟動模式下，通常只能執行特定架構的 UEFI 作業系統和特定架構的 EFI 應用程式（EBC 程式除外）。比如，採用 64 位元 UEFI 韌體的 PC，在 UEFI 啟動模式下只能執行 64 位元作業系統啟動程式；而在 Legacy 啟動模式（即 BIOS 相容啟動模式）下，既可以執行 16 位元的作業系統（如 DOS），也可以執行 32 位元作業系統和 64 位元作業系統。

## 組成

一般認為，UEFI 由以下幾個部分組成：

1. Pre-EFI 初始化模組（PEI）
2. UEFI 驅動程式執行環境（DXE）
3. UEFI 驅動程式（UEFI driver）
4. 相容性支援模組（CSM）
5. UEFI 高層應用（UEFI Application）
6. GUID 磁碟分割區表
7. 系統管理模式（SMM）

Pre-EFI 初始化程式在系統開機的時候最先得到執行，它負責最初的 CPU，晶片組及主記憶體的初始化工作，緊接著載入 UEFI 的驅動程式執行環境（DXE）。當 DXE 被載入執行時，系統便具有了列舉並載入其他 UEFI 驅動程式的能力。DXE 列舉並載入各種匯流排（包括 PCI、SATA、USB、ISA）及硬體的 UEFI 驅動程式。例如一個具 PCI-E 匯流排介面的 RAID 儲存配接器，其 UEFI 驅動程式一般會放置在這個裝置的 Option ROM 中。在 UEFI 規範中，一種突破傳統 MBR 磁碟分割區結構限制的 GUID 磁碟分割區系統（GPT）被引入，新結構中，磁碟的主分割區數不再受限制（在 MBR 結構下，只能存在 4 個主分割區），另外 UEFI+GPT 結合還可以支援 2.1 TB 以上硬碟。在眾多的分割區類型中，EFI 系統分割區可以被 UEFI 韌體存取，可用於存放作業系統的引導程式。UEFI 韌體通過執行 EFI 系統分割區中的啟動程式啟動作業系統。CSM 是在 x86 平台 UEFI 系統中的一個特殊的模組，它將為不具備 UEFI 引導能力的作業系統以及 16 位元的傳統 Option ROM 提供類似於傳統 BIOS 的系統服務。在載入作業系統後，UEFI 的 SMM 程式繼續執行，提供 ACPI 等服務。

## 發展

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

## 作業系統支援

Linux 核心自 2000 年開始，已經支援 EFI 啟動。早期使用 ELILO 作為 EFI 下的啟動程式。現在，GRUB 的 EFI 版本已代替 ELILO，大多數 Linux 發行版已使用 GRUB 作為 UEFI 下的啟動程式。從 Linux 版本 3.15 起，來自英代爾的工程師 Matt Fleming 將 64 位元核心提供了支援 32 位元 UEFI 韌體的可能，前提只需要 UEFI 作業系統啟動程式支援 EFI handover 協定 ，譬如流行的 GRUB2。同樣流行的 32 位元版 Linux，譬如 Ubuntu 16.04.3 LTS，也可以使用這類啟動程式在 64 位元版 UEFI 韌體的機器上使用。

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

從 Windows Vista SP1 開始，x86-64 架構的 Windows 作業系統已支援 UEFI。但是，若在 UEFI 模式下安裝和啟動 Windows Vista SP1 或 Windows 7，需要在 UEFI 韌體設定中開啟 CSM，因為在 Windows 8 之前的版本中，均不支援 UEFI 標準的「圖形輸出協定」（GOP），只支援用於傳統 BIOS 的 VESA BIOS Extension。32 位元的 Windows Vista 和 Windows 7 不支援 UEFI 啟動。從 Windows 8 開始，支援 Secure Boot，UEFI 模式下的啟動亦無須 CSM。

現在，x86-64 架構的 FreeBSD、OpenBSD 和 NetBSD 已支援 UEFI。

### 虛擬機器對 UEFI 的類比

VMware Workstation 支援對 UEFI 的類比，但是在 VMware Workstation 11 以前，VMware Workstation 並未正式支援 UEFI，需要手動編輯虛擬機的.vmx 檔案以開啟虛擬機器的 UEFI。VMware Workstation 11 及以後的版本正式支援對 UEFI 的類比。從 VMware Workstation 14 開始支援 Secure Boot。

VirtualBox 支援對 UEFI 的類比，但是 VirtualBox 的 UEFI 並不支援 Windows Vista 和 Windows 7。

QEMU/KVM 可通過 OVMF 支援對 UEFI 的類比。

微軟 Hyper-V 的第二代虛擬機器支援對 UEFI 的類比，以及 Secure Boot。

Parallels Desktop 不僅提供全規格的 UEFI 支援，並支援在作業系統不支援「圖形輸出協定」（GOP）的情況下回退至傳統 BIOS

## 採用 UEFI 韌體的 x86/x64 系統類別

類別 0，這類系統使用 x86 BIOS 韌體，只支援傳統作業系統。

類別 1，這類系統採用支援 UEFI 和 Pi 規範的韌體，啟用 CSM 層功能，只支援傳統作業系統。

類別 2，這類系統採用支援 UEFI 和 Pi 規範的韌體，啟用 CSM 層功能，同時支援傳統和 UEFI 啟動的作業系統。

類別 3，這類系統採用支援 UEFI 和 Pi 規範的韌體，不再提供或完全關閉 CSM 層功能，只支援由 UEFI 啟動的作業系統。

類別 3+，在類別 3 的系統基礎上提供並啟用 Secure Boot 功能。

微軟公司的 Windows 11 僅可用於類別 3 + 型電腦，Windows 8 及 Windows 10 適用於上述所有類別的電腦，x64 型版的 Windows Vista SP1 和 Windows 7，以及不支援 UEFI 韌體的作業系統僅可用於類別 0 至類別 2 型電腦。所有支援 UEFI 啟動的 Linux 作業系統適用於類別 0 至類別 3 型電腦，多數現行分發版也支援類別 3 + 中的 Secure Boot 功能，譬如 Ubuntu 等。 Intel 計劃將於 2020 年推出的 UEFI Class 3 規範中，將 CSM 層功能捨棄，不再支援由當年 IBM 公司制定的 BIOS 平台，Intel 旗下的所有產品將遵循 UEFI 類別 3（有一部分產品可能是 3+）型規範。

## 批評

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

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

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

### Secure Boot

中文名又譯作「**安全啟動**」，該協定定義在 UEFI 2.3.1 Errata C 規範中。Secure Boot 只允許載入有適當數位簽章的 EFI 驅動程式和 EFI 啟動程式，因此 Secure Boot 可讓啟動過程更安全。

但是 Red Hat 開發者 Matthew Garrett 在他的文章 "UEFI secure booting" 中憂慮 UEFI 的 Secure Boot 功能可能會影響 Linux（貼有 Windows 8 認證貼紙的機器，預設 Secure Boot 啟動，只預載了 OEM 和微軟金鑰，可能無法以 Linux 啟動）。微軟回應稱顧客可以停用 UEFI 韌體中的 secure boot。然而，某些 OEM 廠商仍然可能在其產品中省略這項功能。稍晚，報告指出微軟顯然禁止在 ARM 系統上實作停用 Secure Boot 的功能。

自由軟體基金會（FSF）的 Josh Gay 對 UEFI 的 "Secure Boot" 實作提出憂慮，並發表公開聲明及連署說：

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

2012 年 1 月，微軟釋出一份關於 OEM 硬體認證的檔案，指出所有的 x86 和 x86-64 裝置應該將 UEFI Secure Boot 啟動，不過可以改用一個可讓使用者增加數位簽章的自訂 Secure Boot 模式。然而，無法在執行 Windows 的 ARM 裝置上修改或禁用 Secure Boot。。這份稱為 Windows 硬體認證需求（英語：Windows Hardware Certification Requirements）證實了執行 Windows 8、基於 ARM 的裝置被禁止了任何安裝其他作業系統的可能性。現在，Ubuntu、Fedora、openSUSE、RHEL（從 RHEL 7 開始）、CentOS（從 CentOS 7 開始）、Debian（從 Debian 10 開始）等 Linux 發行版已經支援 Secure Boot。Windows 8、Windows 8.1、Windows 10 支援 Secure Boot。

## 注釋

## 參見

* BIOS
* ACPI
* SMBIOS
* x86-64
* 統一可延伸韌體介面論壇

## 外部連結

* 官方網站 （頁面存檔備份，存於網際網路檔案館）
* 統一可延伸韌體介面論壇 （頁面存檔備份，存於網際網路檔案館）
* 英特爾公司對 EFI 的標準實現：Intel EFI 創新架構 （頁面存檔備份，存於網際網路檔案館）
* 英特爾公司發起的 EFI 核心實現的一個半開源的計劃 TianoCore （頁面存檔備份，存於網際網路檔案館）