Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Introduction for developping UEFI app/driver

Introduction for developping UEFI app/driver

UEFIを,UDK(EDKII)で開発するための最初のステップについて
解説+α

orumin

May 25, 2014
Tweet

More Decks by orumin

Other Decks in Programming

Transcript

  1. 自己紹介 • orumin – 学生 • sepcamp2012, GSoC(now) • twitter:

    @kotatsu_mi • 側転できなさそうな顔の人とか TL 大破とか
  2. 自己紹介 • orumin – 学生 • sepcamp2012, GSoC(now) • twitter:

    @kotatsu_mi • 側転できなさそうな顔の人とか TL 大破とか • ておくれではない
  3. UEFI • 初出 - “Play with UEFI” カーネル VM 関西

    4 • “ いじぇくと的ななにか” カーネル /VM 探検隊 第九回
  4. UEFI • ベタ C 移植 ? • Python? • EFI

    Protocol? • なぞのシェル
  5. UEFI( 加筆 ) • そもそも UEFI とは, BIOS をおきかえるもの •

    UEFI 自体にブートローダーやシェルのような ものが実装されている • 自作のアプリケーション,ドライバが簡単に作 れ動かせる ← ココ重要
  6. First Step • まずは SDK のインストール 今回は UDK について説明します UDK

    は EDK(II) の stable で,現在 2014 が最新 (syuu1228 さん,情報提供ありがとうございます )
  7. First Step $ mkdir ~/src $ cd ~/src $ svn

    co https://edk2.svn.sourceforge.net/svnroot/ edk2/trunk/edk2 $ make -C edk2/BaseTools $ cd ~/src/edk2 $ export EDK_TOOLS_PATH=$HOME/src/edk2/BaseTools $ source edksetup.sh BaseTools
  8. FirstStep • ${EDK_TOOLS_PATH}/Conf/target.txt • TOOLS_CHAIN_TAG 変数 -> GCC47 • ACTIVE_PLATFORM

    変数 -> FooPkg/FooPkg.dec • 準備完了 • build コマンドでビルドしはじめる
  9. Second Step • *.dec [Defines] DEC_SPECIFICATION = 0x00010005 PACKAGE_NAME =

    AppPkg PACKAGE_GUID = B3E3D3D5-D62B-4497-A175-264F489D127E PACKAGE_VERSION = 0.01
  10. Second Step • *.dsc [Defines] PLATFORM_NAME = AppPkg PLATFORM_GUID =

    0458dade-8b6e-4e45-b773-1b27cbda3e06 PLATFORM_VERSION = 0.01 DSC_SPECIFICATION = 0x00010006 OUTPUT_DIRECTORY = Build/AppPkg SUPPORTED_ARCHITECTURES = IA32|IPF|X64 BUILD_TARGETS = DEBUG|RELEASE SKUID_IDENTIFIER = DEFAULT
  11. Second Step • プロジェクト名 • UUID(*.dec とは違うもの ) • プロジェクトのバージョン

    • 設定ファイルのバージョン • ビルドの出力先 • ターゲットアーキテクチャ • ビルドターゲット
  12. Second Step • この LibraryClasses セクションは, foo|path/to/libraryfolder という形 • foo

    はなんでも良いけれど, UDK 内の既存プ ロジェクトに従ったほうが良い
  13. Second Step • dsc ファイルについて最後に • libc とか web socket

    を使う場合だけ !include StdLib/StdLib.inc !include AppPkg/Applications/Sockets/Sockets.inc • この 2 行で設定の読み込みが必要
  14. Second Step [Defines] INF_VERSION = 0x00010006 BASE_NAME = Hello FILE_GUID

    = a912f198-7f0e-4803-b908-b757b806ec83 MODULE_TYPE = UEFI_APPLICATION VERSION_STRING = 0.1 ENTRY_POINT = ShellCEntryLib
  15. Second Step • inf ファイルの [defines] セクション • dsc の

    [defines] と大差なし • ポイントは,ここで MODULE_TYPE と ENTRY_POINT を指定
  16. Second Step • MODULE_TYPE は UEFI_APPLICATION か UEFI_DRIVER • ENTRY_POINT

    は dsc ファイルに書いて 読み込んだ 3 つ, ShellCLibEntryPoint UefiApplicationEntryPoint UefiDriverEntryPoint
  17. Second Step • dsc の Components でモジュール分割するほどのプ ロジェクトでなければ, dsc のほうに

    MODULE_TYPE やら ENTRY_POINT や ら書いてしまって, inf には [Sources] だけというのも可能 • inf を応用して,ソースコードだけ別フォルダに 分けるときに使うという使用方法もあり
  18. Let's coding • UEFI Protocol について • UEFI の API

    のこと • なんで Protocol なんでしょうね • データ駆動型 API です
  19. Let's coding • 基本的には, HandleProtocol() で特定の デバイス等の Handle を取得 •

    その Handle を OpenProtocol() にぶちこんで Protocol 構造体にデータを詰め込んでもらう • 構造体に詰められた関数ポインタを通して API コール
  20. Let's coding typedef struct { EFI_TABLE_HEADER Hdr*; CHAR16 *FirmwareVendor; UINT32

    FirmwareRevision; EFI_HANDLE ConsoleInHandle; EFI_SIMPLE_TEXT_INPUT_PROTOCOL *ConIn; EFI_HANDLE ConsoleOutHandle; EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut;
  21. Let's coding • gST,gRS,gBS … 既に宣言 • gBS が特に重要 LocateHandle()

    , Open/CloseProtocol() 他にも LoadImage() , StartImage() ExitBootServices() 等 • 最悪 EFI_SYMPLE_FILE_SYSTEM_PROTOCOL と EFI_BOOT_SERVICES だけでブートローダ書ける
  22. Let's coding • 実際のコードを見てみよう https://github.com/tianocore/edk2-FatPkg *.dec と *.dsc と *.inf

    が設定, Fat.h に各種宣言, Fat.c が EntryPoint 他にも Fat.c でつかわれる Lock が Misc.c デバイスのアロケートを Init.c Read/Write を ReadWrite.c… という具合
  23. おわりに • UDK は VisualStudio でも使えます (Windows ユーザーさんどうぞ ) •

    UNIX Like な OS で動作させる前提のツールは gnu-efi のほうが楽かもしれません GrowBuffer() や LocateHandlebyDiskSignature() とか • rEFInd とか参考にしてね ! http://sourceforge.net/projects/refind/files/
  24. 余談 • Hibernation 中の swap パーティションの snapshot を UEFI app

    で弄ったりして, secure boot の secure さを壊せるのでは ? https://lkml.org/lkml/2013/8/22/218 • 発端 http://lists.opensuse.org/opensuse-kernel/ 2013-09/msg00068.html