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
450
Featured
See All Featured
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Designing Experiences People Love
moore
138
23k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
29k
Gamification - CAS2011
davidbonilla
80
5k
Statistics for Hackers
jakevdp
796
220k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
109
49k
The Language of Interfaces
destraynor
154
24k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
31
2.7k
GraphQLの誤解/rethinking-graphql
sonatard
67
10k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
159
15k
How GitHub (no longer) Works
holman
310
140k
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 にあります