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.

コメント

このブログの人気の投稿

相互インクルード対策

make error "Circular"

gdb操作