Successfully reported this slideshow.

UEFIベアメタルプログラミング

0

Share

Loading in …3
×
1 of 48
1 of 48

UEFIベアメタルプログラミング

0

Share

Download to read offline

わんくま同盟 札幌勉強会 #1(2017-03-04)の発表スライドです。
なお、発表時に使用していたEFIプログラム版の発表スライドは
http://yuma.ohgami.jp に置いてあります。

わんくま同盟 札幌勉強会 #1(2017-03-04)の発表スライドです。
なお、発表時に使用していたEFIプログラム版の発表スライドは
http://yuma.ohgami.jp に置いてあります。

More Related Content

Related Books

Free with a 14 day trial from Scribd

See all

Related Audiobooks

Free with a 14 day trial from Scribd

See all

UEFIベアメタルプログラミング

  1. 1. わんくま同盟 札幌勉強会 #1 2017-03 UEFIベアメタルプログラミング 大神 祐真 yuma@ohgami.jp
  2. 2. わんくま同盟 札幌勉強会 #1 2017-03 自己紹介 • 大神 祐真 (おおがみ ゆうま) – http://yuma.ohgami.jp • 職業 – 組み込み系の技術営業@東京 (2016/12から) • 趣味 – フルスクラッチでOS自作
  3. 3. わんくま同盟 札幌勉強会 #1 2017-03 自己紹介 • 大神 祐真 (おおがみ ゆうま) – http://yuma.ohgami.jp • 職業 – 組み込み系の技術営業@東京 (2016/12から) • 趣味 – フルスクラッチでOS自作
  4. 4. わんくま同盟 札幌勉強会 #1 2017-03 自己紹介 • 大神 祐真 (おおがみ ゆうま) – http://yuma.ohgami.jp • 職業 – 組み込み系の技術営業@東京 (2016/12から) • 趣味 – フルスクラッチでOS自作 【技術書典2】 http://techbookfest.org え-15: へにゃぺんて “Ohgami’s Commentary on OS5”
  5. 5. わんくま同盟 札幌勉強会 #1 2017-03 自己紹介 • 大神 祐真 (おおがみ ゆうま) – http://yuma.ohgami.jp • 組み込み系のエンジニア – Linux – C言語、アセンブラ(ARM) • 趣味 – フルスクラッチでOS自作 • 名前: OS5 • アーキテクチャ: BIOS + x86_32 • 動作確認: QEMU • 作りこみ • ブートローダー: ○ • カーネル : ○ • ユーザーランド: △
  6. 6. わんくま同盟 札幌勉強会 #1 2017-03 自己紹介 • 大神 祐真 (おおがみ ゆうま) – http://yuma.ohgami.jp • 組み込み系のエンジニア – Linux – C言語、アセンブラ(ARM) • 趣味 – フルスクラッチでOS自作 • 名前: OS5 • アーキテクチャ: BIOS + x86_32 • 動作確認: QEMU • 作りこみ • ブートローダー: ○ • カーネル : ○ • ユーザーランド: △
  7. 7. わんくま同盟 札幌勉強会 #1 2017-03 自己紹介 • 大神 祐真 (おおがみ ゆうま) – http://yuma.ohgami.jp • 組み込み系のエンジニア – Linux – C言語、アセンブラ(ARM) • 趣味 – フルスクラッチでOS自作 • 名前: OS5 • アーキテクチャ: BIOS + x86_32 • 動作確認: QEMU • 作りこみ • ブートローダー: ○ • カーネル : ○ • ユーザーランド: △ 今どき、 UEFI + x86_64
  8. 8. わんくま同盟 札幌勉強会 #1 2017-03 自己紹介 • 大神 祐真 (おおがみ ゆうま) – http://yuma.ohgami.jp • 組み込み系のエンジニア – Linux – C言語、アセンブラ(ARM) • 趣味 – フルスクラッチでOS自作 • 名前: OS5 • アーキテクチャ: BIOS + x86_32 • 動作確認: QEMU • 作りこみ • ブートローダー: ○ • カーネル : ○ • ユーザーランド: △ 今どき、 UEFI + x86_64 まずは UEFIから 勉強してみよう
  9. 9. わんくま同盟 札幌勉強会 #1 2017-03 目次 • UEFIとは?、ベアメタルプログラミングとは? <ベアメタルプログラミング> • Hello world! (実行までの流れを把握) • UEFIバージョン取得 (UEFIの情報取得) • グラフィック表示 (GUIDを使ってみる)
  10. 10. わんくま同盟 札幌勉強会 #1 2017-03 UEFIとは? Unified Extensible Firmware Interface (統一された拡張性のあるファームウェアインタフェース) Unified Extensible Firmware Interface – Wikipedia https://ja.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface
  11. 11. わんくま同盟 札幌勉強会 #1 2017-03 ベアメタルプログラミングとは? • OSやライブラリ等を使用せず、 ハードウェアを制御するプログラミング • OS5へ反映させるために、 まずは、UEFIでベアメタルプログラミング • 今回紹介しきれないものも含め、 サンプルコードを以下で公開している – https://github.com/cupnes/bare_metal_uefi
  12. 12. わんくま同盟 札幌勉強会 #1 2017-03 目次 • UEFIとは?、ベアメタルプログラミングとは? <ベアメタルプログラミング> • Hello world! (実行までの流れを把握) • UEFIバージョン取得 (UEFIの情報取得) • グラフィック表示 (GUIDを使ってみる)
  13. 13. わんくま同盟 札幌勉強会 #1 2017-03 実行までの流れ 1. ソースコード作成(C言語) 2. コンパイル(PE32+) 3. 2.を、ストレージ(USBフラッシュメモリ等)の 第1パーティション(FAT)の EFI/BOOT/BOOTX64.EFI に配置 4. 3.で起動
  14. 14. わんくま同盟 札幌勉強会 #1 2017-03 1. ソースコード作成(C言語) UEFI Specification を用意 【私の環境の場合】 • QEMU(OVMF.fd) : v2.4 • 実機(Lenovo ThinkPad) : v2.3.1
  15. 15. わんくま同盟 札幌勉強会 #1 2017-03 1. ソースコード作成(C言語) 仕様書にはCのプロトタイプ宣言も書かれているので、 この記載に則った形でソースコードを作っていく Unified Extensible Firmware Interface Specification Version 2.3.1 (P.75) http://www.uefi.org/specifications
  16. 16. わんくま同盟 札幌勉強会 #1 2017-03 1. ソースコード作成(C言語) 【UEFIの機能を呼び出すには】 • UEFIアプリのエントリ関数の プロトタイプ宣言が、仕様で決められている Unified Extensible Firmware Interface Specification Version 2.3.1 (P.75) http://www.uefi.org/specifications
  17. 17. わんくま同盟 札幌勉強会 #1 2017-03 【UEFIの機能を呼び出すには】 • UEFIアプリのエントリ関数の プロトタイプ宣言が、仕様で決められている Unified Extensible Firmware Interface Specification Version 2.3.1 (P.75) http://www.uefi.org/specifications この構造体を通して UEFIの機能を呼び出せる 1. ソースコード作成(C言語)
  18. 18. わんくま同盟 札幌勉強会 #1 2017-03 【UEFIの機能を呼び出すには】 EFI_SYSTEM_TABLEの宣言(一部) Unified Extensible Firmware Interface Specification Version 2.3.1 (P.78) http://www.uefi.org/specifications 1. ソースコード作成(C言語)
  19. 19. わんくま同盟 札幌勉強会 #1 2017-03 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOLの宣言 Unified Extensible Firmware Interface Specification Version 2.3.1 (P.424) http://www.uefi.org/specifications コンソールへ文字列を出力する関数 1. ソースコード作成(C言語)
  20. 20. わんくま同盟 札幌勉強会 #1 2017-03 EFI_TEXT_STRINGの宣言 Unified Extensible Firmware Interface Specification Version 2.3.1 (P.428) http://www.uefi.org/specifications この関数(EFI_TEXT_STRING)をメンバとする構造体 (EFI_SIMPLE_OUTPUT_PROTOCOL)のポインタ 1. ソースコード作成(C言語)
  21. 21. わんくま同盟 札幌勉強会 #1 2017-03 EFI_TEXT_STRINGの宣言 Unified Extensible Firmware Interface Specification Version 2.3.1 (P.428) http://www.uefi.org/specifications 文字列(Unicode,2bytes)のポインタ 1. ソースコード作成(C言語)
  22. 22. わんくま同盟 札幌勉強会 #1 2017-03 “Hello UEFI!”を出力するサンプル 010_conout/BOOTX64.c https://github.com/cupnes/bare_metal_uefi 1. ソースコード作成(C言語)
  23. 23. わんくま同盟 札幌勉強会 #1 2017-03 “Hello UEFI!”を出力するサンプル 010_conout/BOOTX64.c https://github.com/cupnes/bare_metal_uefi 1. ソースコード作成(C言語)
  24. 24. わんくま同盟 札幌勉強会 #1 2017-03 2. コンパイル(PE32+) 1. PE32+のクロスコンパイラを用意 – apt: x86_64-w64-mingw32-gcc 2. コンパイル $ x86_64-w64-mingw32-gcc -e efi_main ¥ -nostdlib -Wl,--subsystem,10 ¥ -o BOOTX64.EFI hello.c
  25. 25. わんくま同盟 札幌勉強会 #1 2017-03 3. ストレージへ配置、4. ストレージから起動 【実機】 1. ストレージの第1パーティション(FAT)の EFI/BOOT/BOOTX64.EFI に配置 2. 1.のストレージから起動 # mount /dev/sdb1 /mnt # mkdir -p /mnt/EFI/BOOT # cp BOOTX64.EFI /mnt/EFI/BOOT/
  26. 26. わんくま同盟 札幌勉強会 #1 2017-03 3. EFI/BOOT/BOOTX64.EFI へ配置 【QEMU】 1. UEFIファームウェア(OVMF.fd)をダウンロード – https://sourceforge.net/projects/edk2/files/OVMF/ 2. QEMUにHDDと認識させるディレクトリ作成、 BOOTX64.EFI配置 3. QEMU起動 $ mkdir -p hdd/EFI/BOOT $ cp BOOTX64.EFI hdd/EFI/BOOT/ $ qemu-system-x86_64 -bios OVMF.fd -hda fat:hdd
  27. 27. わんくま同盟 札幌勉強会 #1 2017-03 実機での実行の様子
  28. 28. わんくま同盟 札幌勉強会 #1 2017-03 キー入力を取得する 【UEFIの機能を呼び出すには】 EFI_SYSTEM_TABLEの宣言(一部) Unified Extensible Firmware Interface Specification Version 2.3.1 (P.78) http://www.uefi.org/specifications
  29. 29. わんくま同盟 札幌勉強会 #1 2017-03 キー入力を取得する 【UEFIの機能を呼び出すには】 EFI_SYSTEM_TABLEの宣言(一部) Unified Extensible Firmware Interface Specification Version 2.3.1 (P.78) http://www.uefi.org/specifications キー入力を取得できそうな 機能がある
  30. 30. わんくま同盟 札幌勉強会 #1 2017-03 目次 • UEFIとは?、ベアメタルプログラミングとは? <ベアメタルプログラミング> • Hello world! (実行までの流れを把握) • UEFIバージョン取得 (UEFIの情報取得) • グラフィック表示 (GUIDを使ってみる)
  31. 31. わんくま同盟 札幌勉強会 #1 2017-03 UEFIの情報取得 UEFIの情報も”SystemTable”から辿りつける EFI_SYSTEM_TABLEの宣言(一部) Unified Extensible Firmware Interface Specification Version 2.3.1 (P.78) http://www.uefi.org/specifications
  32. 32. わんくま同盟 札幌勉強会 #1 2017-03 UEFIの情報取得 EFI_TABLE_HEADERの定義
  33. 33. わんくま同盟 札幌勉強会 #1 2017-03 UEFIの情報取得 EFI_TABLE_HEADERの定義 Unified Extensible Firmware Interface Specification Version 2.3.1 (P.77) http://www.uefi.org/specifications マイナーバージョンメジャーバージョン 上位16ビット 下位16ビット 例) 0x0002 0x0040 (2.4) 0x0002 0x0031 (2.3.1)
  34. 34. わんくま同盟 札幌勉強会 #1 2017-03 UEFIの情報取得 UEFIバージョンを表示させてみる 【サンプルコード】 https://github.com/cupnes/bare_metal_uefi/tree/master/012_ efiversion 【実行の様子】 QEMU 実機
  35. 35. わんくま同盟 札幌勉強会 #1 2017-03 目次 • UEFIとは?、ベアメタルプログラミングとは? <ベアメタルプログラミング> • Hello world! (実行までの流れを把握) • UEFIバージョン取得 (UEFIの情報取得) • グラフィック表示 (GUIDを使ってみる)
  36. 36. わんくま同盟 札幌勉強会 #1 2017-03 プロトコルとGUID • 全ての機能がSystemTableからメンバとして 辿れるわけではない • UEFIでは機能ごとに”プロトコル”と呼んで分 けている – 各プロトコルには一意の”GUID”が存在
  37. 37. わんくま同盟 札幌勉強会 #1 2017-03 Unified Extensible Firmware Interface Specification Version 2.3.1 (P.466) http://www.uefi.org/specifications プロトコルとGUID
  38. 38. わんくま同盟 札幌勉強会 #1 2017-03 Unified Extensible Firmware Interface Specification Version 2.3.1 (P.184) http://www.uefi.org/specifications プロトコルの構造体へのポインタが設定される LocateProtocol() SystemTable->BootServices->LocateProtocol() で GUIDからプロトコルの構造体の先頭アドレスを取得できる
  39. 39. わんくま同盟 札幌勉強会 #1 2017-03 GUIDとLocateProtocol() LocateProtocol()使用例
  40. 40. わんくま同盟 札幌勉強会 #1 2017-03 gop 画面描画を行ってくれる関数 Unified Extensible Firmware Interface Specification Version 2.3.1 (P.466) http://www.uefi.org/specifications
  41. 41. わんくま同盟 札幌勉強会 #1 2017-03 gop->Blt() Unified Extensible Firmware Interface Specification Version 2.3.1 (P.474) http://www.uefi.org/specifications
  42. 42. わんくま同盟 札幌勉強会 #1 2017-03 gop->Blt() Unified Extensible Firmware Interface Specification Version 2.3.1 (P.474) http://www.uefi.org/specifications
  43. 43. わんくま同盟 札幌勉強会 #1 2017-03 gop->Blt() Unified Extensible Firmware Interface Specification Version 2.3.1 (P.474) http://www.uefi.org/specifications ピクセルデータ を画面表示
  44. 44. わんくま同盟 札幌勉強会 #1 2017-03 gop->Blt() 表示する ピクセルデータ B G R - B G R - B G R - ・ ・ ・ ・ ・ ・ ・ ・ ・ 各8ビット 32ビットで1ピクセル Unified Extensible Firmware Interface Specification Version 2.3.1 (P.474) http://www.uefi.org/specifications
  45. 45. わんくま同盟 札幌勉強会 #1 2017-03 gop->Blt() Unified Extensible Firmware Interface Specification Version 2.3.1 (P.474) http://www.uefi.org/specifications 表示先座標 (原点は画面左上)
  46. 46. わんくま同盟 札幌勉強会 #1 2017-03 gop->Blt() Unified Extensible Firmware Interface Specification Version 2.3.1 (P.474) http://www.uefi.org/specifications ピクセルデータの 幅、高さ
  47. 47. わんくま同盟 札幌勉強会 #1 2017-03 実行の様子 わんくまの画像を表示してみる 【サンプルコード】 https://github.com/cupnes/bare_metal_uefi/tree/master/043_ graphic_image_blt 【実行の様子】
  48. 48. わんくま同盟 札幌勉強会 #1 2017-03 【発表後追記】発表で行った、スライドに無かった内容について • UEFIスライドショー – 以下に置いてあります 使い方はREADMEを見てみてください – https://github.com/cupnes/bare_metal_uefi/tree/master/050_slide show • UEFI Shell – TianoCore[*1]から配布されている以下のEFIバイナリを使用しました – https://github.com/tianocore/edk2/tree/master/EdkShellBinPkg/Ful lShell/X64 – このEFIバイナリも、前述の説明通り、 ストレージの第1パーティション(FAT)の EFI/BOOT/BOOTX64.EFI へ配置すれば、 UEFIのファームウェアが実行してくれます [*1] ベアメタルプログラミング のため、使用していないですが、 UEFIのプログラムを作る 開発環境等をオープンソースで 提供するプロジェクトです。

×