Unified Extensible Firmware Interface

Unified Extensible Firmware Interface（ユニファイド・エクステンシブル・ファームウェア・インタフェース、UEFI）はオペレーティングシステム（OS）とプラットフォームファームウェアとの間のソフトウェアインタフェースを定義する仕様である。
UEFIを採用したSystem BIOSは「UEFI BIOS」と呼ばれるが、単に「UEFI」と略されることが多い。UEFI BIOSはIBM PC互換機に採用された古いSystem BIOSのよりセキュアな置き換えを意図している。遠隔診断やOSがロードされていない状態での修復なども可能とする。「BIOS」とは異なり、「UEFI」の読みは特に定められていない。
UEFIの元となる EFI (Extensible Firmware Interface) 仕様は元々インテルとヒューレットパッカードによって開発された。2005年、EFI 1.10に基づいてUEFIへと発展した。UEFI仕様は業界団体Unified EFI Forumの下で開発されている。
UEFI自体は単なる「インタフェースの仕様」であるため、特定のプロセッサに依存しない。これまでのBIOSとは異なり、近代的なソフトウェア開発手法を用いることが推奨されており、C言語で実装したものなどが代表的である。

歴史

そもそもEFIが開発された動機は、1990年代中盤のインテルとヒューレットパッカードによる初代Itanium機の開発初期にまでさかのぼる。IBM PC由来のSystem BIOSなどの制限（16ビットプロセッサモード、1MBのアドレス空間、PC/ATハードウェアへの依存など）によって、従来の各種スキームはItaniumの（当初の）ターゲットである巨大なサーバプラットフォームには採用できなかった。その課題に対する最初の成果が、1998年にIntel Boot Initiativeと呼ばれ、後にEFIと名前を変えた。
EFI仕様1.02は2000年12月12日にインテルによってリリースされた（最初に発行されたものはバージョン1.01であったが、法的な不備や商標などのミスによりすぐに取り下げられている）。
EFI仕様1.10は2002年12月1日にインテルによってリリースされた。これには、バージョン1.02からのいくつかの細かい機能強化と、EFIドライバのモデルが記載されていた。
2005年、インテルは、同仕様の普及を行うために設立されたUnified EFI ForumへEFIの権利を移管した。以後は同フォーラムがEFI仕様の開発と普及につとめている。これを反映して、EFIはUnified EFI（UEFI）と名前を変え、多くのドキュメントが両方の用語を同じ意味で使用するようになった。元々のEFI仕様は依然としてインテルに所有権があり、EFIベースの製品へのライセンスもインテルが提供しているが、UEFI仕様は同フォーラムが所有している。
2007年1月7日、UEFI仕様バージョン2.1がリリースされた。暗号化の改善、ネットワーク認証、ユーザインタフェースのアーキテクチャ（UEFI中にある対人インタフェース）が追加されている。最新のUEFI規格は2.6（Errata A）である。
インテルによる開発から10年以上たった2011年、2TB以上の容量を持つハードディスクに対応するために、P67、H67、H61、Z68チップセットを使用したマザーボードでUEFIの採用が本格化した。

ディスクのサポート

マスターブートレコード（MBR）などの標準的なPCのディスクパーティションの処理に加えて、EFIではGUIDパーティションテーブル（GPT）をサポートしている。これによりPCでのディスクパーティションの容量の限界と領域の数の制限は拡張され、同じ時期に開発された2TB以上のシリアルATA接続の内蔵ハードディスクからの起動がサポートされた。GPTでのディスクとパーティションの最大サイズは9.4ZB（2⁷³バイト）である。EFI規格ではファイルシステムには言及していないが、UEFI規格ではFAT12、FAT16、FAT32のサポートを必須としている。

プロセッサのサポート

バージョン2.3では、Itanium、x86、x86_64、ARMアーキテクチャをサポートしている（バインディングが存在する）。
System BIOSは16ビットのIntel 8088を採用したIBM 5150の設計に基づいているため、16ビット・プロセッサモードと1MBのアドレス空間という制限があった。一方、UEFIのプロセッサモードは32ビット（x86-32、ARM）または64ビット（x86-64、Itanium）である。64ビットのUEFIではロングモードも可能であり、ブート前の環境で64ビットアドレッシングの全メモリに直接アクセス可能である。
UEFIでは、ファームウェアとOSのアドレス空間が一致していなければならない。たとえば、64ビットのUEFIからは64ビットのオペレーティングシステムしかブートできない。

ブートサービス

EFIはブートサービスを定義していて、これにはさまざまなデバイス上でテキストおよびグラフィカルなコンソールが利用できる機能や、バスやブロックデバイス、ファイルシステムの機能が含まれる。ブートサービスは「ExitBootServices」を呼び出すまでのファームウェアがプラットフォームを制御している状態でのみ利用可能である。また、OS動作中も利用できるランタイムサービスとしては、日付や時間、NVRAMの管理サービスなどがある。

プロトコル

EFIでは2つのバイナリモジュール間の通信に使うソフトウェアインタフェース群をプロトコルとして定義している。全てのEFIドライバは、このプロトコルに則って他のモジュールにサービスを提供しなければならない。

デバイスドライバ

EFIの仕様では、標準的なアーキテクチャ依存のデバイスドライバに加えて、プロセッサに依存しないデバイスドライバ実行環境を提供しており、EFI Byte CodeまたはEBCと呼ばれている。システムのファームウェアは、その環境にロードされたもしくはその環境内にあるEBCイメージ用のインタプリタを実行できることを、UEFI仕様によって要求されている。その点、EBCはOpen Firmwareに似ている。これはハードウェアに依存しないファームウェアで、PowerPCベースのアップルのMacintoshやサン・マイクロシステムズのSPARCコンピュータなどの間で採用された。
いくつかのアーキテクチャに特化した（非EBCな）EFIデバイスドライバはOSから利用可能なインタフェースを持つことができる。これにより、OSに特化したドライバをロードしなくても、基本的なグラフィックスやネットワーク機能についてはOSがEFIに頼ることができる。

ブートマネージャー

EFIブートマネージャーはまたOSを選択してロードするのにも使うことができる。これにより専用のブートローダ機構は必要がなくなる（OSのブートローダはEFIアプリケーションになる）。この場合、ブートセクタを使用せずに済むが、最初にロードすべき標準で定められた名前のファイルを、特殊なパーティションテーブルから参照できるようにしておく必要がある（ファイル名の例：\EFI\BOOT\boot[architecture name].efi）。
OSのブートローダーはUEFIアプリケーションの一種となるので、ファームウェアからアクセス可能なファイルシステム上にファイルとして格納しておく。NVRAMに格納されたブート変数で、そのローダーのパスを示す。ブートローダーはファームウェアから自動検出することも可能で、たとえばリムーバブル・デバイスからのブートも可能となっている。
また、特定のハードウェアやオペレーティングシステムに依存しないように、UEFIアプリケーションのバイナリコードの記述には、マイクロソフトが開発した、ハードウェアやOSに依存しないバイナリフォーマットであるPortable Executable（PE）フォーマットを用いることが定められている。

セキュアブート

UEFIセキュアブートは、起動対象のオペレーティングシステムの電子署名を検証して正当なソフトウェアであることが確認できた場合にのみブート処理を継続する 。
WindowsマークのあるマシンではセキュアブートにMicrosoftの電子署名が使われており、Windows 8以降はセキュアブート電子署名が付与されている。一方で、Windows 7以前のオペレーティングシステムやLinuxディストリビューションは電子署名が付与されていないため、セキュアブートが有効なUEFIブートローダーでは起動できない。
マイクロソフトがリリースしたWindows 8 OEM製品のハードウェア認定に関する文書によれば、x86およびx86-64を採用した全デバイスはセキュアなUEFIを有効にしなければならないが、カスタム・セキュアブート・モードでユーザーがシグネチャを追加できる手段を提供すると記述されている。一方、Windowsの動作するARMデバイスでは、セキュアブートを無効にできる実装を禁止しているため、カスタム・セキュアブート・モードへの移行もセキュアブートの無効化も不可能である。Windows 10のハードウェア認定要件ではセキュアブートの無効化手段の提供はオプションとなった。
マイクロソフトは、実費でマイクロソフトの鍵によって署名を行うサービスを提供している。Fedora、openSUSE、Ubuntu、RHEL（RHEL 7から）、CentOS（CentOS 7から）などのLinuxディストリビューションは、この署名サービスによって署名された軽量ブートローダを用いることでセキュアブート（の鍵配布と鍵インストールに纏わる問題）に対応している。セキュアブートへの対応を計画しているFreeBSDもマイクロソフトの署名サービスを利用する計画である。

EFIシェル

EFIコミュニティはオープンソースなシェル環境を作った。これはちゃんとしたOSを直接起動するのではなく、なんらかの実装上でユーザがEFIシェルと呼ぶものを起動することができる。このシェルはEFIアプリケーションであり、プラットフォームのROM内に直接焼きこまれているか、ROM内のデバイスドライバが制御できるデバイス内に存在する必要がある。
EFIシェルは、他のEFIアプリケーション、たとえばシステムの起動やOSのインストール、システムの診断や設定、システムのフラッシュROMのアップデートなどに使われる。このことにより、完全なOSを起動することなしにCDやDVDを再生したり、必要な機能を持つEFIアプリケーションを実行することができる。また、シェルのコマンドを使って、ファームウェアがサポートしているファイルシステム間同士で直接ファイルのコピーや移動を行うこともできる。デバイスドライバは動的にロードとアンロードができ、完全なTCP/IPスタックもまたシェル内から利用することができる。
EFIシェルにはスクリプトファイルの機能があり、拡張子には .nsh を使う。バッチファイルに似ており、コマンドにはUnixまたはMS-DOSのコマンドに類似したものがある。

拡張機能

EFIの拡張機能は、コンピュータに搭載されている不揮発性のストレージデバイスからロードされる。たとえば、マザーボード上のROMに格納されている標準EFIファームウェアに機能を追加するために、OEMがハードディスクにEFIパーティションを作って、そのシステムを販売することができる。

Intel Platform Innovation Framework for EFI

Intel Platform Innovation Framework for EFI（元々Tianoというコードネームで呼ばれていた）はEFIサポートを含み、完全でレガシーフリーなファームウェア実装である。これは、Compatibility Support Module（CSM）と呼ばれるものを通してレガシーなSystem BIOSのサポートが可能である。
特に、このフレームワークには、電源投入後のプラットフォームの初期化に必要なすべての処理が含まれている。これらのファームウェアの内部動作はEFIの仕様には定義されていないが、Platform Initialization Specification（PI Specification）に記載されている。
インテルはこのフレームワークを完全な形でエンドユーザーに提供しているわけではない。アメリカンメガトレンド（AMI）やInsyde Software、Phoenix Technologiesなど、独立したBIOSベンダーに対してファームウェアの提供が行われているので、それらを通じて利用が可能である。
フレームワークの一部は、EFI Developer Kit（EDK）という名前でTianoCore projectでオープンソースとしてリリースされている。この実装は、EFIといくつかのハードウェア初期化コードを含んでいるが、それ自身で完全な機能を持つファームウェアを構成できるわけではない。このコードにはBSDライセンスとEclipse Public Licenseを含むいくつかのライセンスが適用されている。TianoCoreはcorebootのペイロードとしても利用できる。

EFIおよびこのフレームワークを用いたプラットフォーム

インテルの最初のItaniumワークステーションとサーバは2000年にリリースされ、EFI 1.02を実装している。
ヒューレット・パッカードの最初のItanium 2システムは2002年にリリースされ、EFI 1.10を実装している。これらはWindows、Linux、FreeBSD、HP-UXが起動できた。2003年6月にはOpenVMSもサポートされている。
DIG64仕様に従ったEFI互換ファームウェアを搭載したすべてのItaniumとItanium2システム。
2003年11月、ゲートウェイは、Gateway 610 Media Centerに、x86のWindowsベースのコンピュータシステムとしては初めてこのフレームワークをベースとしたファームウェアである、Insyde SoftwareのInsydeH2Oというファームウェアを導入した。このファームウェアではまだWindowsを起動するために、compatibility support moduleを使ってレガシーSystem BIOSを実装していた。
2006年1月、アップルはインテルアーキテクチャ (IA-32) をベースとした最初のMacintosh (Intel Mac) を出荷した。このシステムは以前のPowerPCベースのシステムに採用していたOpen Firmwareに代わって、EFIを採用していた。2006年4月5日、アップルは Boot Camp と呼ばれるソフトウェアをリリースした。これには Windows XP または Vista をユーザが既存のパーティションを壊さずに簡単にインストールできるツールと、Windows XP用のドライバディスクを提供している。ここでもまたファームウェアアップデートを通じて、EFI実装に加えてレガシーSystem BIOSのサポートが追加された。続くMacintoshの機種ではより新しいファームウェアが入った状態で出荷されている。2014年現在のMacintoshは、Winodows 7以降のみに対応し、Windows XPのようなレガシーSystem BIOSを使ってロードされるOSを起動できない。
非常にメジャーなインテルのマザーボードは、このフレームワークをベースとしたファームウェアを搭載して出荷されている。2005年では、100万台以上インテルのボードがこのフレームワークを搭載して出荷されている。新型のモバイルやデスクトップ、サーバ製品ではこのフレームワークを用いて2006年に出荷が開始されている。すぐにすべてのIntel 945チップセットを採用しているボードはこのフレームワークを搭載することになるだろう。しかし、製品用のファームウェアはEFIをサポートせず、レガシーSystem BIOSに限定している。
2005年以来、EFIはXScaleをベースとする組み込みシステムのようなPC以外のアーキテクチャにも実装されている。
NT32を含むEDKによってWindowsアプリケーション内でEFIファームウェアおよびEFIアプリケーションを動作させることができるようになった。ただし、EDK NT32 では直接的なハードウェアアクセスは許されていない。つまり、EDK NT32 のターゲットとしてどんなEFIアプリケーションも実行できるわけではない。2007年、ヒューレット・パッカードはEFI互換ファームウェアを用いた高機能プリンタ8000シリーズをリリースした。
2008年、x86-64 システムでのUEFI採用が増えた。その多くは Compatibility Support Module (CSM) を使ったBIOSベースのOSのブートしか許していないが（従ってユーザーにはUEFIベースであることが明示されていない）、UEFIベースのOSのブートを許すシステムも出てきている。例えば、IBM x3450 サーバ、ClickBIOSを搭載したMSI製マザーボード、HP EliteBookやタブレットPC、HP CompaqノートPCなどがある。
2009年、IBMはUEFIを搭載した System x マシンや BladeCenter マシンを出荷した。デルもUEFIを搭載したサーバを出荷している。他にも UEFI のホワイトペーパーに採用例が挙げられている。Sandy Bridge PC プラットフォームの多くはUEFIを採用している。

コンシューマ市場

2011年、ASRock、ASUSTeK、GIGABYTE、MSI 、BIOSTARなどは、インテルの6-series LGA 1155チップセットおよびAMDの 9 seriesチップセットを使ったコンシューマ向けマザーボードで、EFIを採用している。

グラフィックス機能

AptioやGreat WallのUEFI実装では、メニューなどにグラフィックス要素が使われている。
EFI仕様では、2つのグラフィックス表示プロトコルが定義されている。1つはUGA（Universal Graphic Adapters）で、もう1つはGOP (Graphic Output Protocol) である。2つはよく似ている。UGAはEFI 1.1かそれ以前でのみ動作する。EFIはユーザインタフェースを定義していない。したがって、見た目や操作方法はSystem BIOSベンダーに一任されている。今のところ多くのEFI実装では、System BIOSのようなテキストモードのユーザインタフェースを採用している。