01-01.UEFIとEDKⅡによるHelloWorld
 この項では、
UEFIでのブートを実現する
EDKⅡというツールの説明をするとともに、
HelloWorldします。
 
はじめににも述べたように、今、ノート型の開発マシン(ubuntuがセットアップされている)があります。ネットもつながっています。
 この項で行うのは
EDKⅡのドキュメントに記述されていることをなぞる感じです。英語のサイトなので
日本語訳くらいに考えていただければと思います。
 
UEFIというのは、これまでの
Biosによるパソコンの起動の仕組みを根本から変えるものです。DVDやUSBなど、ブートしたいメディアに1つの規格を設け、その規格に合っていればそのメディアの中のプログラムを実行してくれる、というのが
UEFIです。
 ただ、
UEFIがやってくれるのは、
指定されたプログラムをメモリにロードして実行するだけです。そのあとはプログラムする必要があります。UEFIが起動するアプリを
UEFIアプリなんて書かれている場合もあります。拡張子は
.efiです。
 パソコンのブート時の状態は、PCATマシンであれば
biosが実行できるだけの状態です。
C言語でプログラムすることができますが、たぶん、多くの人が考えている
C言語とは勝手が違います。なんせ、
標準ライブラリが使えない状態です。
 
C言語の標準ライブラリはOSが用意するライブラリです。Linuxしかり、Windowsしかり。しかし
UEFIが起草するプログラムにはそれがついてないのです。
 しかし、それではいくら何でも不便だろう、ということで
Cの標準ライブラリではないですが、ある程度パソコンを操れるライブラリを用意しているツールがあります。
UEFIアプリのSDKともいえるツールです。
 ネットを探すといろいろ出てくるのですが、有名どころは
 などです。ここでは
EDKⅡを使った
UEFIアプリの制作をやってみたいと思います。
開発ツールのインストール
 まず、コンパイラとか様々な開発ツールをセットアップする必要があります。
 端末を開いて
$ sudo apt install build-essential uuid-dev iasl git gcc-5 nasm python3-distutils
 
 と実行しますと、開発環境がインストールされます。あとからもう少し開発ツールをインストールしますが、今んとこは、ここまでにしておきます。
EDKⅡのダウンロード
 EDKⅡのダウンロードは、以下のように行います。
$ mkdir ~/src
$ cd ~/src
$ git clone https://github.com/tianocore/edk2
 
 ここでは、ホームディレクトリに
srcというディレクトリを作成し、その中に
edk2をダウンロードします。上記のコマンドで
 に
EDKⅡがダウンロードされます。
 断るまでもないかもしれませんが、上記は
 の意味です。コマンドで
 で自分のホームディレクトリに行けますので、
~は
ホームという意味です。
EDKⅡのコンパイル
 続いて
EDKⅡの基本的なライブラリをコンパイルします。
 今のカレントディレクトリは
 ですから、そこから上記のコマンドを打ち込みます。すると、
EDKⅡの基本的なライブラリがコンパイルされます。(結構時間がかかります)
EDKⅡのパスの設定
 コンパイルが終わりましたら、
$ cd ~/src/edk2
$ export EDK_TOOLS_PATH=$HOME/src/edk2/BaseTools
$ . edksetup.sh BaseTools
 
 と打ち込みます。これで
EDKⅡの各パッケージをビルドできる環境になります。またカレントディレクトリは
~/src/edk2になります。
MdeModulePkgパッケージのビルド
 EDKⅡは
パッケージという単位でプログラムをビルドします。パッケージを選択するには
 というファイルを、テキストエディタ(gedit)で開き、その中の以下のブロックを修正します。
ACTIVE_PLATFORM       = MdeModulePkg/MdeModulePkg.dsc
TOOL_CHAIN_TAG        = GCC5
TARGET                = RELEASE
TARGET_ARCH           = X64
 
 それぞれ、赤くなってるように書き換えます。
 書き換えたら、カレントディレクトリは
~/src/edk2になっている状態で
 と打ち込みます。
MdeModulePkgパッケージがビルドされます。
 問題なければ
Doneというメッセージが表示されます
HelloWorldアプリの実行準備
 これで、
MdeModulePkgパッケージに含まれる
HelloWorldアプリが出来上がったわけですが、これを実行する場合にはもう少し作業が必要です。
 
UEFIアプリは基本的に、
パソコンが起動したときに実行されるプログラムです。USBやCD-ROMにコピーしてパソコンを再起動する形で動作させるのが目標ですが、現時点では、そのための設定やらが大変です。
 そのため、
qemuという
エミュレータを使います。
 
qemuをインストールするには以下のコマンドを打ちます。一緒に
OVMFという
UEFIのファームウェアもインストールします。
$ sudo apt install qemu ovmf
 
 UEFI+EDKⅡについては、いろんな方々がブログや記事なども書いているのですが、その中では
OVMFは
EDKⅡのパッケージにあるものをビルドして使うように記述されているのですが、今回の開発環境では、思うようにビルドできません。ですので
Ubuntuのパッケージにある
OVMFを使用することにします。
 上記のインストールが終わったら、以下のようにブートディスクイメージを作成します。
$ cd ~/src
$ mkdir -p image/EFI/BOOT
$ cp edk2/Build/MdeModule/RELEASE_GCC5/X64/HelloWorld.efi image/EFI/BOOT/BOOTX64.efi
 
 この
imageディレクトリ配下がブートイメージになります。
 上記のコマンドで
HelloWorld.efiという名前の
UEFIアプリが、ブートイメージの
EFI/BOOT/BOOTX64.efiという名前で保存されます。
HelloWorldアプリの実行
 さあ、あとは、エミュレーターを起動して、アプリを実行します。
$ qemu-system-x86_64 \
-bios OVMF.fd \
-drive if=ide,file=fat:image,index=0,media=disk
 
 上記の
 \ はubuntuだと、バックスラッシュになります。
 しばらくして
ネットからのブートがタイムアウトになると
Shellが起動します。
 
Mapping tableの項目を見てください
FS0:という項目が見つかると思います。
Shellから
 と記述して
Enterを押します。その際
 : は打ちにくいと思います。認識が英語のキーボードになっているためで
 : は
 shift + ; を打ちましょう
 ; はセミコロンの場所です。すると
 とでます。ここで
lsと打つと
EFIが見えると思います。ここで
FS0:\> cd EFI/BOOT
FS0:\EFI\BOOT> ls
 
 とすると、
BOOTX64.efiが見えると思います。これこそ
HelloWorldアプリです。
FS0:\EFI\BOOT> BOOTX64.efi
 
 と打ち込んでみましょう。
 と表示されると思います。これが
UEFIの
HelloWorldです。