9/26/2011

TX-50開発キットで遊ぶ その3

BLDKの開発環境はだいたい整いましたが、BLDK Development Applicationはエディタとしては貧弱すぎます。IDE好きな私は当然、Visual Studioで開発できないかと考えるわけです。で、やってみたらできそうなので、書いておきます。

ソースのトップディレクトリにBuild_TC.batがあって、これ実行すれば、ビルドできるっぽいです。つうことは、Visual Studioからこのバッチファイル叩けばいいだけですよ。

手順は以下。
  1. Visual Stdioのメニューから、「ファイル」 > 「新規作成」 > 「既存のコードからプロジェクトを作成」。
  2. 作成するプロジェクトの種類は「Visual C++」にして、「次へ」をクリック。
  3. プロジェクトファイルの場所は「C:\bldk」プロジェクト名は「bldk」(お好みで)「次へ」をクリック。
  4. プロジェクト設定の指定は「外部のビルドシステムを使用する」を選択し「次へ」をクリック。
  5. デバッグ構成の設定の指定で、ビルドコマンドラインは「Build_TC.bat /d32」、リビルドコマンドラインは「Build_TC.bat /clean && Build_TC.bat /d32」、クリーンコマンドラインは「Build_TC.bat /clean」、出力は空白のままで。
  6. リリースの構成の指定では、「デバッグの構成の設定と同じ」のチェックを外し、ビルドコマンドラインを「Build_TC.bat /r32」、リビルドコマンドラインは「Build_TC.bat /clean && Build_TC.bat /r32」、クリーンコマンドラインは「Build_TC.bat /clean」、出力は空白のまま。「完了」をクリック。
以上で、ビルドもデバッグ用もリリース用もVisual Studioから切り替えて、ビルドできたっす。ソースのナビゲートも楽チンです。(ただ、この方法で正しいバイナリができているかは今のところ未検証です。)



で、しばらくソースを眺めてみてみましたが、これはUDKにCrownBayのチップやボード(Intel純正のCrownBay評価ボード)依存のパッケージを追加したものですね。で、UDK(Intel UEFI Development Kit)はEDKIIベースとなってます。で、よく見ると、チップやボード依存のパッケージのほとんどはソースコードではなくバイナリモジュールになってますね。んー、さすがにそこは公開しないんですかね。まあ、変態的なことをしない限りチップの初期化系のコードは、弄る必要はあまりないかもしれませんが。

今回はここまでにします。というか、実は、TX-50開発キットで遊ぶ その1~3は実は先週やったことで、今週は基板側を弄ってたんですが、記事を書くのが疲れたので、またにします。
先週のことは先週記事にすべきですが、なんと、このブログの新規立ち上げのほうが後だったのです。

その4につづく

TX-50開発キットで遊ぶ その2

そんなわけで、BLDKをTX-50に移植して動かしてみたいわけです。まずは、開発環境を整えます。

BIOSに手を加えることができるようになれば、起動の高速化や、BIOSレベルであんなことや、こんなことができるわけです。あと、BLDKはEFIベースで、デバッガも用意されてるようですので、EFIのドライバやアプリを実機でデバッグする環境としても、役立ちそうです。


さししあたって、IntelのBLDKのサイトから開発キットやドキュメントをゲットします。

http://edc.intel.com/Software/Intel-Boot-Loader-Development-Kit/#download



主要なものとしては、

  • 「Intel® BLDK Development Application (Windows*) Version 2.0.1」 BIOSの設定やイメージのビルドとエディタを備える簡易IDE的なものですな。
  • 「Intel BLDK Core for Crown Bay (UEFI Standard Based)-Gold Release」 Crown Bay向けソース一式
  • 「Getting Started Guide: Intel® Boot Loader Development Kit (Intel® BLDK) Version 2.0—UEFI Standard Based」 事始め用ドキュメント
  • 「User Guide: Intel® Boot Loader Development Kit (Intel® BLDK) Version 2.0—UEFI Standard Based」 ちょっと詳しめドキュメント
という感じですね。


まずは、Getting Started Guideを読みながら、そのとおりにやってみます。とりあえず、必要なソフトウェアとして、以下のものが前もってインストールされている必要があるようです。

Visual Studio以外は無償で手に入りますが、Visual StudioはExpress Editionでもいけるかもしれないですね。現在、私の環境ではすでに、Visual Studio 2008 Professionalの評価版(3ヶ月使える!)がインストール済みですので今回はこれで行きます。(ちなみに、開発マシンのWindows7も評価版です。貧乏なのです。誰かいい仕事紹介してください。)それぞれ、ダウンロードしてインストールします。
で、WinDDKのインストール先は「c:\winddk\3790.1830」がいいそうです。これはデフォルトでここにインストールされます。iASLは「c:\ASL」がいいそうです。解凍したらここに置きます。

続いて、ソース一式を解凍します。現時点ではCB-EDKII-Gold-2.3.6.3.exeというやつで、自己解凍形式です。ドキュメントによると、なんだか8文字以下のディレクトリ名がお勧めで、例として、「c:\bldk.」にすれば的なことが書いてあるので、そうします。


したらば、BLDK Development Applicationをインストールします。通常のWindowsインストーラになっていて、特に迷うことはありませんでした。


これで、インストールするものは全てかな。デバッガ使うには、別途いろいろ必要そうですが、それはまた今度にします。


で、おもむろにBLDK Development Applicationを起動します。すると以下のようなやつが、でてきます。


んー。わくわく感いっぱいです。そして、まず、新規プロジェクトを作成すべし。Project > New Projectでウィザード的な画面になります。で、Getting Startedを参考にProject nameをとりあえず、「bldk」(好きな名前でよさげ)。Project file directoryを「C:\bldk」、Workspace directoryを「C:\bldk\CrownBayPlatformPkg」、Image configuration fileを「C:\bldk\CrownBayPlatformPkg\Fv\tc.bsf」としました。


して、Start Configurationをクリックで、次にSource Debugを有効にするか無効にするかの画面になるので、今回はDisableで。Create Projectをクリック。すると、いろんなパラメータを弄れる画面がでてきます。GPIOとかの設定もこのGUIで設定できるようです。




とりあえず、設定を練るのは後回しにして、まずはビルドしてみます。メニューのBuild > Buildでゴリゴリビルドが始まると思いきや、ここに罠がありました。エラーというか、ビルド始まらず。Getting Startedをよく読むと、Visual Studioの環境変数のパスを設定しとけ的な記述があるので、環境変数に「C:\Program Files\Microsoft Visual Studio 9.0\VC\bin」を追加。

Windowsをログインしなおして、再び、Buildしてみたところ、今度はうまくいきました。後から気づいたのですが、File > PreferencesのBuild Toolsのタブでビルドコマンドを指定できるので、nmakeをフルパス指定すれば環境変数の追加はいらなかったかもしれません(未確認)。

ビルドしたバイナリイメージは「C:\bldk\Build\CrownBayPlatform\RELEASE_VS2008\FV」のCROWNBAY.fdというやつのようです。(デバッグビルドだと「DEBUG_VS2008\FV」になる。)これを既存のBIOSと入れ替えて起動すれば、BLDKのBIOSで起動するはずです。が、問題はどうやってそれをやるかです。次は基板側を弄ります。


その3につづく。

9/25/2011

TX-50開発キットで遊ぶ その1

株式会社イノテックさんが運営するEM-clubというフォーラムでTX-50開発キットが抽選で当たるキャンペーンがあることを知り、応募してみたら当たったので、(イノテックさん有難うございます。)この基板で遊んでみる。

http://www.em-club.jp/


この基板の特徴はIntel ATOMの組み込み向けE6xx系を採用している点と、手のひらサイズの超小型サイズである点、電解コンデンサやFANなどの寿命部品を一切使用していない点でしょうかね。なかなかすごいです。




とりあえず、電源を入れて感触をみる。
  • デフォルトではACアダプタつなぐと即座に電源ONする仕様ぽい。ディップスイッチで切り替えられるようだ。
  • SDカードスロットがオンボードで備わっており、SDカードからブートできる。
  • SDカードやSATA等、ブートするものがないと内臓EFIShellが起動する。
  • BIOS Setupに入るには「F2」キー
  • BIOSはInsyde H2Oベース
  • 思いのほか起動に時間が掛かる。7~8秒ほど。

といった感じ。で、EM-clubのサイトにTX-50向けMeeGoのOSイメージが公開されているので、試しに起動させてみた。Getting Startedを参考にやってみたけど、これGUI起動しないのかな?ポーティングが完全では無いのか、なんかコマンド打つなり、設定ファイル弄らないとダメなのかな?Getting Startedにもコンソールからルートでログインする所までしか説明ないし。でも、まあ、いっか。今のところ、この基板でMeeGo開発することに、あまり意義を感じないので、深く追求しない。

で、この基板で何して遊ぼうかテーマをずっと考えていたんですが、普通にx86なので、通常のPCでできることをやってもあまり意味がないし、小さくてFANレスなことは実用的なのだが、x86向けのOSやソフトウェアは殆ど難なく動いてしまうだろうから、あんまり開発の余地ないんじゃなかろうか。まあ、そこがATOMのメリットでもあるわけですが。システム全体としてのアプリケーションとしては小型サーバーなども考えられるけど、ソフトインストールして、セッティングして、筐体でっち上げれば完成してしまうしなあ。その手のことは昔、玄箱でさんざんやったし、開発というより活用だし、この基板じゃなくてもできるし。

という感じで、しばらく放置していたんですが、ある日Intelのサイトを眺めていたら、Intel BLDKなるものを発見。よくよく概要をみてみると、要するに組み込みATOM向けBIOS開発キット的なものっぽいっす。で、キットは特にユーザー登録も無く、無償でダウンロード可能にされてて、運命的に、Crown Bay(E6xx + EG20T)をサポートしてるですよ。ああもうこれ、やるしかないよ。そんなわけで、TX-50にIntel BLDKのポーティングを試みることにします。とりあえず、週一くらいでこのテーマに時間を割く予定です。

↓Intel BLDK


しかし、限定的とはいえ、とうとうホビーユーザーがBIOSをビルドできる時代が来てしまいました。これまで、メーカーが大金払って、BIOSベンダーと契約しないとできなかったことが、個人レベルでできてしまうというのは、すばらしいことです。ここからは私の推測ですが、Intel的には現在の組み込み市場で主流のARM勢にATOMで対抗するにはBIOS開発という敷居の高さを下げる必要があったんじゃないかなーと想像します。あわよくば、組み込み系だけでなく、デスクトップ系やモバイル系プラットフォームにもこの潮流を水平展開してほしいものです。

その2に続く。



9/20/2011

新規ブログ立ち上げ

早速ですが、前に運営していたwww.poppolab.comの記事をこちらに再掲載しました。全部手作業だったので、ちょっと疲れたっす。
このブログを新しく立ち上げたきっかけは、以前のサイトのドメイン維持のための費用や手間を削減するためもありますが、もう少し砕けた感じでコンピュータ関係だけの記事にせず、私の日ごろの音楽や、思想についても記録として残し、より多くの方にアクセスして頂き、私というアイデンティティをWeb上に保存しておこうと思ったからです。独自ドメインは更新費を払わないと契約が切れて、アクセス不能になってしまいますが、こちらのブログサイトであれば、私が事故や病気で死んでしまったとしても、当分はアクセス可能な状態が維持されるはず。(長期間ログインしなければ削除されてしまうかもしれませんが。)
というわけで、Bloggerを利用しようと思った次第です。
コンピュータ関係の試行錯誤については、ある程度成果が出たら、まじめなまとめサイトを作ろうかなと思ってます。

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を使ってアプリを作ってみます。

EDKIIをLinuxでビルドする その5

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


んじゃ、EDKIIでEFIShellをソースからビルドします。で、EDKIIのネイティブなEFIShellというのはまだ無いようです。いろいろ調べてみると、2通りのやり方があって、1つはgcc-shellというプロジェクトがあって、これはEDKI向けのEFIShellを修正してgccや、unix系のシステムでビルドできるように修正したもののようです。これをまずは試してみましたが、結論から言ってしまうと、ビルドは通るものの、うまく動作しませんでした。原因は分かりませんが、原因追求するガッツが無いので、ちょっとあきらめぎみです。このプロジェクト自体、EDKIIのネイティブなシェルができるまでの一時しのぎ的なもののようです。一応やり方だけ書いときます。

Getting Startedへのリンク

http://sourceforge.net/apps/mediawiki/tianocore/index.php?title=Gcc-shell

これを参考にやってみました。


まず、EDKIIのソースディレクトリに移動して、svnでgcc-shellのソースを取得します。

$ cd edk2
$ svn co https://gcc-shell.svn.sourceforge.net/svnroot/gcc-shell/trunk/GccShellPkg GccShellPkg
$ make -C BaseTools/Source/C

で、おもむろにビルドします。

$ export EDK_TOOLS_PATH=$HOME/src/edk2/BaseTools
$ . edksetup.sh BaseTools
$ build -p GccShellPkg/GccShellPkg.dsc -a IA32 -t ELFGCC


すると、「~/src/edk2/Build/GccShellPkg/DEBUG_ELFGCC_IA32」にバイナリができるのです。で、これをEDKIIに元々入っているEFIShellのバイナリと入れ替えてみたんですが、どうも強制終了してしまいます。んーなんらかのバグなのか、ビルド環境が悪いのか分かりませんが、ソースのレビジョンが上がったらまた試してみるとして、これを使うのはしばらく諦めます。

そして、冒頭でお話した2つめのやり方をやってみます。これはEDKI向けのEFIShellのソースにパッチをあてて、EDKIIのビルドシステムに適合させるというやつです。「~/src/edk2/EdkShellPkg」の中に ReadMe.txtとパッチが置いてあるので、ReadMeを参考にやってみました。まぁ、結論から言ってしまうと、これもビルドは通るものの動作しなかったのですが… このReadMeの内容から察するに、もともと入ってるバイナリはWindows環境でビルドしたものっぽい感じがします。そしてこのパッチの内容もgcc-shellとEFIShellの差分から作成したものっぽいです。一応やり方を書いときます。

まず、EFIShellのソースをsvnで取得します。ReadMeによるとrevision33を指定してますので、これを取得します。

$ cd edk2
$ svn co -r 33 https://efi-shell.svn.sourceforge.net/svnroot/efi-shell/trunk/Shell

で、パッチをあてます。

$ cd Shell
$ patch -p1 < ../EdkShellPkg/ShellR33.patch


そしてビルドします。

$ cd ..
$ EDK_TOOLS_PATH=$HOME/src/edk2/BaseTools
$ . edksetup.sh BaseTools
$ build -a IA32 -p EdkShellPkg/EdkShellPkg.dsc

すると、「~/src/edk2/Build/EdkShellPkg/DEBUG_ELFGCC/IA32」にバイナリができます。これを例によって既存のバイナリと入れ替えてみたところ、やっぱり強制終了しちゃいます。んーEDKIIのShellは現時点では微妙なところですな。

これまでEDKIIを検証してみて、分かったことは、まだまだ開発途上で全体的に不安定な印象を受けました。手を出すにはまだ時期尚早だったのかもしれません。

そして、私の真の目的は実はEFIアプリを作ることだったことを思いだしました。EDKII自体を開発したいわけじゃないのです。なので、EDKIIの検証はここまでにします。できればEDKII&Linux環境で開発したかったけど、EDKI&Windowsでアプリ開発をおっぱじめようと思います。EDKIIもたまにチェックして、UnixPkgがメジャーリリースされるところまで開発が進んだらまた改めて試してみたいと思います。

EDKIIをLinuxでビルドする その4

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

そして、EclipseでEDKIIをビルド、デバッグしてみます。

最初に実行する「edksetup.sh」がビルドのための環境変数やなんかを設定してくれているみたいですねえ。これで設定される環境変数やなんかをEclipse側で設定してしまえばできるぽいのですが、あんまりスマートじゃないし、もうちょっとビルドシステムをよく理解しないと、正当性が判断できかねるので、EDKIとVC IDEの時のようにビルドスクリプトを作って間接的にビルドシステムを呼び出すのが無難な感じがしますね。

まあそれは今後の課題として、実は UnixPkgだけに関しては専用のビルドスクリプトが用意されていて、edksetup.shを実行しなくてもビルドできるのです。なのでそれをEclipseから呼び出すことで比較的スマートにできそうです。ただ、この場合 Conf/target.txtの設定は無視され問答無用にUnixPkgがされるので、別のパッケージをビルドしたい場合には対応できません。とはいえ、まずはエミュレータ環境をソースレベルデバッグできれば、ほぼ事足りるので、しばらくはこれでいってみよー。

で、いろいろ試していて、svnで最新のソースを取得しなおしたら、なんと エミュレータ環境が動かんではないですか。なんということでしょう。で、過去のソースを取得しなおしました。この記事を読んで、試される方は要注意です。エミュレータの動作が確認できたのは、rev10763というやつです。svnでリビジョンを指定してソースを取得するには、


$ svn co -r 10763 https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2 --username guest

ついでに、日付で取得するには


$ svn co -r {20100802} https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2 --username guest

です。今日取得したのが、rev10773だったので、ここ2、3日の間に結構修正が行われているようですね。うーんまだ、あんまり安定していないようです。

よし。気を取り直して、Eclipseの設定を行います。まず、おもむろにEclipseを立ち上げ、てきとうにワークスペースを指定します。そして、「ファイル」メニューから「新規」→「Makefile Project with Existing Code」をクリックします。すると以下のような画面が出てくるので、プロジェクト名には適当な名前をつけます。ここではとりあえず、 「EDKII_UnixPkg」にしました。で、Existing Code Locationは「/home/username/src/edk2」にします。usernameはユーザー名です。言語のチェックボックスはデフォルトのままツールチェインは「<なし>」でいいと思います。



























これで、ソースが「プロジェクトエクスプローラ」に出てくるのはずです。そしてビルドの設定を行うのですが、その前に、「プロジェクト」メニューの「自動適にビルド」のチェックを外して置きます。これが有効になってると、ことあるごとに自動的にビルドが開始されて、ちょっとうざっぽいのです。

次に、「プロジェクトエクスプローラ」で「edk2」を選択して右クリックして「プロパティ」をクリックします。するとプロパティ画面になるので、右のメニューから、「C/C++ビルド」を選んで、ビルダー設定を変更します。まず、「デフォルトビルドコマンドを使用」のチェックを外してビルドコマンドを変更します。内容は「${workspace_loc:/edk2}/UnixPkg/build.sh」です。で、「ビルドロケーション」の「ビルドディレクトリー」も変更します。内容は「${workspace_loc:/edk2}/UnixPkg/」です。
















次に同じ画面の「振る舞い」というタブを選択して、「ビルド(インクリメンタルビルド)」を変更します。現在「all」になっていると思いますが、これを削除して空にします。さらに、「クリーン」の項目も変更します。内容は「cleanall」です。
















これでビルド出来るはずですが、ついでにデバッグ時の設定もやってしまいましょう。プロパティ画面の右の項目から「実行/デバッグ設定」を選択します。何も設定が無い状態だと思いますので、左のほうの「新規」ボタンをクリックして新しい設定を作成します。構成タイプの選択になりますが、「C/C++Application」を選択して「OK」をクリックします。すると、起動構成プロパティの編集画面が出てきます。まずは、「メイン」の画面の「C/C++アプリケーション」を入力します。内容は「Build/Unix/DEBUG_ELFGCC/IA32/SecMain」です。



























次に同じ画面の「(x)= 引数」というタブをクリックします。そんで、下のほうの「作業ディレクトリー」を変更するのですが、このままでは編集出来ないようになっているので、下の「デフォルトの使用」のチェックを外します。するとそして編集します。内容は「${workspace_loc:edk2}/Build/Unix/DEBUG_ELFGCC/IA32」です。




























設定は以上です。「OK」をクリックしてウィンドウを閉じます。すると「edk2のプロパティー」の画面に戻りますので、これも「OK」をクリックして閉じます。それでは、ビルドしてみましょう。Eclipseのハンマーの形をしたアイコンをクリックするか、「プロジェクト」メニューの「すべてビルド」をクリックします。すると、ビルドが始まるはずです。そして、「プロジェクト」メニューの「クリーン」でクリーンできるはずです。デフォルトではクリーン後に再ビルドが自動的に行われるので、確認するにはクリーンの画面で、「ビルドを即座に開始」のチェックを外しておくといいと思います。



























よし。ビルドが確認できたところで、ソースレベルデバッグを試してみます。Eclipseの虫くんのアイコンをクリックするか、「実行」メニューの「デバッグ」をクリックしてデバッグを開始します。すると、再度、自動的にビルドが行われた後、「パースペクティブ切り替えの確認」という画面が出ますが、これはデバッグ専用画面に切り替えるけどいいかい?ちゅうことなので、「はい」をクリックして切り替えます。すると、SecMainのmain関数のところで自動的にブレイクしてデバッグ準備OKな状態になります。もう気づいてると思いますが、SevMainというプログラムがエミュレータの本体なのです。ステップインやステップオーバーアイコンをクリックしてステップ実行できるのです。おお、すばらしい。ブレイクポイントはソースの横っちょで右クリックして設定できます。



















よし。なかなか快適になってきました。ただ、例のごとく、ソースツリーにEFIShellのソースが含まれていないようなので、Shellが起動したあとはソースレベルデバッグできませんな。んー。次の課題はShellのソースを追加することを目指してみます。今回はここまでにします。

EDKIIをLinuxでビルドする その3

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


よし。じゃあ Eclipseだな。ああもうそれしかないよ。

というわけで EDKIIの開発環境にEclipseを使ってみる試みです。これはEFIのドキュメントを探してもそういった話題は今のところ見つかってなくて、完全に手探りですが、まあやってみます。

さしあたってeclipse本体をダウンロードします。Ubuntuのパッケージをインストールしてもいいんですが、ちょっぴりバージョンが古いしどうせローカライズされてないので本家からもらってきます。

http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/helios/R/eclipse-cpp-helios-linux-gtk.tar.gz


Eclipse IDE for C/C++ DevelopersのLinux 32-bitというやつをダウンロードします。で、ホームとか適当なところに解凍しておきます。基本的にはインストール作業はこれだけで、中のeclipseというバイナリを実行すればEclipseが立ち上がるようになってます。

が、しかし動作させるにはJREというJAVAのランタイムがシステムに前もってインストールされてないとだめなんです。そして困ったことにこのJREにはいくつか種類があって、Eclipseを動作させるにはSun MicrosystemsのJREが良いというもっぱらの噂なのです。よって、例のごとくaptでインストールします。と思いきや、標準のリポジトリにはsunのjreが登録されていないようですね。ここはおとなしくUbuntuソフトウェアセンターさんのお力を借ります。編集メニューの中のソフトウェアソースを選択し、他のソフトウェアのチェックを全部つけるとCanonicalのパートナーなるものが登場するのでそのなかからSun JRE6を探してインストールします。

これでEclipseが起動できます。しかし、私は日本人なので日本語化できるものならしたいという欲求が当然、魂のやさしい場所から沸いてくるのです。そしてそれはpleiadesというプラグインを導入するととても簡単に出来てしまうので、誘惑に負けて日本語化してしまいます。

まず以下のリンクからpleiadesをダウンロードします。

http://mergedoc.sourceforge.jp/

Pleiades 本体ダウンロードのところの安定版1.3.1というのをダウンロードします。そして解凍します。中にreadme_pleiades.txtというのがあるのでそれを読めばインストール方法が書いてあるのですが、一応ここにも書いときます。

まず、解凍して出てきたpluginsディレクトリの中身をEclipseのpluginディレクトリにぶっこみます。

次に同じく、featuresディレクトリの中身をEclipseのfeaturesディレクトリにぶっこみます。

しかるのち、Eclipseのディレクトリ内にあるeclipse.iniというファイルをテキストエディタとかで開いて、最後の行に

-javaagent:plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar

という記述を追加します。そしてスプラッシュのロゴをかっこよくpleiades仕様にしたい人は「-showsplash org.eclipse.platform」という2行を削除してしまいましょう。

と、これで日本語化完了です。

さあ、ここからが本題です。なのですが、文章が長くなってきたので、今回はここまでにします。なんだかeclipseインストール解説みたいになっちゃった。

EDKIIをLinuxでビルドする その2

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


その1でLinux上でエミュレータを起動するところまでは成功したのですが、実はOVMFなるものがありまして、これはedk2のプロジェクトの一つのようです。で、なんとqemu用のBIOS ROMを置き換えてEFIをqemuで動かそうという代物らしいです。

How toへのリンクを見つけたので貼っておきます。

http://sourceforge.net/apps/mediawiki/tianocore/index.php?title=How_to_build_OVMF

http://sourceforge.net/apps/mediawiki/tianocore/index.php?title=How_to_run_OVMF


これはかなり期待大です。エミュレータではPCIデバイスや物理メモリにアクセスするようなアプリが思うように動作しないのに対して、qemuであればハードウェアごとエミュレートしてるわけですから、かなり実機に近い動作が期待できます。加えて、qemuにはgdbと接続する機能がありますから実機にICEを繋いでデバッグするのに近い環境ができちゃうのかも。そんで、Eclipseのgdbのソースレベルデバッグと連携すれば、もう完璧です。夢は膨らむばかりです。

そんなわけで早速試してみます。

ビルド手順はその1に書いたのと変わりませんので重複する部分は割愛しまして、target.txtの「ACTIVE_PLATFORM」を以下のように書き換えます。

ACTIVE_PLATFORM = OvmfPkg/OvmfPkgIa32.dsc


で、ビルド


$ build


よし。次にOVMFを動作させる用のディレクトリをホームにつくります。


$ mkdir ~/run-ovmf
$ cd ~/run-ovmf


で、ビルドして出来たROMをここにコピーします。


$ cp ~/src/edk2/Build/OvmfIa32/DEBUG_GCC44/FV/OVMF.fd bios.bin
$ cp ~/src/edk2/Build/OvmfIa32/DEBUG_GCC44/FV/CirrusLogic5446.rom vgabios-cirrus.bin


ハードディスクにみせるためのディレクトリを作ります。


$ mkdir hda-contents

そしてqemuを実行します。ああ、qemuまだインストールしてませんでした。以下のコマンドでインストールします。

$ sudo apt-get install qemu

よし。じゃあ実行します。

$ qemu -L . -hda fat:hda-contents

おお、起動しました。






















pciコマンドもこのとおりー






















なかなかよろしいです。

EDKIIをLinuxでビルドする その1

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


EDKのビルドについて、ゴリゴリ書いてましたが、実はEDKIIなるものがありまして、こちらはまだ良く理解できてないのですが、どうやらEDKIではWindows+VS2003 or VS2005というビルド環境しかサポートしていなかったのが、EDKIIではWindowsの他にLinuxやMacOSXなどのOSもサポートしていて、コンパイラもVisual Studio以外にもgccやインテルCコンパイラもサポートしておるようです。

WindowsよりLinuxの方が好きな私としては大いにそそられるやつなわけです。そんなわけで良く分からんなりにもとりあえず、ビルドしてみました。その一部始終を自分へのメモという意味も含めて書いておこう。おおそうしよう。

まずはリンクから

http://sourceforge.net/apps/mediawiki/tianocore/index.php?title=EDK2

http://sourceforge.net/projects/edk2/files/

http://sourceforge.net/apps/mediawiki/tianocore/index.php?title=Getting_Started_with_EDK_II


んで、EDKIIのパッケージはなんだか複雑なことになっていてEDKIのようにzip一個というわけでは無いぽいです。モジュールごとに細かいことになっていてどれがなんなのか良く分かりません。しかもSorceforgeにリリースされているソースは中心的なパッケージのみでこれが全てというわけではなさそうです。3つめのリンクにGetting Startedがあるのでこれを参考にやってみました。それによるとソースはsubversionで取得せよちゅうことのようです。

よし取得するべし。そうそう、ビルド環境はUbuntu 10.04でやります。

ターミナルを立ち上げ、まずコンパイラやら、subversionをaptでインストールします、

$ sudo apt-get install build-essential subversion uuid-dev iasl


次にソースをダウンロードするためのディレクトリをホームに作ります。そしてそのディレクトリに移動します。

$ mkdir ~/src
$ cd ~/src


で、svnコマンドでソース一式をダウンロードします。


$ svn co https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2 --username guest


取得が終わったら、ビルドの準備をします。以下のコマンドを実行します。


$ make -C edk2/BaseTools
$ cd ~/src/edk2
$ export EDK_TOOLS_PATH=$HOME/src/edk2/BaseTools
$ . edksetup.sh BaseTools

そして~/src/edk2/Confにあるtarget.txtというファイルを編集してビルドターゲットを指定する。とりあえず、Getting Startedに書いてある通りにしてみる。


ACTIVE_PLATFORM = Nt32Pkg/Nt32Pkg.dsc
TOOL_CHAIN_TAG = MYTOOLS

と書いてある行を見つけてそれぞれ以下のように変更する


ACTIVE_PLATFORM = MdeModulePkg/MdeModulePkg.dsc

TOOL_CHAIN_TAG = GCC44


次にビルドする。

$ build


ビルドされたバイナリは「Build/MdeModule/DEBUG_GCC44/IA32/」に出来てます。

んー。思いのほか簡単ですな。ただ、このビルドターゲットだとエミュレータが含まれてないようです。エミュレータ起動しないと今ひとつ感動にかけるし、gdbでデバッグしたいしなので、ごにょごにょ調べてみるとUnixPkgというのをビルドターゲットにすればよさそうです。これを試します。先ほどのtarget.txtのACTIVE_PLATFORMを以下のように書き換えます。

ACTIVE_PLATFORM = UnixPkg/UnixPkg.dsc

これでビルドしてみます。


$ build

するとエラーがでてビルドが通りません。ログをよく見ていくとどうやらX11関係のヘッダファイルが無いよということのようです。なのでUbuntuのパッケージでそれが含まれてそうなパッケージを見つけてインストールします。

$ sudo apt-get install libx11-dev libxext-dev


そしてビルドです。

$ build


こんどは成功しました。で、エミュレータを起動するには以下のようにします。


$ build run

で例のエミュレータが起動します。EDKIとちがってロゴが入ってますねぇ。なかなかいい感じです。











































よし。

9/19/2011

EDKをビルドする その5

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

よし。では、いよいよVC のIDEを使っていこうと思います。コマンドプロンプトとテキストエディタだけでもまあなんとかやっていけると思いますがIDEを使うとソースのエディットやナビゲート、ビルドが一貫して行えるばかりでなく、なんと、エミュレータ環境上で動作しているプログラムをソースレベルデバッグすることができるため、開発効率がとてもよいのです。

というわけでまず、おもむろに「Visual C++ 2005 Express Edition」を立ち上げます。そして「ファイル」メニューの「新規作成」→「既存のコードからプロジェクトを作成」を選択します。



















すると次のような画面が飛び出しますがプロジェクトの種類は「Visual C++」のまま次へをクリックします。
























んで、次の画面に移ります。以下のような画面になりますので、プロジェクトファイルの場所は「C:\TianoCore」と入力し、プロジェクト名はなんでもいいのですがここでは「TianoCore」としておきます。チェックなどはそのままで次へをクリックします。
























すると以下の画面になるので「外部のビルドシステムを使用する」のほうを選択して次へをクリックします。
























次はコマンドラインの入力画面になります。以下のように入力します。んで次へをクリック。
ビルドコマンドライン 「c:\TianoCore\build.cmd c:\TianoCore\Edk NT32」
リビルドコマンドライン 「c:\TianoCore\build.cmd c:\TianoCore\Edk NT32」
クリーンコマンドライン 「c:\TianoCore\build.cmd c:\TianoCore\Edk NT32 clean」
出力(デバッグ用) 「c:\TianoCore\Edk\Sample\Platform\Nt32\Build\Ia32\SecMain.exe」

























次の画面はリリースの構成の設定になりますが、「デバッグ構成の設定と同じ」にあらかじめチェックがついていると思いますので、これはこのままでよいです。そして完了をクリックします。
























ファイルの追加処理が始まるのでしばらく待つと完了します。完了すると、「ソリューションエクスプローラ」にソースツリーが追加されているはずです。これでソースのナビゲートや編集はIDE上でできますが、まだビルドとデバッグの設定が不完全ですので、もうちょっとがんばります。

デバッグの設定からいきます。ソリューションエクスプローラに「TianoCore」(プロジェクト名)というやつがいるはずです。この上で右クリックしてプロパティを開きます。


























するとプロパティページが出てくるのでこの中の「構成プロパティ」の「デバッグ」を選択して「作業ディレクトリ」に「C:\TianoCore\Edk\Sample\Platform\Nt32\Build\IA32」と入力します。そして適用してOKクリックして閉じます。















デバッグの設定はこれでよいです。

次にビルドの設定です。Platform SDKのパスを追加します。

「ツール」メニューの「オプション」を選択します。






















するとオプション画面が開きますので左のツリーから「プロジェクトおよびソリューション」の中の「VC++ディレクトリ」を選択します。そして、左上の「ディレクトリを表示するプロジェクト」のドロップダウンから「インクルードファイル」を選択してその下のフォルダの形をしたアイコンをクリックして新規項目を追加します。内容は「C:\Program Files\Microsoft Platform SDK\include」です。














次に、同じ画面で左上のドロップダウンから「ライブラリファイル」を選択し新規項目を追加します。内容は「C:\Program Files\Microsoft Platform SDK\lib」です。














設定は以上ですと言いたいところですが、実は一つファイルを追加する必要がありまして、コマンドラインの設定時に「c:\TianoCore\build.cmd」と入力しましたが、そんなコマンドはこの時点ではありません。なので作ります。これはバッチファイルで内容は以下です。これは「Edk Getting Started Guide」に載ってるやつそのままです。この内容をコピーしてテキストエディタに貼り付け、「Build.cmd」という名前で保存して、「c:\TianoCore\build.cmd」に置きます。

Bulid.cmd Source

REM @echo off
REM **************************************************************************
REM
REM File: Build.cmd
REM
REM Usage: Build.cmd [EDK directory] [Platform name]
REM
REM Abstract:
REM This batch file is used to initiate an EDK build from within Visual
REM Studio. To use it, create a Visual Studio makefile project, and
REM for the project build commands invoke this batch file with the
REM first argument being the path to the EDK source tree, and the
REM second argument the platform to build (typically "NT32").
REM
REM **************************************************************************
REM Only used for error messages from this file
SET THIS_FILE=c:\TianoCore\build.cmd
if .%2. == .. goto Usage
set EDK_SOURCE=%1
REM Call the batch file that the Visual Studio install created to set environmental
REM variables if required.
REM call "C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Tools\vsvars32.bat"
if %2 == NT32 goto Build_NT32
REM This error occurs when your Visual Studio project's build command is incorrect.
REM In Visual Studio, right-click the project folder (typically NT32) in the Solution
REM Explorer pane and then select [Properties], then [Configuration Properties],
REM then [NMake] to check your commands. The first argument to this command file
REM is the EDK directory, and the second is the platform to build (case sensitive).
REM
echo.
echo %THIS_FILE%(36) : error 0000 : %2 : platform not supported by this batch file
echo.
goto Usage
:Build_NT32
REM This changes to the right driver letter
%EDK_SOURCE:~0,2%
cd %EDK_SOURCE%\Sample\Platform\Nt32\build
nmake %3 %4 %5 %6
goto Done
:Usage
echo.
echo Usage: Build [EDK directory] [NT32 more...]
echo.
goto Done
:Done
REM *** END Build.cmd ***


これでようやくビルドができるはずです。「ビルド」メニューから「TianoCoreのビルド」を選択するとビルドが始まるはずです。以前のバイナリが残ってる場合は先に「TianoCoreのクリーン」を先にやって一からビルドし直してみます。

さらに、「デバッグ」メニューから「デバッグ開始」を実行するとエミュレータが起動するはずです。よし、このままソースレベルデバッグをやってしまいます。まずは例としてEfiShellのmodeコマンドをデバッグしてみます。ソリューションエクスプローラからTianoCore\Edk\Other\Maintained\Application\Shell\modeとたどっていってmode.cを開きます。で、このコマンドの実行開始ポイントは93行目なのでここでブレイクしたいとすると、エディタ画面の端っこをクリックすると赤い丸がつきます。これがブレイクポイントになります。しかるのち、エミュレータのEFIShellでmodeコマンドを実行すると、見事ブレイクポイントで停止するはずです。

したらば、ツールバーのアイコンやメニューやショートカットキーを使ってステップ実行ができます。一行ずつ処理を追いたい場合はステップインやステップオーバーを使います。ステップオーバーのショートカットキーはF10キーなのでF10キーを連打すると一行ずつ処理が進んでいきそのつど変数の内容やメモリやらレジスタやらが確認できます。んでF5キーでブレイクを解除して通常処理にもどります。


















以上です。今度はEFIShellの自作コマンドでも作ってみよかな。

EDKをビルドする その4

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

VC++ のIDEを使ったビルド、デバッグ方法を書くに先立って、EFIShellをソースからビルドするやり方を先に書くことにします。あとからEFIShellのコマンドをデバッグの例にするためなのです。

エミュレータ環境を立ち上げるとEFIShellが起動しますが、これ、実はEDKのなかにすでにビルド済みのバイナリが入っていてそれが起動しているのです。なので今回はEFIShellのソースをEDKに追加してEDKと一緒にビルドしてしまうというのをやります。

まずは以下のサイトからEFIShellのソースをダウンロードします。

http://sourceforge.net/projects/efi-shell/files/


「Releases」の中の「Offical Releases」の中で最新のものをダウンロードします。2010年8月4日時点では「EfiShell 1.06.zip」が最新だったのでこれを使用します。あとドキュメント類もついでにダウンロードしておくといいかもしれません。

EfiShell 1.06.zipを解凍するとShellというフォルダが出てくるのでこれを「C:\TianoCore\Edk\Other\Maintained\Application\Shell」に置きます。でこれをEDKのビルドシステムでビルドするには、「C:\TianoCore\Edk\Sample\Platform\Nt32\Build\Nt32.dsc」を編集します。(X64プラットフォームでビルドしたい場合は「C:\TianoCore\Edk\Sample\Platform\X64\Build\X64.dsc」)つまり、この「.dsc」ファイルが何をビルドするかを制御しているファイルになります。このファイルをテキストエディタで開いて、「Other\Maintained\Application\UefiShell\Bin\Shell.inf」という記述を探します。EDK1.06では337行目ですね。これが例のビルド済みEFIShellなのでこれをコメントアウトして以下のような記述を追加します。

#Other\Maintained\Application\Shell\Bin\Shell.inf
Other\Maintained\Application\Shell\Shell.inf

でここで一つ選択肢がありまして、EFIShellのソースには「ShellFull.inf」というのも用意されていて、ファイル名の通り、こちらを選ぶとコマンド全部入り版がビルドされるのです。なのでこちらを使いたい場合は以下のようにします。

#Other\Maintained\Application\Shell\Bin\Shell.inf
Other\Maintained\Application\Shell\ShellFull.inf

これで準備完了です。ビルドしてみます。

> set INCLUDE=%INCLUDE%;C:\Program Files\Microsoft Platform SDK\include
> set LIB=%LIB%;C:\Program Files\Microsoft Platform SDK\lib
> set EDK_SOURCE=C:\TianoCore\Edk
> cd %EDK_SOURCE%\Sample\Platform\Nt32\Build
> nmake

でビルドします。この一連のコマンドを毎回タイプするのもあれなんで、バッチファイルとかにしておくと便利かと思います。

> nmake run

でエミュレータを起動すれば新しくビルドしたEFIShellが起動するはずですが、まあ見た目はかわらないのでよくわからないかもしれません。

とりあえずきりがいいのでその4はここまでにします。

EDKをビルドする その3


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

さて、いよいよビルドしようかと思います。


まず、あらかじめダウンロードしておいたEdk 1.06.zipをおもむろに解凍します。するとEdkというフォルダが出てくるはずです。続いてCドライブ直下に「TianoCore」という名前のフォルダを作ってその中に先ほどのEdkフォルダを移動します。つまり「C:\TianoCore\Edk」という形ですね。必ずしもここに置かなければならないということはないのですが、「Edk Getting Started Guide」にはこのパスを前提にして説明が書かれているため、それに従います。


次に、「C:\TianoCore\Edk\Sample\Platform\Nt32\Build\Config.env」ファイルをテキストエディタで開いて編集します。この中の「USE_VC8 = NO」という記述を「USE_VC8 = YES」に書き換えます。これはデフォルトではVC7(VS2003)を想定しているためで、VC8(VS2005)のコンパイラを使うためにYESにするわけです。

さしあたって、コマンドプロンプトでのビルド方法を紹介しようと思います。Windowsのスタートメニューから「すべてのプログラム」→「Visual C++ 2005 Express Edition」→「Visual Studio Tools」と辿って「Visual Studio 2005 コマンド プロンプト」を起動します。そしてSDKのインクルードファイルやライブラリを使用するため、以下のコマンドを実行します。


> set INCLUDE=%INCLUDE%;C:\Program Files\Microsoft Platform SDK\include

> set LIB=%LIB%;C:\Program Files\Microsoft Platform SDK\lib


次に、EDK_SOURCEという環境変数をセットするため以下を実行します。


> set EDK_SOURCE=C:\TianoCore\Edk


したらば、ビルドしたいプラットフォームのビルドディレクトリに移動します。とりあえず、IA32をビルドするには以下のようにします。


> cd C:\TianoCore\Edk\Sample\Platform\Nt32\Build


で、いよいよビルドです。以下のコマンドを実行します。


> nmake


とすると恐らく、ビルドエラーになります。本来はこれでビルドできるのですが、なぜかというとですね、エラーメッセージをよく読むと分かるのですが、「C:\TianoCore\Edk\Foundation\Library\Dxe\UefiEfiIfrSupportLib\UefiIfrLibrary.h」に変な文字コードが含まれているためなのです。なので、これを編集しちゃいます。edk1.06ではこのファイルの1088行目に問題の文字列がありまして、「 in UEFI specification AppendixM.」という行の文字化けしている箇所ですね。これを削除するなりしてしまいます。他にも対応策があるかと思いますが、後のバージョンで修正されることを祈りつつ削除しちゃいます。「 in UEFI specification Appendix.」という形にして保存してしまいます。そして実は、同じフォルダ内の「UefiIfrString.c」にも同じ問題があります。340行目ですね。これも同じように文字化け部分を削除しちゃいます。気を取り直してビルドします。


> nmake


今度はビルドが完了したはずです。バイナリは「C:\TianoCore\Edk\Sample\Platform\Nt32\Build\IA32」ディレクトリに出来ています。EFIのモジュールやアプリケーション、ドライバは拡張子「.efi」になります。ところで、IA32プラットフォームではエミュレーション環境が利用できるようになっています。これを動作させるには現在のディレクトリで以下のコマンドを実行します。


> nmake run


すると以下のような画面になりEFIShellが起動するはずです。






ブート中にファンクションキーとかDelキーを押すと以下のようなセットアップ画面に入ることができます。




さらに、「nmake run」をやる前に以下のコマンドを実行するとウィンドウが2つでてきてEfiのファイルシステムが「fsnt0」に、EFIShellのコマンドディレクトリが「fsnt1」にマップされた状態で起動してくるので独自のアプリをビルドしてテストするのに便利かもしれません。


> System.cmd


> nmake run


このSystem.cmdはバッチファイルなので、自分好みにカスタムするのもいいかもしれません。他にも環境変数をあらかじめセットすることでいろいろできそうです。

次にX64プラットフォームのビルドを紹介しようと思います。まずは「C:\TianoCore\Edk\Sample\Platform\X64\Build\Config.env」の「USE_VC8 = NO」 を「USE_VC8 = YES」に書き換えます。で、前述の環境変数をセットして、ビルドディレクトリへ移動します。


> cd C:\TianoCore\Edk\Sample\Platform\X64\Build


そしてビルドです。


> nmake


でビルドできます。X64では残念ながらエミュレート環境は用意されていないようです。


とりあえず、その3はここまでにしておきます。その4ではVCのIDEからビルド~デバッグの方法を紹介しようかと思います。

EDKをビルドする その2

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

仕様書やソースなど必要なリソースを以下のリンクからゲットします。

インテル
http://www.intel.com/technology/efi/

UEFI
http://www.uefi.org/home/

EDK
http://sourceforge.net/projects/efidevkit/files/


sourceforgeのEDKプロジェクトのサイトにソースが公開されているのでダウンロードします。「Releases」の「Offical Releases」の中で最新のものをダウンロードします。2010年8月3日時点の最新版はEdk 1.06.zipだったのでこれを使います。ドキュメント類も必要に応じてダウンロードしておくと後々参考になります。得に最初にお世話になるのは「Edk Getting Statted Guid」ですね。

sourceforgeのEDKプロジェクトのサイトにソースが公開されているのでダウンロードします。「Releases」の「Offical Releases」の中で最新のものをダウンロードします。2010年8月3日時点の最新版はEdk 1.06.zipだったのでこれを使います。ドキュメント類も必要に応じてダウンロードしておくと後々参考になります。得に最初にお世話になるのは「Edk Getting Statted Guid」ですね。
そして、肝心のビルド環境ですが、ドキュメントによって書いてあることが微妙に違っているのでちょっとあれですが、概ね以下のような感じです。
  • OS: Microsoft Windows 2000 or XP 
  • コンパイラ: Microsoft Visual Studio .NET 2003 or 2005 (IA64やX64をビルドするには Microsoft Windows Server 2003 DDK build 3790) 
といった感じです。で、問題はVisual Studioのエディションなんですが、これもドキュメントによって書いてあることがまちまちで、2005 Professional とか2003 Enterpriseとか書いてありますが個人で購入するには高価すぎるわけです。なので、私はWindowsXP Home EditionとVisual C++ 2005 Express Editionで挑戦してみました。環境構築に若干の+αが必要ですが、とくに問題なく快適にビルドできます。ただオフィシャルな環境ではないので、そこら辺は自己責任になりますが… まあ、個人的な感触としてはVC++のバージョンさえあってれば問題ないように思います。

そんなわけでまず、必要なツール類をダウンロードします。ちなみにすべて無料で入手できます。

VC++ 2005 Express Edition 日本語版
http://download.microsoft.com/download/8/E/8/8E85D539-2255-4CFD-AA97-440AE6C6F44A/vc.iso

VC++ 2005 Express Edition SP1
http://www.microsoft.com/japan/msdn/vstudio/downloads/sp/vs2005/sp1/
(VS80sp1-KB926748-X86-INTL.exeをダウンロードする)

Microsoft Windows Server 2003 DDK
http://download.microsoft.com/download/9/0/f/90f019ac-8243-48d3-91cf-81fc4093ecfd/1830_usa_ddk.iso
(X64やIA64をビルドしないのであれば必要ない)

Microsoft Platform SDK
http://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=en
(PSDK-x86.exeをダウンロードする)

Microsoft Macro Assembler 8.0 (MASM)
http://www.microsoft.com/downloads/details.aspx?FamilyID=7a1c9da0-0510-44a2-b042-7ef370530c64&DisplayLang=ja

それでは、ツール類をインストールしましょうかね。

まずはVC++ Express Editionです。ダウンロードするとisoファイルになっているので、CDRに焼くか仮想CDドライブでマウントするか、WINRARなどのisoを解凍できるアーカイバで解凍しちゃいます。私はWINRARで解凍しちゃいました。それで、setupを実行してインストールします。特に気をつけることは無く、デフォルトのオプションでインストールします。
次にVC++ 2005 Express SP1をインストールします。これは必須ではありませんが、一応入れておきます。ダウンロードしたファイルを実行するだけなので、これも特に悩むことは無いと思います。

次にMicrosoft Platform SDKをインストールします。これはオフィシャルなドキュメントには書かれていないものですが、これをインストールしないとExpressEditionではインクルードファイルが無いとかでビルドエラーになります。
つまり、Expressでもこれをインストールすれば足りないライブラリやヘッダファイルが補完されEDKをビルドできるようになるというわけです。

PSDK-x86.exeを実行してインストールします。途中以下のような画面に遭遇すると思いますが、Typcalを選んでおけば問題ないです。知識のある方はCustomでお好みのコンポーネントを選んでインストールしてもよいと思います。


次にMASMをインストールします。これはアセンブラですね。EFIといえどもアセンブリ言語で書かれたソースが多少あるため必要になります。ExpressEditionでは標準でついていないのでインストールします。これもMASMsetup.EXEを実行するだけなので悩むところはないはずです。

ここまでのツールでIA32プラットフォームのソースはビルドできますが、X64やIA32プラットフォームのソースをビルドするにはMicrosoft Windows Server 2003 DDKをインストールする必要があります。1830_usa_ddk.isoというファイルですがisoなので、例のごとく焼くなり、マウントするなり、解凍するなりして中のsetup.exeを実行します。途中以下のような画面に出くわしますが、サンプルコードのインストールをするかどうかなので、このままデフォルトでいいと思われます。



以上で、ツール類のインストールは完了です。いよいよビルドしようと思いますが、またしても長文となってしまったので続きはその3に書きます。

EDKをビルドする その1


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

これを読んでくださっている皆様は、EDKというか、EFIがなんのことやらな方が多いかと思いますので、そこから簡単に説明しますとですね、EFIとは、 「Extensible Firmware Interface」の略でして、古くからあるPCのBIOS(以下LegacyBIOS)を置き換えてしまおうというものです。

EFIの発端はIntelがItatiumというCPUを開発して、そのプラットフォーム向けのファームウェアを新規開発する必要性があったところから始まっていて、仕様はIntelからリリースされたんですが、その後UEFIフォーラムに仕様を寄贈して以後、UEFIが仕様の開発とリリースを行っているようです。

EFIはこれまでのLegacyBIOSと違い、インターフェイス仕様が明確に定められており、公開されているのです。これまで完全にクローズドで無秩序だったBIOSの世界に秩序をもたらす救世主的存在になりうる素敵なやつなのです。もうちょっと詳しいことが知りたい方はWikipediaに結構詳しめに書かれているので読んでみるといいかもしれません。
http://ja.wikipedia.org/wiki/Extensible_Firmware_Interface


そんな素敵なEFIさんなのですが、いまいち市場では微妙な扱いのようです。現在EFIの採用を明確に表明しているのはAppleのIntel CPU搭載MacとかItanimを搭載したサーバーやワークステーションと、一部の自作PC向けマザーボードくらいですかねぇ。
これはたぶん、現在既存のPC用OSが(正確にはそのブートローダが)、LegacyBIOSのブートの仕組みを想定していて、EFIで既存のOSをブートするにはCSM(Compatibility Support Module)というLegacyBIOSの互換モジュールをわざわざ組み込まないといけないのです。つまり、既存のOSがEFIをサポートしてないので、PC業界的にはあんまりメリットを感じてないのかもしれません。加えて、開発側では、LegacyBIOSの蓄積してきたソフトウェア資産を破棄して、技術的ノウハウを新たに開拓しないといけないEFIに移行するのは中々リスクが高く、時間もかかる(=開発費がかさむ)また、EFIの将来性への懸念等の理由が、なかなか本格的に移行が進まない要因なのではないかと個人的には推測してます。(しかしながら、公にEFIをうたってなくても、EFIブートをサポートしているPCもいくつかあるようなので、実は水面下では浸透してきているのかもしれません。)


なので過去のしがらみのないAppleはすんなりEFIを採用できたんでしょうな。ちなみにMacでWindowsを起動するためのBootCampというプログラムがありますが、これの正体はCSMだという噂です。

前置きが長くなってしまいましたが、EFIについてはある程度ご理解頂けたと思います。そんで、EDKについてですが、EDKとは「EFI Deveopler Kit」の略でしてEFIの開発キットなのです。これはもともとIntelが開発したEFIの実装(コードネーム: Tiano)の一部をオープンソースとしてリリースしたものです。残念ながらチップセットの初期化コード等は含まれないので、ビルドしたバイナリをマザーボードのROMに焼いても起動できるわけではないのですが、エミュレータ環境でEFIを動作させることができ、EFIのドライバやアプリケーションを開発する助けにはなるのです。というわけでこれを使ってみようじゃないかという話です。

長文になってしまったので、続きはその2に書きます。