Slide 1

Slide 1 text

Hello UEFI で学ぶC言語ポインタ @PiBVT

Slide 2

Slide 2 text

基本情報 トゥイッタ:PiBVT(@PiBVT) ● セキュキャン2018でUEFIからxv6を起動させること に成功した。 https://speakerdeck.com/naoki9911/64bit-uefikar axv6woqi-dong-sitemita にスライド有ります。 ● x86,UEFI,ネットワークあたりで遊んでいる ● 最近2TB近くのデータを吹っ飛ばした ● OSC Tokyo Fallで作ったOSを展示予定

Slide 3

Slide 3 text

UEFI(Unified Extensible Firmware Interface)とは? ● OS層とハードウェア層間でのインター フェースを定義する規格 ● レガシーなBIOSの置き換えを目的とした UEFI BIOSが有名 要するに、 ● ハードウェアの差異を吸収していい感じに OSを動かすためのソフトウェア https://ja.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface より

Slide 4

Slide 4 text

UEFIの開発環境 代表的なものとしては2つある ● EDK2 Intel製のSDK UEFIアプリだけでなく周辺ライブラリやファームウェア自体の開発もできる ● GNU-EFI GNUのUEFI用SDK UEFIのAPIを叩くことしか出来ないため、UEFIアプリ開発専用

Slide 5

Slide 5 text

EDK2の使い方 省略

Slide 6

Slide 6 text

UEFIアプリの開発手法 省略

Slide 7

Slide 7 text

Hello UEFI! ● UEFIのAPI、Print()関数を利用することで 簡単に画面上に文字を出力することが出 来る。 ● 出力後はhlt命令でCPUを止める

Slide 8

Slide 8 text

Hello UEFI! 実行すると...

Slide 9

Slide 9 text

Hello UEFI 終了!

Slide 10

Slide 10 text

あまりにも 味気ない

Slide 11

Slide 11 text

そうだ! SLを走らせよう!

Slide 12

Slide 12 text

UEFIアプリでSLを走らせるのに必要な要素 ● 自由な場所にフォントを表示する機能 =>フレームバッファを直接操作する =>フォントは全て自作 ● 表示毎に一定時間停止する機能(タイマー機能) =>UEFIのEventとTimer機能を利用する 解説は省略

Slide 13

Slide 13 text

フレームバッファとは? ディスプレイのピクセル1つずつとメモリーを対応化させたもの メモリ ディスプレイ

Slide 14

Slide 14 text

画面描画をしよう フレームバッファにアクセスすることで画面描画する方法 1. フレームバッファのベースアドレスを取得する(解説は省略) 2. フレームバッファのアドレスを計算する 3. 計算したアドレスに値を書き込む 4. 同様の操作をピクセル毎に繰り返す

Slide 15

Slide 15 text

画面描画をしよう ● ピクセル1つあたりRGB(24bit)+1の4バ イト ● アドレスは左上から図のように増えていく ● フレームバッファには表示されない領域 も存在するため、それを考慮してアドレス を計算する horizontal_resolution pixels_per_scan_line vertical_resolution

Slide 16

Slide 16 text

画面描画をしよう ● 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)

Slide 17

Slide 17 text

フォントを描画しよう ● BMP形式のフォントの場合、左図のように ディスプレイと同様にピクセルとフォントバイ ナリが対応している ● フォントを画面に描画する場合は、1つずつ ピクセルをメモリーにコピーすれば描画でき る

Slide 18

Slide 18 text

フォントを描画しよう ● フォントデータを順番に読み、白または黒に塗りつぶしている ● code-0x20は文字コードと配列を対応化させるため

Slide 19

Slide 19 text

フォントを描画しよう ● x,yで操作するピクセルを指定する ● graphic_draw_black 黒く塗りつぶすためにRGB全色を0(=表示し ない)ようにしている ● graphic_draw_font 白く塗りつぶすためにRGB全色を 0xFF(=256)にしている

Slide 20

Slide 20 text

SLを移植しよう ● フォントを自由に描画できるようになった! ● 裏作業でタイマーを利用したdelay()関数も実装できた。 SLを移植しよう!

Slide 21

Slide 21 text

SLを移植しよう ● 移植のベースにはhttps://github.com/mtoyoda/slのsl.hを利用する ● 元sl.hでの文字列の文字数を揃えるなど、使いやすくした。

Slide 22

Slide 22 text

SLを移植しよう ● 基本的にはSLの文字列を配列 に格納し、順番に描画している だけ。 ● consoleの各種関数の解説は 省略

Slide 23

Slide 23 text

SLを移植しよう ● 文字列を格納するためにchar *型の配列を用意し代入している ● “Hello UEFI”のような文字列はchar *型(const char *型)で文字列の先頭番地を指 し示す。 ● ‘A’のような単一文字はchar型(文字コードを指し示す) ● char* hoge[5] だと、hoge[0]やhoge[4]はchar *型、hogeはchar **型

Slide 24

Slide 24 text

実演 実機上でSLを走らせてみた。

Slide 25

Slide 25 text

余談 ~structとポインタの話~ OS等を書いていると、structとポインタの組み合わせが超便利という話。 面倒なのでホワイトボードに書きます

Slide 26

Slide 26 text

時間が余ったので自分の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 をしたい

Slide 27

Slide 27 text

ソースコード https://github.com/naoki9911/sl_on_uefi にあります