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

More Related Content

What's hot

OSTree: OSイメージとパッケージシステムの間にGitのアプローチを
OSTree: OSイメージとパッケージシステムの間にGitのアプローチをOSTree: OSイメージとパッケージシステムの間にGitのアプローチを
OSTree: OSイメージとパッケージシステムの間にGitのアプローチを
i_yudai
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」
Masahito Zembutsu
 
【2000行弱!】x86用自作カーネルの紹介
【2000行弱!】x86用自作カーネルの紹介【2000行弱!】x86用自作カーネルの紹介
【2000行弱!】x86用自作カーネルの紹介
Yuma Ohgami
 
初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法
kazkiti
 
QEMUでARM64bitベアメタルプログラミング
QEMUでARM64bitベアメタルプログラミングQEMUでARM64bitベアメタルプログラミング
QEMUでARM64bitベアメタルプログラミング
Yuma Ohgami
 
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
Mr. Vengineer
 
レガシーフリーOSに必要な要素技術 legacy free os
レガシーフリーOSに必要な要素技術 legacy free osレガシーフリーOSに必要な要素技術 legacy free os
レガシーフリーOSに必要な要素技術 legacy free os
uchan_nos
 
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Hiro H.
 
MikanOSと自作CPUをUSBで接続する
MikanOSと自作CPUをUSBで接続するMikanOSと自作CPUをUSBで接続する
MikanOSと自作CPUをUSBで接続する
uchan_nos
 
いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例
Fixstars Corporation
 
プロセスとコンテキストスイッチ
プロセスとコンテキストスイッチプロセスとコンテキストスイッチ
プロセスとコンテキストスイッチ
Kazuki Onishi
 
10分で分かるLinuxブロックレイヤ
10分で分かるLinuxブロックレイヤ10分で分かるLinuxブロックレイヤ
10分で分かるLinuxブロックレイヤ
Takashi Hoshino
 
CRC-32
CRC-32CRC-32
CRC-32
7shi
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
yohhoy
 
YoctoをつかったDistroの作り方とハマり方
YoctoをつかったDistroの作り方とハマり方YoctoをつかったDistroの作り方とハマり方
YoctoをつかったDistroの作り方とハマり方
wata2ki
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
murachue
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
 
20111015 勉強会 (PCIe / SR-IOV)
20111015 勉強会 (PCIe / SR-IOV)20111015 勉強会 (PCIe / SR-IOV)
20111015 勉強会 (PCIe / SR-IOV)
Kentaro Ebisawa
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分け
モノビット エンジン
 
JIT のコードを読んでみた
JIT のコードを読んでみたJIT のコードを読んでみた
JIT のコードを読んでみた
y-uti
 

What's hot (20)

OSTree: OSイメージとパッケージシステムの間にGitのアプローチを
OSTree: OSイメージとパッケージシステムの間にGitのアプローチをOSTree: OSイメージとパッケージシステムの間にGitのアプローチを
OSTree: OSイメージとパッケージシステムの間にGitのアプローチを
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」
 
【2000行弱!】x86用自作カーネルの紹介
【2000行弱!】x86用自作カーネルの紹介【2000行弱!】x86用自作カーネルの紹介
【2000行弱!】x86用自作カーネルの紹介
 
初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法
 
QEMUでARM64bitベアメタルプログラミング
QEMUでARM64bitベアメタルプログラミングQEMUでARM64bitベアメタルプログラミング
QEMUでARM64bitベアメタルプログラミング
 
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
 
レガシーフリーOSに必要な要素技術 legacy free os
レガシーフリーOSに必要な要素技術 legacy free osレガシーフリーOSに必要な要素技術 legacy free os
レガシーフリーOSに必要な要素技術 legacy free os
 
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
 
MikanOSと自作CPUをUSBで接続する
MikanOSと自作CPUをUSBで接続するMikanOSと自作CPUをUSBで接続する
MikanOSと自作CPUをUSBで接続する
 
いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例
 
プロセスとコンテキストスイッチ
プロセスとコンテキストスイッチプロセスとコンテキストスイッチ
プロセスとコンテキストスイッチ
 
10分で分かるLinuxブロックレイヤ
10分で分かるLinuxブロックレイヤ10分で分かるLinuxブロックレイヤ
10分で分かるLinuxブロックレイヤ
 
CRC-32
CRC-32CRC-32
CRC-32
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
 
YoctoをつかったDistroの作り方とハマり方
YoctoをつかったDistroの作り方とハマり方YoctoをつかったDistroの作り方とハマり方
YoctoをつかったDistroの作り方とハマり方
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
 
20111015 勉強会 (PCIe / SR-IOV)
20111015 勉強会 (PCIe / SR-IOV)20111015 勉強会 (PCIe / SR-IOV)
20111015 勉強会 (PCIe / SR-IOV)
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分け
 
JIT のコードを読んでみた
JIT のコードを読んでみたJIT のコードを読んでみた
JIT のコードを読んでみた
 

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

Cell/B.E. プログラミング事始め
Cell/B.E. プログラミング事始めCell/B.E. プログラミング事始め
Cell/B.E. プログラミング事始め
You&I
 
最新UE4タイトルでのローカライズ事例 (UE4 Localization Deep Dive)
最新UE4タイトルでのローカライズ事例 (UE4 Localization Deep Dive)最新UE4タイトルでのローカライズ事例 (UE4 Localization Deep Dive)
最新UE4タイトルでのローカライズ事例 (UE4 Localization Deep Dive)
エピック・ゲームズ・ジャパン Epic Games Japan
 
ベンチマーク勉強会#02
ベンチマーク勉強会#02ベンチマーク勉強会#02
ベンチマーク勉強会#02
milk hanakara
 
皆さん!ふくてんが来ましたよ!!
皆さん!ふくてんが来ましたよ!!皆さん!ふくてんが来ましたよ!!
皆さん!ふくてんが来ましたよ!!
ru pic
 
Firefox OS and Open Web Board - IGGG Meetup 2015 Spring
Firefox OS and Open Web Board - IGGG Meetup 2015 SpringFirefox OS and Open Web Board - IGGG Meetup 2015 Spring
Firefox OS and Open Web Board - IGGG Meetup 2015 Spring
Gunma University
 
2014 0228 OSC-Spring Tokyo NETMF
2014 0228 OSC-Spring Tokyo NETMF2014 0228 OSC-Spring Tokyo NETMF
2014 0228 OSC-Spring Tokyo NETMF
Atomu Hidaka
 
ISUCON5 予選をPHPで戦った話
ISUCON5 予選をPHPで戦った話ISUCON5 予選をPHPで戦った話
ISUCON5 予選をPHPで戦った話
Suguru Shirai
 
Firefox mobile for android internals
Firefox mobile for android internalsFirefox mobile for android internals
Firefox mobile for android internals
Makoto Kato
 
第39回「Windows Server 2003 EOSに備えよう -SQL Serverはどうする?-」(2014/12/18 on しすなま!)
第39回「Windows Server 2003 EOSに備えよう -SQL Serverはどうする?-」(2014/12/18 on しすなま!)第39回「Windows Server 2003 EOSに備えよう -SQL Serverはどうする?-」(2014/12/18 on しすなま!)
第39回「Windows Server 2003 EOSに備えよう -SQL Serverはどうする?-」(2014/12/18 on しすなま!)
System x 部 (生!) : しすなま! @ Lenovo Enterprise Solutions Ltd.
 
Python languageupdate (2004)
Python languageupdate (2004)Python languageupdate (2004)
Python languageupdate (2004)
泰 増田
 
JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~
 JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~ JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~
JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~
Neppo Telewisteria
 
ネットワークOS野郎 ~ インフラ野郎Night 20160414
ネットワークOS野郎 ~ インフラ野郎Night 20160414ネットワークOS野郎 ~ インフラ野郎Night 20160414
ネットワークOS野郎 ~ インフラ野郎Night 20160414
Kentaro Ebisawa
 
あなたのAppleにもEFIモンスターはいませんか? by Pedro Vilaça - CODE BLUE 2015
あなたのAppleにもEFIモンスターはいませんか? by Pedro Vilaça - CODE BLUE 2015あなたのAppleにもEFIモンスターはいませんか? by Pedro Vilaça - CODE BLUE 2015
あなたのAppleにもEFIモンスターはいませんか? by Pedro Vilaça - CODE BLUE 2015
CODE BLUE
 
2015 0227 OSC-Spring Tokyo NETMF
2015 0227 OSC-Spring Tokyo NETMF2015 0227 OSC-Spring Tokyo NETMF
2015 0227 OSC-Spring Tokyo NETMF
Atomu Hidaka
 
20160619_LPICl304 技術解説セミナー in AP浜松町
20160619_LPICl304 技術解説セミナー in AP浜松町20160619_LPICl304 技術解説セミナー in AP浜松町
20160619_LPICl304 技術解説セミナー in AP浜松町
Takahiro Kujirai
 
Xamarinでも有能な .NET Core
 Xamarinでも有能な .NET Core  Xamarinでも有能な .NET Core
Xamarinでも有能な .NET Core
Yuta Matsumura
 
Cq tse-fm3セミナー資料
Cq tse-fm3セミナー資料Cq tse-fm3セミナー資料
Cq tse-fm3セミナー資料
Masaki Muranaka
 
Secret of Firefox
Secret of FirefoxSecret of Firefox
Secret of Firefox
dynamis
 
Unity に於けるモバイルプラットフォーム向けビルド自動化のおはなし
Unity に於けるモバイルプラットフォーム向けビルド自動化のおはなしUnity に於けるモバイルプラットフォーム向けビルド自動化のおはなし
Unity に於けるモバイルプラットフォーム向けビルド自動化のおはなし
Mori Tetsuya
 
福岡市LoRawan(TM)実証実験
福岡市LoRawan(TM)実証実験福岡市LoRawan(TM)実証実験
福岡市LoRawan(TM)実証実験
Kaz Ueno
 

Similar to UEFIベアメタルプログラミング (20)

Cell/B.E. プログラミング事始め
Cell/B.E. プログラミング事始めCell/B.E. プログラミング事始め
Cell/B.E. プログラミング事始め
 
最新UE4タイトルでのローカライズ事例 (UE4 Localization Deep Dive)
最新UE4タイトルでのローカライズ事例 (UE4 Localization Deep Dive)最新UE4タイトルでのローカライズ事例 (UE4 Localization Deep Dive)
最新UE4タイトルでのローカライズ事例 (UE4 Localization Deep Dive)
 
ベンチマーク勉強会#02
ベンチマーク勉強会#02ベンチマーク勉強会#02
ベンチマーク勉強会#02
 
皆さん!ふくてんが来ましたよ!!
皆さん!ふくてんが来ましたよ!!皆さん!ふくてんが来ましたよ!!
皆さん!ふくてんが来ましたよ!!
 
Firefox OS and Open Web Board - IGGG Meetup 2015 Spring
Firefox OS and Open Web Board - IGGG Meetup 2015 SpringFirefox OS and Open Web Board - IGGG Meetup 2015 Spring
Firefox OS and Open Web Board - IGGG Meetup 2015 Spring
 
2014 0228 OSC-Spring Tokyo NETMF
2014 0228 OSC-Spring Tokyo NETMF2014 0228 OSC-Spring Tokyo NETMF
2014 0228 OSC-Spring Tokyo NETMF
 
ISUCON5 予選をPHPで戦った話
ISUCON5 予選をPHPで戦った話ISUCON5 予選をPHPで戦った話
ISUCON5 予選をPHPで戦った話
 
Firefox mobile for android internals
Firefox mobile for android internalsFirefox mobile for android internals
Firefox mobile for android internals
 
第39回「Windows Server 2003 EOSに備えよう -SQL Serverはどうする?-」(2014/12/18 on しすなま!)
第39回「Windows Server 2003 EOSに備えよう -SQL Serverはどうする?-」(2014/12/18 on しすなま!)第39回「Windows Server 2003 EOSに備えよう -SQL Serverはどうする?-」(2014/12/18 on しすなま!)
第39回「Windows Server 2003 EOSに備えよう -SQL Serverはどうする?-」(2014/12/18 on しすなま!)
 
Python languageupdate (2004)
Python languageupdate (2004)Python languageupdate (2004)
Python languageupdate (2004)
 
JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~
 JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~ JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~
JA7YCQプログラミング勉強会 第2回 ~変数を理解しよう!~
 
ネットワークOS野郎 ~ インフラ野郎Night 20160414
ネットワークOS野郎 ~ インフラ野郎Night 20160414ネットワークOS野郎 ~ インフラ野郎Night 20160414
ネットワークOS野郎 ~ インフラ野郎Night 20160414
 
あなたのAppleにもEFIモンスターはいませんか? by Pedro Vilaça - CODE BLUE 2015
あなたのAppleにもEFIモンスターはいませんか? by Pedro Vilaça - CODE BLUE 2015あなたのAppleにもEFIモンスターはいませんか? by Pedro Vilaça - CODE BLUE 2015
あなたのAppleにもEFIモンスターはいませんか? by Pedro Vilaça - CODE BLUE 2015
 
2015 0227 OSC-Spring Tokyo NETMF
2015 0227 OSC-Spring Tokyo NETMF2015 0227 OSC-Spring Tokyo NETMF
2015 0227 OSC-Spring Tokyo NETMF
 
20160619_LPICl304 技術解説セミナー in AP浜松町
20160619_LPICl304 技術解説セミナー in AP浜松町20160619_LPICl304 技術解説セミナー in AP浜松町
20160619_LPICl304 技術解説セミナー in AP浜松町
 
Xamarinでも有能な .NET Core
 Xamarinでも有能な .NET Core  Xamarinでも有能な .NET Core
Xamarinでも有能な .NET Core
 
Cq tse-fm3セミナー資料
Cq tse-fm3セミナー資料Cq tse-fm3セミナー資料
Cq tse-fm3セミナー資料
 
Secret of Firefox
Secret of FirefoxSecret of Firefox
Secret of Firefox
 
Unity に於けるモバイルプラットフォーム向けビルド自動化のおはなし
Unity に於けるモバイルプラットフォーム向けビルド自動化のおはなしUnity に於けるモバイルプラットフォーム向けビルド自動化のおはなし
Unity に於けるモバイルプラットフォーム向けビルド自動化のおはなし
 
福岡市LoRawan(TM)実証実験
福岡市LoRawan(TM)実証実験福岡市LoRawan(TM)実証実験
福岡市LoRawan(TM)実証実験
 

More from Yuma Ohgami

最近のGB向け独自OS活動について(「レトロゲーム勉強会#10」の発表スライド)
最近のGB向け独自OS活動について(「レトロゲーム勉強会#10」の発表スライド)最近のGB向け独自OS活動について(「レトロゲーム勉強会#10」の発表スライド)
最近のGB向け独自OS活動について(「レトロゲーム勉強会#10」の発表スライド)
Yuma Ohgami
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Yuma Ohgami
 
Daisy OSでデイジーワールド!
Daisy OSでデイジーワールド!Daisy OSでデイジーワールド!
Daisy OSでデイジーワールド!
Yuma Ohgami
 
バイナリ生物学でデイジーワールド
バイナリ生物学でデイジーワールドバイナリ生物学でデイジーワールド
バイナリ生物学でデイジーワールド
Yuma Ohgami
 
OSC2023 Tokyo/Fall展示内容(予定)と技術書典15向け新刊(執筆中)のご紹介
OSC2023 Tokyo/Fall展示内容(予定)と技術書典15向け新刊(執筆中)のご紹介OSC2023 Tokyo/Fall展示内容(予定)と技術書典15向け新刊(執筆中)のご紹介
OSC2023 Tokyo/Fall展示内容(予定)と技術書典15向け新刊(執筆中)のご紹介
Yuma Ohgami
 
去年「バイナリ生物学」で今年「PDP-7」だったのはなぜなのか?
去年「バイナリ生物学」で今年「PDP-7」だったのはなぜなのか?去年「バイナリ生物学」で今年「PDP-7」だったのはなぜなのか?
去年「バイナリ生物学」で今年「PDP-7」だったのはなぜなのか?
Yuma Ohgami
 
60年代ゲームハードPDP-7のご紹介
60年代ゲームハードPDP-7のご紹介60年代ゲームハードPDP-7のご紹介
60年代ゲームハードPDP-7のご紹介
Yuma Ohgami
 
来週の展示内容紹介
来週の展示内容紹介来週の展示内容紹介
来週の展示内容紹介
Yuma Ohgami
 
DaisyOS(仮)のご紹介
DaisyOS(仮)のご紹介DaisyOS(仮)のご紹介
DaisyOS(仮)のご紹介
Yuma Ohgami
 
セキュリティ・ネクストキャンプ2022 オンライン [N9] バイナリ生物学入門
セキュリティ・ネクストキャンプ2022 オンライン [N9] バイナリ生物学入門セキュリティ・ネクストキャンプ2022 オンライン [N9] バイナリ生物学入門
セキュリティ・ネクストキャンプ2022 オンライン [N9] バイナリ生物学入門
Yuma Ohgami
 
セキュリティ・ネクストキャンプ2022 オンライン [N5] バイナリ生物学入門
セキュリティ・ネクストキャンプ2022 オンライン [N5] バイナリ生物学入門セキュリティ・ネクストキャンプ2022 オンライン [N5] バイナリ生物学入門
セキュリティ・ネクストキャンプ2022 オンライン [N5] バイナリ生物学入門
Yuma Ohgami
 
『へにゃぺんて』のこれまでを振り返るブログ記事の紹介
『へにゃぺんて』のこれまでを振り返るブログ記事の紹介『へにゃぺんて』のこれまでを振り返るブログ記事の紹介
『へにゃぺんて』のこれまでを振り返るブログ記事の紹介
Yuma Ohgami
 
「へにゃぺんて」のこれまでを振り返るブログ記事の紹介
「へにゃぺんて」のこれまでを振り返るブログ記事の紹介「へにゃぺんて」のこれまでを振り返るブログ記事の紹介
「へにゃぺんて」のこれまでを振り返るブログ記事の紹介
Yuma Ohgami
 
バイナリ生成環境『daisy-tools』のご紹介
バイナリ生成環境『daisy-tools』のご紹介バイナリ生成環境『daisy-tools』のご紹介
バイナリ生成環境『daisy-tools』のご紹介
Yuma Ohgami
 
セガサターンで動く自作シンセサイザーの紹介
セガサターンで動く自作シンセサイザーの紹介セガサターンで動く自作シンセサイザーの紹介
セガサターンで動く自作シンセサイザーの紹介
Yuma Ohgami
 
セガサターンマシン語プログラミングの紹介
セガサターンマシン語プログラミングの紹介セガサターンマシン語プログラミングの紹介
セガサターンマシン語プログラミングの紹介
Yuma Ohgami
 
ハードの作りで振り返るセガサターン
ハードの作りで振り返るセガサターンハードの作りで振り返るセガサターン
ハードの作りで振り返るセガサターン
Yuma Ohgami
 
エミュレータのコードを読んでわかるセガサターン
エミュレータのコードを読んでわかるセガサターンエミュレータのコードを読んでわかるセガサターン
エミュレータのコードを読んでわかるセガサターン
Yuma Ohgami
 
エミュレータのコードを読んでわかる「セガサターン」
エミュレータのコードを読んでわかる「セガサターン」エミュレータのコードを読んでわかる「セガサターン」
エミュレータのコードを読んでわかる「セガサターン」
Yuma Ohgami
 
シェルスクリプトでセガサターンマシン語ベアメタルプログラミング
シェルスクリプトでセガサターンマシン語ベアメタルプログラミングシェルスクリプトでセガサターンマシン語ベアメタルプログラミング
シェルスクリプトでセガサターンマシン語ベアメタルプログラミング
Yuma Ohgami
 

More from Yuma Ohgami (20)

最近のGB向け独自OS活動について(「レトロゲーム勉強会#10」の発表スライド)
最近のGB向け独自OS活動について(「レトロゲーム勉強会#10」の発表スライド)最近のGB向け独自OS活動について(「レトロゲーム勉強会#10」の発表スライド)
最近のGB向け独自OS活動について(「レトロゲーム勉強会#10」の発表スライド)
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
Daisy OSでデイジーワールド!
Daisy OSでデイジーワールド!Daisy OSでデイジーワールド!
Daisy OSでデイジーワールド!
 
バイナリ生物学でデイジーワールド
バイナリ生物学でデイジーワールドバイナリ生物学でデイジーワールド
バイナリ生物学でデイジーワールド
 
OSC2023 Tokyo/Fall展示内容(予定)と技術書典15向け新刊(執筆中)のご紹介
OSC2023 Tokyo/Fall展示内容(予定)と技術書典15向け新刊(執筆中)のご紹介OSC2023 Tokyo/Fall展示内容(予定)と技術書典15向け新刊(執筆中)のご紹介
OSC2023 Tokyo/Fall展示内容(予定)と技術書典15向け新刊(執筆中)のご紹介
 
去年「バイナリ生物学」で今年「PDP-7」だったのはなぜなのか?
去年「バイナリ生物学」で今年「PDP-7」だったのはなぜなのか?去年「バイナリ生物学」で今年「PDP-7」だったのはなぜなのか?
去年「バイナリ生物学」で今年「PDP-7」だったのはなぜなのか?
 
60年代ゲームハードPDP-7のご紹介
60年代ゲームハードPDP-7のご紹介60年代ゲームハードPDP-7のご紹介
60年代ゲームハードPDP-7のご紹介
 
来週の展示内容紹介
来週の展示内容紹介来週の展示内容紹介
来週の展示内容紹介
 
DaisyOS(仮)のご紹介
DaisyOS(仮)のご紹介DaisyOS(仮)のご紹介
DaisyOS(仮)のご紹介
 
セキュリティ・ネクストキャンプ2022 オンライン [N9] バイナリ生物学入門
セキュリティ・ネクストキャンプ2022 オンライン [N9] バイナリ生物学入門セキュリティ・ネクストキャンプ2022 オンライン [N9] バイナリ生物学入門
セキュリティ・ネクストキャンプ2022 オンライン [N9] バイナリ生物学入門
 
セキュリティ・ネクストキャンプ2022 オンライン [N5] バイナリ生物学入門
セキュリティ・ネクストキャンプ2022 オンライン [N5] バイナリ生物学入門セキュリティ・ネクストキャンプ2022 オンライン [N5] バイナリ生物学入門
セキュリティ・ネクストキャンプ2022 オンライン [N5] バイナリ生物学入門
 
『へにゃぺんて』のこれまでを振り返るブログ記事の紹介
『へにゃぺんて』のこれまでを振り返るブログ記事の紹介『へにゃぺんて』のこれまでを振り返るブログ記事の紹介
『へにゃぺんて』のこれまでを振り返るブログ記事の紹介
 
「へにゃぺんて」のこれまでを振り返るブログ記事の紹介
「へにゃぺんて」のこれまでを振り返るブログ記事の紹介「へにゃぺんて」のこれまでを振り返るブログ記事の紹介
「へにゃぺんて」のこれまでを振り返るブログ記事の紹介
 
バイナリ生成環境『daisy-tools』のご紹介
バイナリ生成環境『daisy-tools』のご紹介バイナリ生成環境『daisy-tools』のご紹介
バイナリ生成環境『daisy-tools』のご紹介
 
セガサターンで動く自作シンセサイザーの紹介
セガサターンで動く自作シンセサイザーの紹介セガサターンで動く自作シンセサイザーの紹介
セガサターンで動く自作シンセサイザーの紹介
 
セガサターンマシン語プログラミングの紹介
セガサターンマシン語プログラミングの紹介セガサターンマシン語プログラミングの紹介
セガサターンマシン語プログラミングの紹介
 
ハードの作りで振り返るセガサターン
ハードの作りで振り返るセガサターンハードの作りで振り返るセガサターン
ハードの作りで振り返るセガサターン
 
エミュレータのコードを読んでわかるセガサターン
エミュレータのコードを読んでわかるセガサターンエミュレータのコードを読んでわかるセガサターン
エミュレータのコードを読んでわかるセガサターン
 
エミュレータのコードを読んでわかる「セガサターン」
エミュレータのコードを読んでわかる「セガサターン」エミュレータのコードを読んでわかる「セガサターン」
エミュレータのコードを読んでわかる「セガサターン」
 
シェルスクリプトでセガサターンマシン語ベアメタルプログラミング
シェルスクリプトでセガサターンマシン語ベアメタルプログラミングシェルスクリプトでセガサターンマシン語ベアメタルプログラミング
シェルスクリプトでセガサターンマシン語ベアメタルプログラミング
 

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

  • 1. わんくま同盟 札幌勉強会 #1 2017-03 UEFIベアメタルプログラミング 大神 祐真 yuma@ohgami.jp
  • 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
  • 27. わんくま同盟 札幌勉強会 #1 2017-03 実機での実行の様子
  • 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
  • 32. わんくま同盟 札幌勉強会 #1 2017-03 UEFIの情報取得 EFI_TABLE_HEADERの定義
  • 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からプロトコルの構造体の先頭アドレスを取得できる
  • 39. わんくま同盟 札幌勉強会 #1 2017-03 GUIDとLocateProtocol() LocateProtocol()使用例
  • 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のプログラムを作る 開発環境等をオープンソースで 提供するプロジェクトです。