ラベル EFI Toolkit の投稿を表示しています。 すべての投稿を表示
ラベル EFI Toolkit の投稿を表示しています。 すべての投稿を表示

9/20/2011

EFI アプリを作る その1

(*この記事は以前、私が運営していたhttp://www.poppolab.comというサイトで公開していたものですが、ドメイン維持の都合により閉鎖しましたため、こちらに投稿し直します。内容は1年近く古いものですので、現在の事情とは食い違う可能性があります。)


前回、EFI Toolkitを試してみましたが、このkitを使ってアプリを作り始めました。しかしながら、またしても切ないことが分かりました。なんと、現在の最新版EFIToolkitは2.0.0.1なのですが、これ、EFI Specification1.10までの対応で、現在のUEFI2.xには対応してないようです。

まあ、しゃないので、とりあえず、EFI 1.10でやり始めるっす。で、ここで、そもそもどんなアプリを作るのかですが、実は、EFIShellを置き換えるGUI的な環境というか、そんなんを作ってみようかと漠然と思い描いてます。で、どんな感じで進めていこうかというとですね、「河合秀美」先生の著書「OS自作入門」という本があるのですが、これの手順を習って、進めてみようかと思ってます。この本ではディスクの読み書きや画面描画にBIOSコールを使っているのですが、その辺はEFI環境ならドライバがあるのでAPIを呼び出すことでできるんじゃなかろうかと目論んでいるとです。

そんなこんなで、まずはアプリのブートですが、これは実はとても簡単で、普通にアプリを書いて、できたバイナリをFATとかでフォーマットしたUSBメモリとかのルートディレクトリにEFI/BOOT/BOOTIA32.EFI(64bitCPUならBOOTX64.EFI)という名前で置いておけば、EFIブートをサポートしているPCでブートできるのです。ちなみにEFIShellのバイナリをこの場所にこの名前で置いておけばEFIShellがブートします。なのでアプリ作成時は普通にアプリを作って、エミュレータ環境で検証しておいて、実機で試すときはそれをリネームしてUSBメモリにコピーしてブートするだけです。

肝心の実機ですが、私の使用しているIntel製のマザーボードDQ45CBではEFIブートに対応していて、BIOSのセットアップ画面のブートメニューでUEFIをEnableにすると、EFIブートできるのです。最近のIntel製のマザーボードのいくつかでEFIブートをサポートしているのを確認してます。BIOSはAMIですが、AMIではわりとEFIに積極的なようで、AMI BIOSであれば、EFIブートできるものが他にもあるんじゃなかろうかと推測しています。

で、ブートはいいとして、次に、文字を出してみようと思って、ごにょごにょやりましたが、これは「Print」関数というprintfみたいなやつがあってそれを使うと簡単に文字でます。

次にグラフィックですよ。EFIには、簡単なグラフィック描画のAPIが用意されていて、これを使えば簡単な色つきの長方形やなんかは描画できるようです。しかしながら、これは思いのほかあれでして、ちょっと時間が掛かりました。まだ、完全に理解できていないのですが、どうやら、EFI1.10と2.xではグラフィックのAPI違うっす。で1.10のAPIで試行錯誤してみたんですが、どうもうまくいかんです。そもそもAPIを正常に呼び出せんのです。でいろいろやってたら、どうやら、エミュレータをEFI2.xでビルドしていたことが判明して、1.10でビルドしてみたところ、APIは呼び出せるものの、やっぱグラフィックが描画できん。で、rEFItのソースを見てたら、どうやら、グラフィックを出すにはグラフィックモードにしないといけないようです。で、ようやく出ました。グラフィック。





















はぁ、一安心です。さっそく頓挫するかと思ったですよ。

とりあえず、ソースがぐちゃぐちゃなので、もう少しお絵かきを楽しみつつ、グラフィックのAPIの理解を深めながら、関数を整備します。んで、次は、グラッフィクで文字出すのを目指してみます。

EFI Toolkitを使ってみる

(*この記事は以前、私が運営していたhttp://www.poppolab.comというサイトで公開していたものですが、ドメイン維持の都合により閉鎖しましたため、こちらに投稿し直します。内容は1年近く古いものですので、現在の事情とは食い違う可能性があります。)


これまで 、EDKについて書きじゃくってましたが、そろそろアプリ開発に着手したいと思います。が、EDKをベースに実際書き始めてみると、EDKはどうも、ファームウェアのモジュールや EFI Shell上で動作するコマンドを作成するには、強力ですが、スタンドアローンのアプリを作成するにはあまり具合がよくない感じがします。そう、私が作りたいのはEFIShell上で動作するコマンドではなく、 直接EFIブートで起動できるスタンドアローンなアプリなのです。で、実はEFIアプリの開発用にEFI Toolkitというのがありまして、これを使ったほうが効率がよさそうなので試してみます。

まずは例によってソースやドキュメントのリンクから

http://www.intel.com/technology/efi/toolkit_overview.htm
http://sourceforge.net/apps/mediawiki/tianocore/index.php?title=Efi-toolkit

いろいろ調べてみると、Intelからv1.10がリリースされていて、 現在はTianoCoreのオープンソースプロジェクトで、x64もビルドできるようになったv2.0が最新のようです。で、肝心の内容物は、ヘッダファイルやライブラリ、ドキュメント、サンプルアプリで、これをビルドするためのMakefileとバッチファイルからなるビルドシステムですな。動作環境はWindowsXP VC++6.0 or 7.0 or 7.1(VS .NET 2003) and/or Windows Server 2003 SP1 DDK といったところです。(v2.0) ちなみに、このEFI ToolkitのライブラリやヘッダはLinux(というかUnix系OS)に移植されているようです。gun-efiというやつで、debianやubuntuだと標準のリポジトリからapt-getでインストールできます。LinuxのEFIブートローダのeliloやMacOSXのマルチブートローダrEFItなどに利用されているようです。こちらもそのうち試してみたいですね。話がそれましたが、まずは付属ドキュメントを適当に斜め読みして、サンプルアプリをビルドしてみます。

まず、ダウンロードしたEFI_Toolkit_2.0.0.1.zipを解凍して、ドキュメントに従い「C:\Toolkit\EFI_Toolkit_2.0」に置きます。そして、Visual Studio 2005コマンドプロンプトを起動して、環境変数をセットして、Toolkitを置いたディレクトリへ移動します。

> set SDK_BUILD_ENV=nt32
> set SDK_INSTALL_DIR=C:\Toolkit\EFI_Toolkit_2.0
> cd C:\Toolkit\EFI_Toolkit_2.0


して、ビルドします。

> nmake

すると「C:\Toolkit\EFI_Toolkit_2.0\build\nt32\bin」にバイナリができっるって寸法なんですが、なんとビルドエラーです。そうなんです、私、VS .NET2003なんて高価なものは持ってないのでVC++ 2005 ExpressEditionでやってるんですが、これはVC8なのでコンパイルできないぽいです。やっぱ2003じゃないとだめかも。

で、困ったちゃんなんですが、ちょっと考えてみると、そもそもWinDDK2003にもたしかx86のコンパイラついてたよな。と思い出し、これも2003なのでVC7と同じコンパイラかもと思って、ためしにこれでコンパイルしてみました。やり方は、Windowsの「スタート」メニュー→「Development Kits」→「Windows DDK 3790.1830」→「Build Environments」→「Windows XP」→「Windows XP Free Build Environment」でコマンドプロンプトを開いて、前述の環境変数のセットからビルドまでを実行してみたところ、見事ビルドが通りました。

んーVS 2003 .NETなんていらんのとちゃうかな。と心の中でつぶやきつつ、一応、cl.exeのバージョンを確認しとこうと、ぐぐってみた。DDK 2003のcl.exeは13.10.4035に対して、VC7.0のcl.exeは13.10.3077で、VC7.1のcl.exeは13.10.6030ぽいです。んーちょうど、このふたつの中間くらいのバージョンですな。たぶん問題はないでしょう。まあ自己責任ということで、これでいきます。

ついでなので、X64版のビルドの仕方も書いときます。

set SDK_BUILD_ENV=em64t
set SDK_INSTALL_DIR=C:\Toolkit\EFI_Toolkit_2.0
set MSSdk = C:\WINDDK\3790.1830\bin\win64\x86\amd64
cd C:\Toolkit\EFI_Toolkit_2.0
nmake

で、サンプルアプリがビルドできました。今回はここまでにします。次はこのToolkitを使ってアプリを作ってみます。