Mais conteúdo relacionado Semelhante a UEFIベアメタルプログラミング (20) UEFIベアメタルプログラミング2. わんくま同盟 札幌勉強会 #1 2017-03
自己紹介
• 大神 祐真 (おおがみ ゆうま)
– http://yuma.ohgami.jp
• 職業
– 組み込み系の技術営業@東京
(2016/12から)
• 趣味
– フルスクラッチでOS自作
3. わんくま同盟 札幌勉強会 #1 2017-03
自己紹介
• 大神 祐真 (おおがみ ゆうま)
– http://yuma.ohgami.jp
• 職業
– 組み込み系の技術営業@東京
(2016/12から)
• 趣味
– フルスクラッチでOS自作
4. わんくま同盟 札幌勉強会 #1 2017-03
自己紹介
• 大神 祐真 (おおがみ ゆうま)
– http://yuma.ohgami.jp
• 職業
– 組み込み系の技術営業@東京
(2016/12から)
• 趣味
– フルスクラッチでOS自作
【技術書典2】
http://techbookfest.org
え-15: へにゃぺんて
“Ohgami’s
Commentary
on OS5”
5. わんくま同盟 札幌勉強会 #1 2017-03
自己紹介
• 大神 祐真 (おおがみ ゆうま)
– http://yuma.ohgami.jp
• 組み込み系のエンジニア
– Linux
– C言語、アセンブラ(ARM)
• 趣味
– フルスクラッチでOS自作
• 名前: OS5
• アーキテクチャ:
BIOS + x86_32
• 動作確認: QEMU
• 作りこみ
• ブートローダー: ○
• カーネル : ○
• ユーザーランド: △
6. わんくま同盟 札幌勉強会 #1 2017-03
自己紹介
• 大神 祐真 (おおがみ ゆうま)
– http://yuma.ohgami.jp
• 組み込み系のエンジニア
– Linux
– C言語、アセンブラ(ARM)
• 趣味
– フルスクラッチでOS自作
• 名前: OS5
• アーキテクチャ:
BIOS + x86_32
• 動作確認: QEMU
• 作りこみ
• ブートローダー: ○
• カーネル : ○
• ユーザーランド: △
7. わんくま同盟 札幌勉強会 #1 2017-03
自己紹介
• 大神 祐真 (おおがみ ゆうま)
– http://yuma.ohgami.jp
• 組み込み系のエンジニア
– Linux
– C言語、アセンブラ(ARM)
• 趣味
– フルスクラッチでOS自作
• 名前: OS5
• アーキテクチャ:
BIOS + x86_32
• 動作確認: QEMU
• 作りこみ
• ブートローダー: ○
• カーネル : ○
• ユーザーランド: △
今どき、
UEFI
+ x86_64
8. わんくま同盟 札幌勉強会 #1 2017-03
自己紹介
• 大神 祐真 (おおがみ ゆうま)
– http://yuma.ohgami.jp
• 組み込み系のエンジニア
– Linux
– C言語、アセンブラ(ARM)
• 趣味
– フルスクラッチでOS自作
• 名前: OS5
• アーキテクチャ:
BIOS + x86_32
• 動作確認: QEMU
• 作りこみ
• ブートローダー: ○
• カーネル : ○
• ユーザーランド: △
今どき、
UEFI
+ x86_64
まずは
UEFIから
勉強してみよう
9. わんくま同盟 札幌勉強会 #1 2017-03
目次
• UEFIとは?、ベアメタルプログラミングとは?
<ベアメタルプログラミング>
• Hello world! (実行までの流れを把握)
• UEFIバージョン取得 (UEFIの情報取得)
• グラフィック表示 (GUIDを使ってみる)
10. わんくま同盟 札幌勉強会 #1 2017-03
UEFIとは?
Unified Extensible Firmware Interface
(統一された拡張性のあるファームウェアインタフェース)
Unified Extensible Firmware Interface – Wikipedia
https://ja.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface
11. わんくま同盟 札幌勉強会 #1 2017-03
ベアメタルプログラミングとは?
• OSやライブラリ等を使用せず、
ハードウェアを制御するプログラミング
• OS5へ反映させるために、
まずは、UEFIでベアメタルプログラミング
• 今回紹介しきれないものも含め、
サンプルコードを以下で公開している
– https://github.com/cupnes/bare_metal_uefi
12. わんくま同盟 札幌勉強会 #1 2017-03
目次
• UEFIとは?、ベアメタルプログラミングとは?
<ベアメタルプログラミング>
• Hello world! (実行までの流れを把握)
• UEFIバージョン取得 (UEFIの情報取得)
• グラフィック表示 (GUIDを使ってみる)
13. わんくま同盟 札幌勉強会 #1 2017-03
実行までの流れ
1. ソースコード作成(C言語)
2. コンパイル(PE32+)
3. 2.を、ストレージ(USBフラッシュメモリ等)の
第1パーティション(FAT)の
EFI/BOOT/BOOTX64.EFI に配置
4. 3.で起動
14. わんくま同盟 札幌勉強会 #1 2017-03
1. ソースコード作成(C言語)
UEFI Specification を用意
【私の環境の場合】
• QEMU(OVMF.fd) : v2.4
• 実機(Lenovo ThinkPad) : v2.3.1
15. わんくま同盟 札幌勉強会 #1 2017-03
1. ソースコード作成(C言語)
仕様書にはCのプロトタイプ宣言も書かれているので、
この記載に則った形でソースコードを作っていく
Unified Extensible Firmware Interface Specification
Version 2.3.1 (P.75) http://www.uefi.org/specifications
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. わんくま同盟 札幌勉強会 #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. わんくま同盟 札幌勉強会 #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. わんくま同盟 札幌勉強会 #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. わんくま同盟 札幌勉強会 #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. わんくま同盟 札幌勉強会 #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. わんくま同盟 札幌勉強会 #1 2017-03
“Hello UEFI!”を出力するサンプル
010_conout/BOOTX64.c
https://github.com/cupnes/bare_metal_uefi
1. ソースコード作成(C言語)
23. わんくま同盟 札幌勉強会 #1 2017-03
“Hello UEFI!”を出力するサンプル
010_conout/BOOTX64.c
https://github.com/cupnes/bare_metal_uefi
1. ソースコード作成(C言語)
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. わんくま同盟 札幌勉強会 #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. わんくま同盟 札幌勉強会 #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
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. わんくま同盟 札幌勉強会 #1 2017-03
キー入力を取得する
【UEFIの機能を呼び出すには】
EFI_SYSTEM_TABLEの宣言(一部)
Unified Extensible Firmware Interface Specification Version 2.3.1 (P.78)
http://www.uefi.org/specifications
キー入力を取得できそうな
機能がある
30. わんくま同盟 札幌勉強会 #1 2017-03
目次
• UEFIとは?、ベアメタルプログラミングとは?
<ベアメタルプログラミング>
• Hello world! (実行までの流れを把握)
• UEFIバージョン取得 (UEFIの情報取得)
• グラフィック表示 (GUIDを使ってみる)
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
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. わんくま同盟 札幌勉強会 #1 2017-03
UEFIの情報取得
UEFIバージョンを表示させてみる
【サンプルコード】
https://github.com/cupnes/bare_metal_uefi/tree/master/012_
efiversion
【実行の様子】
QEMU
実機
35. わんくま同盟 札幌勉強会 #1 2017-03
目次
• UEFIとは?、ベアメタルプログラミングとは?
<ベアメタルプログラミング>
• Hello world! (実行までの流れを把握)
• UEFIバージョン取得 (UEFIの情報取得)
• グラフィック表示 (GUIDを使ってみる)
36. わんくま同盟 札幌勉強会 #1 2017-03
プロトコルとGUID
• 全ての機能がSystemTableからメンバとして
辿れるわけではない
• UEFIでは機能ごとに”プロトコル”と呼んで分
けている
– 各プロトコルには一意の”GUID”が存在
37. わんくま同盟 札幌勉強会 #1 2017-03
Unified Extensible Firmware Interface Specification Version 2.3.1 (P.466)
http://www.uefi.org/specifications
プロトコルとGUID
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からプロトコルの構造体の先頭アドレスを取得できる
40. わんくま同盟 札幌勉強会 #1 2017-03
gop
画面描画を行ってくれる関数
Unified Extensible Firmware Interface Specification Version 2.3.1 (P.466)
http://www.uefi.org/specifications
41. わんくま同盟 札幌勉強会 #1 2017-03
gop->Blt()
Unified Extensible Firmware Interface Specification Version 2.3.1 (P.474)
http://www.uefi.org/specifications
42. わんくま同盟 札幌勉強会 #1 2017-03
gop->Blt()
Unified Extensible Firmware Interface Specification Version 2.3.1 (P.474)
http://www.uefi.org/specifications
43. わんくま同盟 札幌勉強会 #1 2017-03
gop->Blt()
Unified Extensible Firmware Interface Specification Version 2.3.1 (P.474)
http://www.uefi.org/specifications
ピクセルデータ
を画面表示
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. わんくま同盟 札幌勉強会 #1 2017-03
gop->Blt()
Unified Extensible Firmware Interface Specification Version 2.3.1 (P.474)
http://www.uefi.org/specifications
表示先座標
(原点は画面左上)
46. わんくま同盟 札幌勉強会 #1 2017-03
gop->Blt()
Unified Extensible Firmware Interface Specification Version 2.3.1 (P.474)
http://www.uefi.org/specifications
ピクセルデータの
幅、高さ
47. わんくま同盟 札幌勉強会 #1 2017-03
実行の様子
わんくまの画像を表示してみる
【サンプルコード】
https://github.com/cupnes/bare_metal_uefi/tree/master/043_
graphic_image_blt
【実行の様子】
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のプログラムを作る
開発環境等をオープンソースで
提供するプロジェクトです。