UEFI Advent Calendar 2014 12/19
次の日に持ち越してしまって申し訳ないです……。マルチタスク消化力欲しい。
あと stack edit で編集しているのですが、何故か個々のページになると Markdown の装飾が反映されないので、Home からみるとよろしいかと……ブログのタイトルクリックして見たほうが見やすいはず。
package
EDK II での package 作成と build までを。ただ先に日本語で書いてくれている方もいるのでそちらも参考に。
あとドキュメント等しっかり読んだわけではなく、行き当たりばったりでやったので詳細はドキュメントでお願いします。
環境
- MacBookPro (13-inch, Early 2011)
- OS X Yosemite
- 2.3GHz Intel Core i5
- Memory 8GB
MacBook でやりました。ってなだけです。Yosemite でも普通に動いてくれました。
構成
最低限必要なファイル。これだけあれば build できて動くようです。XX は同じ名前。
edk2/
XXPkg/
XXPkg.c
XXPkg.dec
XXPkg.dsc
XXPkg.inf
dsc ファイル
[Defines]
この package の定義を書いていきます。他の Package からコピペすると早い?
PLATFORM_NAME = XXPkg
PLATFORM_GUID = 2306E2C6-149D-4937-AAC0-1E2A37C0A1CD
PLATFORM_VERSION = 0.01
DSC_SPECIFICATION = 0x00010005
OUTPUT_DIRECTORY = Build/XXPkg
SUPPORTED_ARCHITECTURES = X64
BUILD_TARGETS = DEBUG
SKUID_IDENTIFIER = DEFAULT
# FLASH_DEFINITION = XXPkg/XXPkg.fdf
PLATFORM_GUID は自分で生成します。
% uuidgen
E5EA6211-B99F-4B1C-9E35-1ECB5B970D24
一番最後の FLASH_DEFINITION は詳細を把握していないままで放置しています。
[LibraryClasses]
EDKII の package を inf ファイルを書く、という形で指定します。
XXLib | XXPkg/Library/...
任意の名前 | 使いたい Library の inf ファイルの指定
みたいな感じ。
[Components]
これはこれから自作する package の inf を指定。
XXPkg/XXPkg.inf
dec ファイル
[Defines]
package の define をまとめているっぽい。
DEC_SPECIFICATION = 0x00010005
PACKAGE_NAME = BootLoaderPkg
PACKAGE_GUID = D6F40DA2-B36A-46A2-97DA-EE68458F69F2
PACKAGE_VERSION = 0.01
inf ファイル
[Source]
XXPkg.c
自分で書いた UEFI application の source を書いておきます。ここに書いておくとその source が buid されます。
[Packages]
自分で書いた source に使われている package のリスト。dec ファイルを指定します。
XXPkg/XXPkg.dec
ex.
MdePkg/MdePkg.dec
[LibraryClasses]
自作の source で使われる library を書くところです。
dsc ファイルで指定した、library の任意の名前をここで書きます。
[Protocols]
自作の source で使われる protocol の guid を書いておきます。ここで書いておけば source で protocol を使えます。
gEfiLoadedImageProtocolGuid
source code
C 言語で。Ruby でも書けるようですがその辺は勉強不足です。
inf ファイルで指定した library を include できます。
ex.
#include <Library/UefiApplicationEntryPoint.h>
プロトコルが使用できたり。
ex.
#include <Protocol/LoadedImage.h>
今回は
EFI_STATUS
EFIAPI
UefiMain (IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
を entry point にしてみました。
build
source edksetup.sh
package を指定して build
build -p XXPkg/XXPkg.dsc
build 後は下記に image ができます。
Build/XXPkg/DEBUG_UNIXGCC/X64/XX.efi
Build/XXPkg/DEBUG_UNIXGCC/X64/XXPkg/XXPkg/OUTPUT/BootLoader.efi
2つ出来てるみたい。
実行
そのまま image になる directory を作成。
mkdir hda-contents
コピー。
cp ../edk2/Build/XXPkg/DEBUG_UNIXGCC/X64/XXPkg/XXPkg/OUTPUT/XX.efi hda-contents/EFI/BOOT/BOOTx64.EFI
QEMU で実行。
qemu-system-x86_64 -bios OVMF.fd -L . -hda fat:hda-contents
終わりに
実際に実装したものを書きたかったのですが間に合わなかったのでこんな感じになりました。結構手探りで調べてしまったので詳細がわからないまま放置してあるところもあって、まだまだ調査が足りない感じです。
source は準備ができ次第 github か何かに upload します。
Written with StackEdit.
コメント
コメントを投稿