Hello_UEFI_で学ぶC言語ポインタ.pdf

472bd455afffd59d4e2ece07d9478ad4?s=47 VTb
December 07, 2018
64

 Hello_UEFI_で学ぶC言語ポインタ.pdf

472bd455afffd59d4e2ece07d9478ad4?s=128

VTb

December 07, 2018
Tweet

Transcript

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

  2. 基本情報 トゥイッタ:PiBVT(@PiBVT) • セキュキャン2018でUEFIからxv6を起動させること に成功した。 https://speakerdeck.com/naoki9911/64bit-uefikar axv6woqi-dong-sitemita にスライド有ります。 • x86,UEFI,ネットワークあたりで遊んでいる

    • 最近2TB近くのデータを吹っ飛ばした • OSC Tokyo Fallで作ったOSを展示予定
  3. UEFI(Unified Extensible Firmware Interface)とは? • OS層とハードウェア層間でのインター フェースを定義する規格 • レガシーなBIOSの置き換えを目的とした UEFI

    BIOSが有名 要するに、 • ハードウェアの差異を吸収していい感じに OSを動かすためのソフトウェア https://ja.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface より
  4. UEFIの開発環境 代表的なものとしては2つある • EDK2 Intel製のSDK UEFIアプリだけでなく周辺ライブラリやファームウェア自体の開発もできる • GNU-EFI GNUのUEFI用SDK UEFIのAPIを叩くことしか出来ないため、UEFIアプリ開発専用

  5. EDK2の使い方 省略

  6. UEFIアプリの開発手法 省略

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

  8. Hello UEFI! 実行すると...

  9. Hello UEFI 終了!

  10. あまりにも 味気ない

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

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

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

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

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

    horizontal_resolution pixels_per_scan_line vertical_resolution
  16. 画面描画をしよう • 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)
  17. フォントを描画しよう • BMP形式のフォントの場合、左図のように ディスプレイと同様にピクセルとフォントバイ ナリが対応している • フォントを画面に描画する場合は、1つずつ ピクセルをメモリーにコピーすれば描画でき る

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

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

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

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

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

  23. SLを移植しよう • 文字列を格納するためにchar *型の配列を用意し代入している • “Hello UEFI”のような文字列はchar *型(const char *型)で文字列の先頭番地を指

    し示す。 • ‘A’のような単一文字はchar型(文字コードを指し示す) • char* hoge[5] だと、hoge[0]やhoge[4]はchar *型、hogeはchar **型
  24. 実演 実機上でSLを走らせてみた。

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

  26. 時間が余ったので自分の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 をしたい
  27. ソースコード https://github.com/naoki9911/sl_on_uefi にあります