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の理解を深めながら、関数を整備します。んで、次は、グラッフィクで文字出すのを目指してみます。

0 件のコメント:

コメントを投稿