2014年12月1日月曜日

What's UEFI

UEFI Advent Calender一日目,oruminです.

初っ端なのでまずUEFIとは何かについて書こうと思います.

・UEFIとは?

UEFIとは,ファームウェアの一種です.
一般的なPCはBIOSからOSを起動している事はご存知だと思われますが,
実はBIOSは最早過去の遺物となりました.

BIOSの代替として2000年頃からIntelが開発していたEFIは,
多くの企業とコンソーシアムを立ち上げ,現在UEFIとして規格が策定されています.
2010年頃からはIntelのマザーボードを皮切りとして一般向けにも採用され,
現在市場にあるPCのほぼ全てがUEFIでしょう.
BIOSの設定画面だと思っているそれは最早UEFIです


・BIOSとの違いは?

大きな違いはデファクトスタンダードとしてなんとなしに採用されてきたBIOSと違い,
多くの企業のコンセサスの元策定された規格が存在し,閲覧が可能である事です.

この規格は,ブートローダや診断ツールといったものの開発が容易であるよう,
プログラミングのためのインターフェイス,APIが規定され公開されています.
これを扱うためのSDKが公開されているため,C言語やPythonといったもので
診断ツール等を記述可能になっています.

なんと,UEFIのAPIを用いて記述したアプリケーションプロラムは,OSが起動する前の段階(pre-OS Environment)でUEFI内蔵のShellから起動する事ができます.

また,IBM-PCの時に作られたBIOSは16bit Intel CPU前提のアークテクチャであるため,
多くの制限がありましたが,UEFIの場合はこの制限が無くなり,CPUのアーキテクチャに非依存です.Intel CPUのReal modeでないとBIOSから起動できない,などという事がないためブートローダーも16bitでなく32bitプロセッサなら32bit,64bitプロセッサなら64bitの命令がつかえるため,メモリも潤沢に使えます.

現在はx86,x86_64,AArch64のUEFI実装が存在します.

そして,一番のBIOSとの違いはブートシーケンスにあるのではないでしょうか.

・UEFIのブートシーケンス

BIOSは,当初のその制約から,ディスク先頭の第一セクタしかロードできませんでした.
よって,現在はその第一セクタ ― ディスク先頭512バイトの領域に
ブートローダーとパーティションテーブル(MBR)を格納し,そのブートローダーからOSを起動するという仕組みが一般的でしょう.
このブートローダーがMBMであればさらにパーティション毎の先頭のセクタ(PBR)のブートローダーを起動し,そのブートローダーが宜しくやってくれるというわけです.

この第一セクタ,つまりブートセクタをつかう方法は今や旧い方法となりました.
このブートセクタに置かれるブートローダーは容量の制約上技巧的な物にならざるを得ませんし,普通のファイルの容易に書き込みや入れ換えができるものでもないです.
多段階的な方法を取らねばマルチブートできないのもBIOSの制約から来るものです.

UEFIでは,ディスクの第一パーティションをFAT32でフォーマットし,これをシステムパーティションと呼びます.このシステムパーティションにUEFIのSDKで記述したアプリケーション,ブートローダーを配置します.
UEFIのアプリケーションバイナリはWindowsのEXE同様,PEバイナリとなります.

さて,このファイルをどう起動するよう指定するかというと,
UEFIのファームウェアそのものにブートマネージャーというマルチブートの際のOS選択画面の機能のようなものが備わってます.
このブートマネージャーに,ブートマネージャーに表示するエントリ名と,ブートローダーやUEFIアプリケーションのシステムパーティションでのパスを指定し,登録する事が可能です.
よって,OS毎に専用のローダーをUEFI SDKで記述し,それぞれのローダーをこのUEFIファームウェアのブートマネージャーに登録するだけでマルチブートが可能となるのです.

MBMやGRUBのような巨大なマルチブートのための"からくり"はもう必要ないのかもしれません.

もう一つ,ここで重要なのは,パーティションテーブルはMBRではなくなり,GPT形式となります.これは,パーティション数が最大128となり,1つのパーティションも2TiBの壁を越えて設定できます.パーティションの管理はGUIDを用いて行なわれます.



以上,軽くBIOSのおさらいも兼ねてUEFIとの違いに触れました.
UEFIのもう一つのBIOSとの違いとしてセキュリティ面で大幅に変化がありましたが,
これはまた別の機会に触れたいと思います.
また,度々文中に記載しましたがUEFIのSDK(EDK)の存在によりブートローダーの
作成は容易化しました.自作OSを作成する場合にもこれは大きなアドバンテージではないでしょうか.このEDKについても別の機会に触れたいと思います.

最後に,UEFIのドキュメントを紹介します.
まずUEFIの規格書は最大のドキュメントでしょう.
http://www.uefi.org/specifications

また,Intelが出しているペーパーブックは
UEFIアプリケーションの開発等で役立つほぼ唯一のドキュメントです