Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Hello_UEFI_で学ぶC言語ポインタ.pdf
Search
VTb
December 07, 2018
0
140
Hello_UEFI_で学ぶC言語ポインタ.pdf
VTb
December 07, 2018
Tweet
Share
More Decks by VTb
See All by VTb
VSP専用プロセッサ設計と実行エンジンIyokanについて
pibvt
0
250
MR1を支えた Ethernet&ROS システム
pibvt
3
1.2k
3日間で作る フルスクラッチHTTPサーバー on STM32F767 Nucleo
pibvt
14
5.7k
64bit UEFIからxv6を起動してみた
pibvt
0
460
Featured
See All Featured
Keith and Marios Guide to Fast Websites
keithpitt
410
22k
Thoughts on Productivity
jonyablonski
67
4.3k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
10
790
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
132
33k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
Why You Should Never Use an ORM
jnunemaker
PRO
54
9.1k
Product Roadmaps are Hard
iamctodd
PRO
49
11k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
59k
Fireside Chat
paigeccino
34
3.1k
Embracing the Ebb and Flow
colly
84
4.5k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
Rails Girls Zürich Keynote
gr2m
94
13k
Transcript
Hello UEFI で学ぶC言語ポインタ @PiBVT
基本情報 トゥイッタ:PiBVT(@PiBVT) • セキュキャン2018でUEFIからxv6を起動させること に成功した。 https://speakerdeck.com/naoki9911/64bit-uefikar axv6woqi-dong-sitemita にスライド有ります。 • x86,UEFI,ネットワークあたりで遊んでいる
• 最近2TB近くのデータを吹っ飛ばした • OSC Tokyo Fallで作ったOSを展示予定
UEFI(Unified Extensible Firmware Interface)とは? • OS層とハードウェア層間でのインター フェースを定義する規格 • レガシーなBIOSの置き換えを目的とした UEFI
BIOSが有名 要するに、 • ハードウェアの差異を吸収していい感じに OSを動かすためのソフトウェア https://ja.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface より
UEFIの開発環境 代表的なものとしては2つある • EDK2 Intel製のSDK UEFIアプリだけでなく周辺ライブラリやファームウェア自体の開発もできる • GNU-EFI GNUのUEFI用SDK UEFIのAPIを叩くことしか出来ないため、UEFIアプリ開発専用
EDK2の使い方 省略
UEFIアプリの開発手法 省略
Hello UEFI! • UEFIのAPI、Print()関数を利用することで 簡単に画面上に文字を出力することが出 来る。 • 出力後はhlt命令でCPUを止める
Hello UEFI! 実行すると...
Hello UEFI 終了!
あまりにも 味気ない
そうだ! SLを走らせよう!
UEFIアプリでSLを走らせるのに必要な要素 • 自由な場所にフォントを表示する機能 =>フレームバッファを直接操作する =>フォントは全て自作 • 表示毎に一定時間停止する機能(タイマー機能) =>UEFIのEventとTimer機能を利用する 解説は省略
フレームバッファとは? ディスプレイのピクセル1つずつとメモリーを対応化させたもの メモリ ディスプレイ
画面描画をしよう フレームバッファにアクセスすることで画面描画する方法 1. フレームバッファのベースアドレスを取得する(解説は省略) 2. フレームバッファのアドレスを計算する 3. 計算したアドレスに値を書き込む 4. 同様の操作をピクセル毎に繰り返す
画面描画をしよう • ピクセル1つあたりRGB(24bit)+1の4バ イト • アドレスは左上から図のように増えていく • フレームバッファには表示されない領域 も存在するため、それを考慮してアドレス を計算する
horizontal_resolution pixels_per_scan_line vertical_resolution
画面描画をしよう • addrが計算されたアドレス • 1バイトの変数型UINT8でポインタ変数mem_arrayを宣言し、初期化時のアドレスとして addrを代 入する • mem_arrayに対して[]を利用して順番にRGBの色を代入していく •
mem_array[0]のアドレスはaddr (&mem_array[0] == addr) • mem_array[1]のアドレスはaddr+1 (&mem_array[1] == addr+1) • mem_array[2]のアドレスはaddr+2 (&mem_array[2] == addr+2)
フォントを描画しよう • BMP形式のフォントの場合、左図のように ディスプレイと同様にピクセルとフォントバイ ナリが対応している • フォントを画面に描画する場合は、1つずつ ピクセルをメモリーにコピーすれば描画でき る
フォントを描画しよう • フォントデータを順番に読み、白または黒に塗りつぶしている • code-0x20は文字コードと配列を対応化させるため
フォントを描画しよう • x,yで操作するピクセルを指定する • graphic_draw_black 黒く塗りつぶすためにRGB全色を0(=表示し ない)ようにしている • graphic_draw_font 白く塗りつぶすためにRGB全色を
0xFF(=256)にしている
SLを移植しよう • フォントを自由に描画できるようになった! • 裏作業でタイマーを利用したdelay()関数も実装できた。 SLを移植しよう!
SLを移植しよう • 移植のベースにはhttps://github.com/mtoyoda/slのsl.hを利用する • 元sl.hでの文字列の文字数を揃えるなど、使いやすくした。
SLを移植しよう • 基本的にはSLの文字列を配列 に格納し、順番に描画している だけ。 • consoleの各種関数の解説は 省略
SLを移植しよう • 文字列を格納するためにchar *型の配列を用意し代入している • “Hello UEFI”のような文字列はchar *型(const char *型)で文字列の先頭番地を指
し示す。 • ‘A’のような単一文字はchar型(文字コードを指し示す) • char* hoge[5] だと、hoge[0]やhoge[4]はchar *型、hogeはchar **型
実演 実機上でSLを走らせてみた。
余談 ~structとポインタの話~ OS等を書いていると、structとポインタの組み合わせが超便利という話。 面倒なのでホワイトボードに書きます
時間が余ったので自分のOS自慢 • xv6というMIT製のOSを64bitUEFIから起動できるようにした。(従来はBIOS) • 夏休みにPCIバス制御,NICデバドラ,Ethernet,IP,TCPを実装し、HelloWorldだけを 返すHTTPサーバーを実装した。 • OSC Tokyo Fall
で os-dev jpの展示の1つとして展示予定 • 自作アプリ with 自作Cコンパイラ in 自作OS on 自作CPU をしたい
ソースコード https://github.com/naoki9911/sl_on_uefi にあります