SlideShare uma empresa Scribd logo
1 de 48
Baixar para ler offline
わんくま同盟 札幌勉強会 #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のプログラムを作る
開発環境等をオープンソースで
提供するプロジェクトです。

Mais conteúdo relacionado

Mais procurados

シェル芸初心者によるシェル芸入門
シェル芸初心者によるシェル芸入門シェル芸初心者によるシェル芸入門
シェル芸初心者によるシェル芸入門
icchy
 

Mais procurados (20)

OSSライセンス入門
OSSライセンス入門OSSライセンス入門
OSSライセンス入門
 
ゼロから作るKubernetesによるJupyter as a Service ー Kubernetes Meetup Tokyo #43
ゼロから作るKubernetesによるJupyter as a Service ー Kubernetes Meetup Tokyo #43ゼロから作るKubernetesによるJupyter as a Service ー Kubernetes Meetup Tokyo #43
ゼロから作るKubernetesによるJupyter as a Service ー Kubernetes Meetup Tokyo #43
 
シェル芸初心者によるシェル芸入門
シェル芸初心者によるシェル芸入門シェル芸初心者によるシェル芸入門
シェル芸初心者によるシェル芸入門
 
使ってみて気づいた AGPL ライセンスの メリット・デメリット
使ってみて気づいた AGPL ライセンスの メリット・デメリット使ってみて気づいた AGPL ライセンスの メリット・デメリット
使ってみて気づいた AGPL ライセンスの メリット・デメリット
 
オープンソースライセンスの基礎と実務
オープンソースライセンスの基礎と実務オープンソースライセンスの基礎と実務
オープンソースライセンスの基礎と実務
 
Linuxのsemaphoreとmutexを見る 
Linuxのsemaphoreとmutexを見る Linuxのsemaphoreとmutexを見る 
Linuxのsemaphoreとmutexを見る 
 
Glibc malloc internal
Glibc malloc internalGlibc malloc internal
Glibc malloc internal
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
 
ポアソン画像合成
ポアソン画像合成ポアソン画像合成
ポアソン画像合成
 
GPU最適化入門
GPU最適化入門GPU最適化入門
GPU最適化入門
 
【2000行弱!】x86用自作カーネルの紹介
【2000行弱!】x86用自作カーネルの紹介【2000行弱!】x86用自作カーネルの紹介
【2000行弱!】x86用自作カーネルの紹介
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
 
協働ロボットCOROの開発における形式的仕様記述KMLの開発と適用
協働ロボットCOROの開発における形式的仕様記述KMLの開発と適用協働ロボットCOROの開発における形式的仕様記述KMLの開発と適用
協働ロボットCOROの開発における形式的仕様記述KMLの開発と適用
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
 
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
 
ディープラーニングで音ゲー譜面を自動作成!
ディープラーニングで音ゲー譜面を自動作成!ディープラーニングで音ゲー譜面を自動作成!
ディープラーニングで音ゲー譜面を自動作成!
 
ARM LinuxのMMUはわかりにくい
ARM LinuxのMMUはわかりにくいARM LinuxのMMUはわかりにくい
ARM LinuxのMMUはわかりにくい
 
macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~
macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~
macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~
 
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないこと画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
 

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

Firefox mobile for android internals
Firefox mobile for android internalsFirefox mobile for android internals
Firefox mobile for android internals
Makoto Kato
 
Cq tse-fm3セミナー資料
Cq tse-fm3セミナー資料Cq tse-fm3セミナー資料
Cq tse-fm3セミナー資料
Masaki Muranaka
 

Semelhante a 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)
 
レガシーフリーOSに必要な要素技術 legacy free os
レガシーフリーOSに必要な要素技術 legacy free osレガシーフリーOSに必要な要素技術 legacy free os
レガシーフリーOSに必要な要素技術 legacy free os
 
ベンチマーク勉強会#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回 ~変数を理解しよう!~
 
あなたの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)実証実験
 

Mais de Yuma Ohgami

Mais de Yuma Ohgami (20)

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』のご紹介
 
セガサターンで動く自作シンセサイザーの紹介
セガサターンで動く自作シンセサイザーの紹介セガサターンで動く自作シンセサイザーの紹介
セガサターンで動く自作シンセサイザーの紹介
 
セガサターンマシン語プログラミングの紹介
セガサターンマシン語プログラミングの紹介セガサターンマシン語プログラミングの紹介
セガサターンマシン語プログラミングの紹介
 
ハードの作りで振り返るセガサターン
ハードの作りで振り返るセガサターンハードの作りで振り返るセガサターン
ハードの作りで振り返るセガサターン
 
エミュレータのコードを読んでわかるセガサターン
エミュレータのコードを読んでわかるセガサターンエミュレータのコードを読んでわかるセガサターン
エミュレータのコードを読んでわかるセガサターン
 
エミュレータのコードを読んでわかる「セガサターン」
エミュレータのコードを読んでわかる「セガサターン」エミュレータのコードを読んでわかる「セガサターン」
エミュレータのコードを読んでわかる「セガサターン」
 
シェルスクリプトでセガサターンマシン語ベアメタルプログラミング
シェルスクリプトでセガサターンマシン語ベアメタルプログラミングシェルスクリプトでセガサターンマシン語ベアメタルプログラミング
シェルスクリプトでセガサターンマシン語ベアメタルプログラミング
 
ゲームボーイ向けOSの作り方
ゲームボーイ向けOSの作り方ゲームボーイ向けOSの作り方
ゲームボーイ向けOSの作り方
 

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のプログラムを作る 開発環境等をオープンソースで 提供するプロジェクトです。