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

9/20/2011

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とちがってロゴが入ってますねぇ。なかなかいい感じです。











































よし。