SlideShare ist ein Scribd-Unternehmen logo
1 von 48
Downloaden Sie, um offline zu lesen
わんくま同盟 札幌勉強会 #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のプログラムを作る
開発環境等をオープンソースで
提供するプロジェクトです。

Weitere ähnliche Inhalte

Was ist angesagt?

BuildKitの概要と最近の機能
BuildKitの概要と最近の機能BuildKitの概要と最近の機能
BuildKitの概要と最近の機能Kohei Tokunaga
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門Fixstars Corporation
 
ゲーム開発とデザインパターン
ゲーム開発とデザインパターンゲーム開発とデザインパターン
ゲーム開発とデザインパターンTakashi Komada
 
NEDIA_SNIA_CXL_講演資料.pdf
NEDIA_SNIA_CXL_講演資料.pdfNEDIA_SNIA_CXL_講演資料.pdf
NEDIA_SNIA_CXL_講演資料.pdfYasunori Goto
 
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編Fixstars Corporation
 
いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門Fixstars Corporation
 
Rust で RTOS を考える
Rust で RTOS を考えるRust で RTOS を考える
Rust で RTOS を考えるryuz88
 
eStargzイメージとlazy pullingによる高速なコンテナ起動
eStargzイメージとlazy pullingによる高速なコンテナ起動eStargzイメージとlazy pullingによる高速なコンテナ起動
eStargzイメージとlazy pullingによる高速なコンテナ起動Kohei Tokunaga
 
DockerコンテナでGitを使う
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使うKazuhiro Suga
 
1076: CUDAデバッグ・プロファイリング入門
1076: CUDAデバッグ・プロファイリング入門1076: CUDAデバッグ・プロファイリング入門
1076: CUDAデバッグ・プロファイリング入門NVIDIA Japan
 
Fortranが拓く世界、VSCodeが架ける橋
Fortranが拓く世界、VSCodeが架ける橋Fortranが拓く世界、VSCodeが架ける橋
Fortranが拓く世界、VSCodeが架ける橋智啓 出川
 
USB3.0ドライバ開発の道
USB3.0ドライバ開発の道USB3.0ドライバ開発の道
USB3.0ドライバ開発の道uchan_nos
 
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~ CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~ SEGADevTech
 
【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All ThingsUnityTechnologiesJapan002
 
【2000行弱!】x86用自作カーネルの紹介
【2000行弱!】x86用自作カーネルの紹介【2000行弱!】x86用自作カーネルの紹介
【2000行弱!】x86用自作カーネルの紹介Yuma Ohgami
 
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~Daisuke Morishita
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14Ryo Suzuki
 

Was ist angesagt? (20)

BuildKitの概要と最近の機能
BuildKitの概要と最近の機能BuildKitの概要と最近の機能
BuildKitの概要と最近の機能
 
私とOSSの25年
私とOSSの25年私とOSSの25年
私とOSSの25年
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
 
ゲーム開発とデザインパターン
ゲーム開発とデザインパターンゲーム開発とデザインパターン
ゲーム開発とデザインパターン
 
レシピの作り方入門
レシピの作り方入門レシピの作り方入門
レシピの作り方入門
 
NEDIA_SNIA_CXL_講演資料.pdf
NEDIA_SNIA_CXL_講演資料.pdfNEDIA_SNIA_CXL_講演資料.pdf
NEDIA_SNIA_CXL_講演資料.pdf
 
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
 
いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門
 
Rust で RTOS を考える
Rust で RTOS を考えるRust で RTOS を考える
Rust で RTOS を考える
 
eStargzイメージとlazy pullingによる高速なコンテナ起動
eStargzイメージとlazy pullingによる高速なコンテナ起動eStargzイメージとlazy pullingによる高速なコンテナ起動
eStargzイメージとlazy pullingによる高速なコンテナ起動
 
DockerコンテナでGitを使う
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使う
 
1076: CUDAデバッグ・プロファイリング入門
1076: CUDAデバッグ・プロファイリング入門1076: CUDAデバッグ・プロファイリング入門
1076: CUDAデバッグ・プロファイリング入門
 
Fortranが拓く世界、VSCodeが架ける橋
Fortranが拓く世界、VSCodeが架ける橋Fortranが拓く世界、VSCodeが架ける橋
Fortranが拓く世界、VSCodeが架ける橋
 
GPU最適化入門
GPU最適化入門GPU最適化入門
GPU最適化入門
 
USB3.0ドライバ開発の道
USB3.0ドライバ開発の道USB3.0ドライバ開発の道
USB3.0ドライバ開発の道
 
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~ CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
 
【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things
 
【2000行弱!】x86用自作カーネルの紹介
【2000行弱!】x86用自作カーネルの紹介【2000行弱!】x86用自作カーネルの紹介
【2000行弱!】x86用自作カーネルの紹介
 
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
 

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

Cell/B.E. プログラミング事始め
Cell/B.E. プログラミング事始めCell/B.E. プログラミング事始め
Cell/B.E. プログラミング事始めYou&I
 
レガシーフリーOSに必要な要素技術 legacy free os
レガシーフリーOSに必要な要素技術 legacy free osレガシーフリーOSに必要な要素技術 legacy free os
レガシーフリーOSに必要な要素技術 legacy free osuchan_nos
 
ベンチマーク勉強会#02
ベンチマーク勉強会#02ベンチマーク勉強会#02
ベンチマーク勉強会#02milk 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 SpringGunma University
 
2014 0228 OSC-Spring Tokyo NETMF
2014 0228 OSC-Spring Tokyo NETMF2014 0228 OSC-Spring Tokyo NETMF
2014 0228 OSC-Spring Tokyo NETMFAtomu 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 internalsMakoto Kato
 
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 20160414Kentaro 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 2015CODE BLUE
 
2015 0227 OSC-Spring Tokyo NETMF
2015 0227 OSC-Spring Tokyo NETMF2015 0227 OSC-Spring Tokyo NETMF
2015 0227 OSC-Spring Tokyo NETMFAtomu 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 Firefoxdynamis
 
Unity に於けるモバイルプラットフォーム向けビルド自動化のおはなし
Unity に於けるモバイルプラットフォーム向けビルド自動化のおはなしUnity に於けるモバイルプラットフォーム向けビルド自動化のおはなし
Unity に於けるモバイルプラットフォーム向けビルド自動化のおはなしMori Tetsuya
 

Ähnlich wie 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回 ~変数を理解しよう!~
 
ネットワーク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 に於けるモバイルプラットフォーム向けビルド自動化のおはなし
 

Mehr von 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
 
ゲームボーイ向けOSの作り方
ゲームボーイ向けOSの作り方ゲームボーイ向けOSの作り方
ゲームボーイ向けOSの作り方Yuma Ohgami
 

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