この記事では、UEFIアプリケーションの開発について説明します。
出来るだけ多くを網羅する資料を書き、自作OSの日本語資料増加への一助とならんと思いつつ、この記事を書いています。Sakadayoです。
本当に自作OS/低レイヤの日本語資料増えてほしい。
UEFIアプリケーションとは
https://uefi.org/specs/UEFI/2.11/02_Overview.html
の2.1.2 "UEFI Application"の章に記述される内容を見ると
Applications written to this specification are loaded by the Boot Manager or by other UEFI applications.
(この仕様書に従い書かれたアプリはブートマネージャーまたは他のUEFIアプリによってロードされる)
とあります。(決して上記文章のブートマネージャーはOSのブートローダではありませんから、混同に注意して下さい)
つまり、UEFIアプリとは「UEFIによって起動されるアプリ」なのです。
それを利用すれば、OSのブートローダーも作れる訳です。
この記事で学べる事・開発環境
開発環境
・コンピューター(64bit以上のCPU/約2GB以上のメモリを搭載したもの)
・GCCあるいはClang・LLVM(C言語コンパイラ)
・QEMU(仮想化ソフト)
・(Windowsの場合)USBメモリ等のディスク又はパーティションとそれ分の容量
・rustc、cargo等、ビルドシステム、コンパイラ
・コンパイラ以外は①と同じ
この記事で学べる事
・UEFIアプリケーションとは何か、又それを作る技能
・UEFI仕様書の解読の方法
UEFI仕様書解読
上のURLがUEFI仕様書のURLです。
まずはどこから解読を進めるべきか
これが、UEFIアプリのエントリポイントの定義です。
この定義に則って、UEFIはアプリをロードして実行します。
定義の内容を見てみましょう。
typedef
EFI_STATUS
(EFIAPI *EFI_IMAGE_ENTRY_POINT) ( //一つ目の括弧
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
);//二つ目の括弧
これをソースコードの定義ファイルに書くなりして、使用します。
ツールを使えば定義ファイルに書かずとも済むので楽です。
EDKIIやGNU-EFI等のツールがあるのですが、ここでは割愛します。
このコードの意味する所
typedefはC言語で型を定義するワードです。
EFI_STATUSが返り値で二つ目の二個が引数のEFI_IMAGE_ENTRY_POINTを定義すると言う意味になるそうです。(C言語文法あやふやですみません)
EFI_HANDLEとは
EFIAPI,INとは
これはOverview(概要)章によるとmnemonicです。
mnemonicとは辞書を引くと「記憶を助ける何か」の意味があり、つまりはソースコードでは書かずとも問題が無いです。
EDKII等のツールの定義ファイルでも、#define IN 0となっています。
とりあえずは、定義はしますがEDKIIの定義方法に準拠します。