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

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に書きます。