(移植編第1回)PowerPCに移植する

2009/03/08

あなたは 人目のお客様です.

今回から,新章として「KOZOSの移植」という別テーマで並行して連載をします. まあ実ボードへの移植ということで,いろんなボードコンピュータにKOZOSを移植して, そのいきさつなどを書いてみようかな,と.

何度も書いているがKOZOSはPC-UNIX上で動作するユーザーランドOSであり, FreeBSDやLinuxの上でパッと試せるのがウリなわけだ. ただそれだけだと単なるスレッドライブラリと変わらないので, 内部は組み込みOSの作りを模擬している...ということなのだけど, やっぱし実際に実ハードウエアの上で動いているものが無いと, 信憑性がないというか,所詮机上の話でしょ?みたいな感じがしちゃうよね. あとはやっぱし実ハードで動いているのを見たい!という思いもある. まあオープンソースカンファレンスに出展 して,やっぱし実ハードの上で動いてないとインパクト無いなーと 思ったというのが大きな理由ではある.

で,実ハードへの移植なのだけど,「実ハード」といってもピンとこないひとたちの ために,ちょっと説明.

OS自作というと,これはLinuxとか 30日でできる! OS自作入門 の影響が大きいのだと思うのだけど,AT互換機(Windowsが動く,いわゆるPC)で 動作するOSを思い浮かべる人が多いと思う.

しかしKOZOSはこーいうようなOSを想定しているのではなくて, 組み込み機器上で動作する,組み込みOSを想定している. 組み込み機器というのは,たとえばPDAとか携帯電話とか,FAXとかプリンタとか カーナビとか炊飯器とか,そーいうもののことだ. これらは高性能/低性能の差はあれど,いずれもCPUと呼ばれるものが入っていて, 動作している.まあ炊飯器くらいだと,そこまで大げさには言わずに 「内部にマイコンが入っていて,制御を行っている」などと言ったりもするが, 基本的なところは同じで,要するにCPUがプログラムを実行して動作している, ということだ.で,このプログラムのバイナリのことを,組み込み機器の場合は一般に 「ファームウエア」と呼ぶ.

これは単純な制御だけならOS無しで1本のプログラムが動くだけ,という構成でも 作れるのだが,組み込み機器と言えど最近は高機能のものが多く,様々なサービスを 行っていたりする.こーなるとやっぱしOSが必要になってくる. 複数のサービスを動作させたい場合には,OSを使うことでそれぞれのサービス用の プログラムを独立して書くことができるようになるからだ(この詳細については またそのうち書こう).たとえば携帯電話ならば, 時計としての機能や着信待ち受け,目覚し時計,スケジュール管理とその通知, ボタン押し下への反応など,さまざまなサービスが常時動作している(はずだ). これらの機能をそれぞれ順次切替えながら動作させる1本のプログラムなど, あまり書きたいものではない. ということで,OSの出番となる.このために使われるOSが,組み込みOSだ.

これに対してPC上で動作するWindowsとかLinuxなどのOSは,汎用OSと呼ばれる. 汎用OSと組み込みOSでは求められるものが全然違うので, まあ自作OSというとつきものの 「仮想メモリが無いと実用にならない!」とか 「ファイルシステムが無いなんてOSとは言えない!」とか 「ソケットが無いとネットワークプログラムが書けないではないか!」 とか言ったような話(そんなに言うなら自分で作りゃいいと思うのだが)は, そのまま当てはまらない. まあOSの本来の目的は資源管理にあるので,CPU時間の管理としてスレッドの実現, スレッド間通信の方法の提供,あとメモリ資源の管理くらいしてくれれば, 十分にOSと言っていいとは思う.

で,KOZOSなのだけど,KOZOSはこのような組み込みOSを模擬してPC-UNIX上で動作する. つまり本来の意味での組み込みOSではなく,組み込みOSの勉強をするために, PC-UNIX上で動作するOSシミュレータのようなものだ.ということで実際に 組み込み機器に移植して動作させたい,というのが今回のテーマだ.

で,移植先の組み込み機器なのだけど,実際に携帯電話とかPDAとかに移植するのは まああまり現実的でない.というのはこのような機器はファームウエアのビルド方法 などはまあまず非公開(それどころか,むしろ機密)だし,アマチュアレベルで手を 出すのは(著作権とかそーいう法律的な問題も含めて)かなり敷居が高い. ていうかそれをやりだすと,OSの勉強ではなく単にその機器の勉強になってしまい 本末転倒.ということで,移植先のターゲットには以下の候補がある.

  1. 評価用のCPUボード
  2. 製品版のCPUボード
  3. Linuxが動く小型コンピュータで,自分でLinuxインストールできるような製品
  4. 安価なCPU基板
まず1の「評価用のCPUボード」だけど,まあたいていのCPUでは,そのCPUを導入する 前にお試しで使ってみるための評価ボード(evaluation board)というものが各社から 出ている(CPUベンダが出している製品もあるし,代理店など他の企業が出している 製品もある).これはまずそのCPUがど真ん中に置いてあって,そのCPUに接続できる I/Oがひととおり(シリアル,ethernet,USB,VGAなど)取り付けられているという ものだ.「リファレンスボード」といったりもする.たとえば これ とか これ とかだ.「評価ボード」で検索すると,いっぱい出てくる.

これは実は,移植先として理想的(開発環境など充実しているし,I/Oもいっぱい ついているし,作りは汎用的だし,移植のためのものなので内部資料なども充実) なのだが,大きな問題がある.というのは,なんといっても高価なのだ. まあ金額は見てもらえばわかると思うのだが,平気で10万とかしたりする. 企業が自社製品のCPU選定のために評価用に購入するならばたいして高価とは いえないのだけれど(実際,10万くらいで「安価」をうたっている製品も見かけたことが ある気がする.まあ,たしかに安価ではある),これではアマチュアレベルで勉強や 遊びのために買っていじってみたいというのは,まず無理だ. ましてやOSいじって遊んでみるために,中学生がおとしだまで買ったり, 高校のコンピュータ部が部費で買ったりできるようなものではない. しかし,KOZOSはそーいうためのサンプルOSにしたいという思いがあるので, これは却下になってしまうのだな.

次に製品版のCPUボードだけど,これはCPUの評価が目的というよりも, あるCPUと周辺I/Oがコンパクトな基板上にまとめられていて,それをそのまま 流用して小型サーバとかのような組み込み機器を作れる,というものだ. これは,たとえば小型サーバ製品を作りたくてソフトウエア技術はあるのだけど, ハードウエアを作る技術が無いような企業が,基板は他の会社から買って, そこに自社製のソフトウエアを乗せて自社製品として売る,というような用途に 使うものだ.たとえば Silicon Linux (ここの社長の海老原さんには何度か面識がある)の CAT709 とか, アットマークテクノ朱雀 (これは実はFPGAボードなので,CPUボードというわけではないけど)とかだ. ちなみに評価ボードとか製品版ボードも含め,CPUが乗っていてとりあえず コンピュータとして動作する基板のことを一般に「ボードコンピュータ」と言う.

で,これも移植先としてはけっこう理想的.I/Oは限定されていたりするが, 評価ボードよりも安価だったりするし,たいていはその目的のため,汎用的に作って あるからだ.あとたいていはLinuxとかがすでに移植済みで,とりあえず買ってLinux 動かして遊んだりも手軽にできる. あと基本的には製品にそのまま組み込むボードなので,それなりの信頼性が 確保されていたりする(高価な電解コンデンサが使ってあるので壊れにくい,とか, きちんとした出荷検査が行われている,とか).

でもいくら評価ボードよりは安価とはいえ,やはり数万はするので, ギリギリ買える金額だとは思うのだが,遊び用途で買うにはまだまだ高価だ. あとは基本的には製品にそのまま組み込むボードなので,営業さんに 「いくらくらいですか?」と聞くと,「数が出るならばお安くできます」と 返されたりする. で,この「数が出れば」というのは,数千単位(数万単位?)で買ってくれるならば, という意味だ.要するに,個人への単品売りというのはあまり考えられていなかったり する(CAT709はホビー用途なら割引で買える(すばらしい!)のだが,それでもやっぱし 数万してしまう).なのでこれも候補としては有力なのだけど,とりあえずは保留かな.

で,次に, 「Linuxが動く小型コンピュータで,自分でLinuxインストールできるような製品」 というやつだ.本来は小型サーバとかに使うのだけど,動作はLinuxで, しかも自分で作ったカーネルをインストールもできるので,好きに使っていいよ (もちろんその場合は保証やサポートは無いが)というものだ. こーいうのはあるようでなかなか無いものなのだけど, 有名なところでは ぷらっとホームOpenBlockS とか, 玄人志向玄箱 とかがある.

これらのいいところは,まずきれいなケースに入っていて(ボードコンピュータは たいてい基板むき出し),あとはOSの勉強に飽きたら本来のLinuxに戻して, それはそれでサーバとかにして遊んでみることができるということだ. ただ,基本的には添付のLinuxを入れて動かすものであり,自分でOSをインストールして 動かすというのは,たぶんできるとはいえ未サポートなので,そのための仕組み (ファームウエアインストール方法やブート方法など)やドキュメントがあまり整備 されていない場合が多い(でも,そーいうコミュニティとかが充実していたりする ことは多い). あとこれらもやはり数万はするので,まだまだ高価.まあでも飽きたらサーバとしても 使えることを考えると,それなりに買いやすいものだとは思う.

で,最後に「安価なCPU基板」というやつなのだけど,これが実は本命になる. これはたとえば 秋月組み立てキット とか,毎年春になると Interface誌に付録でついてくる CPU基板とかだ.

これらの利点は,とにかく安いこと.せいぜい数千円のレベルだ.ただし安いぶん デメリットももちろんあって,まずは使えるI/Oがたいてい少ない(シリアルだけとか), あとはコネクタとかが最初からついていなくて,自分ではんだづけしてつける必要が あったりする.基本的にはCPUのGPIOの線が引き出してあるので,コネクタを はんだづけしてGPIOで信号を入出力して,センサとA/DつけてLED光らせたり 液晶パネルに文字を出して遊ぶ,ということになる.あとファームウエアを インストールするのも,ROMライタで直接焼き込み,みたいなものも多い.

でもやっぱし安いことはアマチュアにとっては最強の利点だ.ということで, まずはこれらの安いボードをターゲットにして移植を進めていきたい,と思う.

あと, はりぼてOSのように, PC上でフロッピーブートという方法も対応したいとは思う. なんだかんだいって,PCが一番入手しやすいハードウエアだからだ.

で,記念すべき第1回の移植先ターゲットボードはこれ.

ここまで延々とターゲットボードの選択基準について書いてきて,いきなり路線と 全然違うものになってしまってゴメン. これはCQ出版組み込みシステム開発評価キット (通称BLANCA)用の, PowerPCオプションCPUカードだ. まず「組み込みシステム開発評価キット」というのは,FPGAを2個積んでいて, 各種コネクタがFPGAに繋がれているので,FPGAで好きに各種コントローラを作って 遊んでみましょう,というものだ.で,これにオプションとしてCPUボードを 積むことができて,そのPowerPC版のボードが今回のターゲットとなる.

こっちの画像はBLANCAに積んだ状態.まあこのボード自体は単体でも動作するので, 必ずしもBLANCAが必要なわけではない.

モノ自体はタンバック MPC5200DIMM(TB0286)というボードで,このボードには メディアラボ u-bootを移植している(このへんのことはInterfaceの2009/02号に詳しく 書いてあるので,そっちも見てほしい).

なんでこのボードなのかというと,まあ実はこのボードを使っていろいろ動かして みようという連載をいまぼくがInterfaceで持っているので,手元にサンプルが あるのでとりあえず手軽だということだ. ボード自体はやはり5万円くらいするので個人で買うにはちょっと高価だが, このボードはu-bootが動作するので,自作OSをインストールして動かしてみるには 技術的な敷居がけっこう低く,(金額を別にすれば)OS自作にはおすすめなボードだ. あとはPowerPCへの(ていうかこのボードへの)移植は実は非公開だったのだけど ずいぶん前にすでに行っていて,すぐに対応できた,というのも理由にある.

ということで実ハードウエアへの移植なのだけど, ほんとうはこういうのはユーザーランドOSとしてのソースコードと 実ハードウエア上の動作のためのソースコードは共通化して, 1本のソースコードからそれぞれビルドできるようにすべきだ. で,はじめはそーいうふうに書いていたのだけど, 現状のKOZOSのソースコードはユーザーランドOSとしての対応部分がけっこう多く, #ifdef で分けていってもなんだかごちゃごちゃした感じになってしまうのだな.

もともとKOZOSはパッと読むことができるサンプルOSというものを目指しているので, こーいう理由でKOZOSのソースコードが読みにくくなるというのはぼくはちょっと 避けたい. というのは,OSとしてのソースコードが,OSとしての機能のために複雑になってしまう のならば,それはそれでしょうがない.OS作ったらそうなる,ということだからね. だけど多機種対応などのような,OSの本来の機能とはべつのことでソースコードが 複雑になってしまっていると,OSとして結局は何がやりたいのかが見えにくくなって しまうと思う.もしもOSを勉強しようとしたときに,これはきっとすごくじゃまな ことだ.

同じような理由で,ビルド前に configure スクリプトを走らせるとビルド用の ソースツリーができて,ビルドはその後に行う,というような構成も避けたい. これも,ソースコード読んで勉強しようとするときに,すごくじゃまだからだ. (OSの勉強でソースコードが読みたいのに,その前にスクリプト走らせたり (そしてうまく走らせられなくてハマったり),スクリプトの内容を読んだり しなければならなかったりする)

ということで多CPUへの移植は,第42回のソースコード から不要部分をごっそりそぎおとして簡略化したものをベースにして作業を行おうかと 思う.つまり本家のソースコードとは分かれて,移植用のソースを別立てするという ことだ.本家のほうではそのままリアルタイム性の追求とかOS機能の拡張とかの お試しを引続き行う.

移植時には,移植先のボード単位でソースコードは別立てする. これも,もちろん本来は1本のソースコードから多ボードのファームがビルドできる ようにすべきだ.そうしておけば,そのソースコードに修正を入れれば,すべての ボードに修正が反映されるからだ.でもKOZOSでは,これはあえてしない. そのボード専用のソースコードにしてしまって,そのボード単体での読みやすさ, ビルドしやすさを優先する. (機能を抽象化してソースコードを共通化・整理するのは,OSの構造を理解した後に, 個別に行えばよい)

なぜこのようにしたいのかというと,ぼく自身がμiTRONの勉強(というより, 組み込みOSの勉強)をしようと思ってTOPPERSをいじろうとしたときに, コンフィギュレータの動作がよくわからずに中途半端に挫折した,という経験が あるからなのだ.こういうのって,まあ本人の勉強不足と言ってしまえばそれまで なのだが,本来はOSの勉強がしたいのに,それ以外の部分(OSの機能とは直接関係の 無い部分)でハマってしまって挫折するというのは,非常にもったいないことだと 思うのだ.

で,移植してみたのがこれ.

(2009/04/10 ライセンスに関する文書として,KL-01とLICENSEを追加. 詳しくは第43回を参照)

最初のサンプルとしては,シリアルを使ってコマンド応答をするだけの簡単なものを 作ってみた.前述したように第42回のソースコードから 不要部分をごっそり削って,PowerPC用コードを入れてある.PowerPC依存部について は,Interface2009/02号からの 連載「実践的PowerPC活用テクニック」で使っているソースコード (スタートアップとか,割り込み処理とか,シリアル制御とか)を参考にしている. (これは,ぼくが書いている記事です)

ちなみにPowerPC用のスタートアップとしてstartup.sが追加されているが, PowerPCアセンブラに関しては Interface2006/02号特集記事の 「PowerPCアセンブラのエッセンス」を参考にしてほしい(これも,ぼくが書いた記事 です).PowerPCのアセンブラ関連の書籍とかはあまり見かけないのだけど,この記事を 読めばとりあえず簡単なアセンブラプログラミングはできる,というように書いて あります(ぼく自身,この記事はアセンブラ初心者をかなり意識して書いている).

注意点としては,まずスレッドのディスパッチ部分がアセンブラで書いてある. これは startup.s の以下の部分.

	.globl	dispatch
	.type	dispatch,@function
dispatch:
	mr	1,3

	lwz	2,128(1)
	mtlr	2
	lwz	2,132(1)
	mtcr	2
	lwz	2,136(1)
	mtctr	2
	lwz	2,140(1)
	mtxer	2
	lwz	2,144(1)
	mtsrr0	2
	lwz	2,148(1)
	andi.	2,2,0xffff
	mtsrr1	2

	lmw	2,8(1)
	lwz	0,4(1)
	lwz	1,0(1)

	sync
	isync
	rfi
スレッドのコンテキスト保存領域(kz_thread 構造体の context メンバ)から 各レジスタに値を戻して,rfiで復帰するようになっている. dispatch は thread.c の thread_intrvec() の終端で,以下のようにして呼ばれて いる.
  dispatch(¤t->context);
ここは従来は setcontext() でコンテキストスイッチしていたところなのだが, startup.s の dispatch を呼ぶように修正している.

さらに割り込み発生時には,startup.s の _intr というハンドラが呼ばれ (これは main.c:sethandler() で割り込みハンドラ領域に登録している), レジスタの値をカーネルスタック(0x200000で決めうち)に退避してから defhandler() というC言語の関数に処理を渡すようになっている. これは startup.s の以下の部分.

_intr:
	mtsprg2	1

	lis	1,0x200000@h
	ori	1,1,0x200000@l
	stwu	1,-160(1)

	stmw	2,8(1)
	stw	0,4(1)
	mfsprg2	2
	stw	2,0(1)

	mflr	2
	stw	2,128(1)
	mfcr	2
	stw	2,132(1)
	mfctr	2
	stw	2,136(1)
	mfxer	2
	stw	2,140(1)
	mfsrr0	4
	stw	4,144(1)
	mfsrr1	5
	stw	5,148(1)

	bl	1f
1:	mflr	3

	lis	2,defhandler@h
	ori	2,2,defhandler@l
	mtlr	2
	blrl

	lwz	2,128(1)
	mtlr	2
	lwz	2,132(1)
	mtcr	2
	lwz	2,136(1)
	mtctr	2
	lwz	2,140(1)
	mtxer	2
	lwz	2,144(1)
	mtsrr0	2
	lwz	2,148(1)
	andi.	2,2,0xffff
	mtsrr1	2

	lmw	2,8(1)
	lwz	0,4(1)
	lwz	1,0(1)

	sync
	isync
	rfi
またシステムコールは従来はSIGSYSシグナル発行だったが,PowerPCのsc命令実行に 置き換えられている.これは syscall.c の以下の部分.
void kz_syscall(kz_syscall_type_t type, kz_syscall_param_t *param)
{
  current->syscall.type = type;
  current->syscall.param = param;
  asm volatile ("sc");
  return;
}
あとは,extintr.c の割り込み処理部分で,serial.c が持っている シリアル関連のライブラリ関数を呼び出すように修正してある. あと他にもすっきりさせるためにこまかいところをいろいろと削ってあるのだが, まあいちいち説明はしない.

ではファームウエアをビルドして,インストールし,起動してみよう. まずはビルド環境の構築なのだけど,実はシリアルなどの動作のために u-bootのヘッダファイルを参照しているので,u-bootのビルドが必要. まあビルド方法に関しては,実は Interface2009/02号の記事と 同様なので,そっちを参照してほしい.

hiroaki@teapot:~/tb0286/kozos>% ./make.sh 
+ LOCAL=/usr/local
+ TARGET=powerpc-linux
+ TARGETDIR=/usr/local/powerpc-linux
+ PATH=/usr/local/powerpc-linux/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/usr/pkg/sbin:/usr/pkg/bin:/usr/X11R6/sbin:/usr/X11R6/bin:/home/hiroaki/bin: export PATH
+ GCC_EXEC_PREFIX=/usr/local/powerpc-linux/bin export GCC_EXEC_PREFIX
+ AR=/usr/local/powerpc-linux/bin/ar export AR
+ AS=/usr/local/powerpc-linux/bin/as export AS
+ CC=/usr/local/powerpc-linux/bin/gcc export CC
+ /usr/local/powerpc-linux/bin/gcc -print-prog-name=cpp
+ CPP=cpp export CPP
+ CXX=/usr/local/powerpc-linux/bin/gcc export CXX
+ FC=/usr/local/powerpc-linux/bin/f77 export FC
+ LD=/usr/local/powerpc-linux/bin/ld export LD
+ NM=/usr/local/powerpc-linux/bin/nm export NM
+ RANLIB=/usr/local/powerpc-linux/bin/ranlib export RANLIB
+ SIZE=/usr/local/powerpc-linux/bin/size export SIZE
+ ADDR2LINE=/usr/local/powerpc-linux/bin/addr2line export ADDR2LINE
+ GASP=/usr/local/powerpc-linux/bin/gasp export GASP
+ OBJCOPY=/usr/local/powerpc-linux/bin/objcopy export OBJCOPY
+ OBJDUMP=/usr/local/powerpc-linux/bin/objdump export OBJDUMP
+ STRINGS=/usr/local/powerpc-linux/bin/strings export STRINGS
+ STRIP=/usr/local/powerpc-linux/bin/strip export STRIP
+ HOSTED_CC=/usr/bin/cc export HOSTED_CC
+ NOGCCERROR=yes export NOGCCERROR
+ OBJECT_FMT=ELF export OBJECT_FMT
+ MAKE=gmake -f Makefile
+ export MAKE
+ set -x
+ exec gmake -f Makefile
/usr/local/powerpc-linux/bin/gcc -c startup.s  -Wall -nostdinc -fno-builtin -msoft-float -I../uboot/u-boot.git/include -g -DKOZOS
/usr/local/powerpc-linux/bin/gcc -c main.c  -Wall -nostdinc -fno-builtin -msoft-float -I../uboot/u-boot.git/include -g -DKOZOS
/usr/local/powerpc-linux/bin/gcc -c serial.c  -Wall -nostdinc -fno-builtin -msoft-float -I../uboot/u-boot.git/include -g -DKOZOS
/usr/local/powerpc-linux/bin/gcc -c lib.c  -Wall -nostdinc -fno-builtin -msoft-float -I../uboot/u-boot.git/include -g -DKOZOS
/usr/local/powerpc-linux/bin/gcc -c thread.c  -Wall -nostdinc -fno-builtin -msoft-float -I../uboot/u-boot.git/include -g -DKOZOS
/usr/local/powerpc-linux/bin/gcc -c syscall.c  -Wall -nostdinc -fno-builtin -msoft-float -I../uboot/u-boot.git/include -g -DKOZOS
/usr/local/powerpc-linux/bin/gcc -c memory.c  -Wall -nostdinc -fno-builtin -msoft-float -I../uboot/u-boot.git/include -g -DKOZOS
/usr/local/powerpc-linux/bin/gcc -c idle.c  -Wall -nostdinc -fno-builtin -msoft-float -I../uboot/u-boot.git/include -g -DKOZOS
/usr/local/powerpc-linux/bin/gcc -c extintr.c  -Wall -nostdinc -fno-builtin -msoft-float -I../uboot/u-boot.git/include -g -DKOZOS
/usr/local/powerpc-linux/bin/gcc -c kozos.c  -Wall -nostdinc -fno-builtin -msoft-float -I../uboot/u-boot.git/include -g -DKOZOS
/usr/local/powerpc-linux/bin/gcc -c command.c  -Wall -nostdinc -fno-builtin -msoft-float -I../uboot/u-boot.git/include -g -DKOZOS
/usr/local/powerpc-linux/bin/gcc -c crt1.c  -Wall -nostdinc -fno-builtin -msoft-float -I../uboot/u-boot.git/include -g -DKOZOS
/usr/local/powerpc-linux/bin/gcc -c crti.c  -Wall -nostdinc -fno-builtin -msoft-float -I../uboot/u-boot.git/include -g -DKOZOS
/usr/local/powerpc-linux/bin/gcc -c crtn.c  -Wall -nostdinc -fno-builtin -msoft-float -I../uboot/u-boot.git/include -g -DKOZOS
/usr/local/powerpc-linux/bin/ar ruc libc.a crt1.o crti.o crtn.o
/usr/local/powerpc-linux/bin/gcc startup.o main.o serial.o lib.o thread.o syscall.o memory.o idle.o extintr.o kozos.o command.o -o sample  -Wall -nostdinc -fno-builtin -msoft-float -I../uboot/u-boot.git/include -g -DKOZOS -static -T ld.scr -L.
hiroaki@teapot:~/tb0286/kozos>%
hiroaki@teapot:~/tb0286/kozos>%
hiroaki@teapot:~/tb0286/kozos>% ./make.sh image
+ LOCAL=/usr/local
+ TARGET=powerpc-linux
+ TARGETDIR=/usr/local/powerpc-linux
+ PATH=/usr/local/powerpc-linux/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/usr/pkg/sbin:/usr/pkg/bin:/usr/X11R6/sbin:/usr/X11R6/bin:/home/hiroaki/bin: export PATH
+ GCC_EXEC_PREFIX=/usr/local/powerpc-linux/bin export GCC_EXEC_PREFIX
+ AR=/usr/local/powerpc-linux/bin/ar export AR
+ AS=/usr/local/powerpc-linux/bin/as export AS
+ CC=/usr/local/powerpc-linux/bin/gcc export CC
+ /usr/local/powerpc-linux/bin/gcc -print-prog-name=cpp
+ CPP=cpp export CPP
+ CXX=/usr/local/powerpc-linux/bin/gcc export CXX
+ FC=/usr/local/powerpc-linux/bin/f77 export FC
+ LD=/usr/local/powerpc-linux/bin/ld export LD
+ NM=/usr/local/powerpc-linux/bin/nm export NM
+ RANLIB=/usr/local/powerpc-linux/bin/ranlib export RANLIB
+ SIZE=/usr/local/powerpc-linux/bin/size export SIZE
+ ADDR2LINE=/usr/local/powerpc-linux/bin/addr2line export ADDR2LINE
+ GASP=/usr/local/powerpc-linux/bin/gasp export GASP
+ OBJCOPY=/usr/local/powerpc-linux/bin/objcopy export OBJCOPY
+ OBJDUMP=/usr/local/powerpc-linux/bin/objdump export OBJDUMP
+ STRINGS=/usr/local/powerpc-linux/bin/strings export STRINGS
+ STRIP=/usr/local/powerpc-linux/bin/strip export STRIP
+ HOSTED_CC=/usr/bin/cc export HOSTED_CC
+ NOGCCERROR=yes export NOGCCERROR
+ OBJECT_FMT=ELF export OBJECT_FMT
+ MAKE=gmake -f Makefile
+ export MAKE
+ set -x
+ exec gmake -f Makefile image
#cp sample sample.bin
powerpc-linux-objcopy -O binary sample sample.bin
../uboot/u-boot.git/tools/mkimage \
                        -A ppc -O u-boot -T standalone -C none \
                        -n "smplimg" -a 0x00040000 -e 0x00040000 \
                        -d sample.bin sample.img
Image Name:   smplimg
Created:      Sun Mar  8 22:42:46 2009
Image Type:   PowerPC U-Boot Standalone Program (uncompressed)
Data Size:    16036 Bytes = 15.66 kB = 0.02 MB
Load Address: 0x00040000
Entry Point:  0x00040000
hiroaki@teapot:~/tb0286/kozos>%
で,ボードに電源入れてファームウエアをインストールして起動する.
# bootm 80000
## Booting image at 00080000 ...
   Image Name:   smplimg
   Created:      2009-03-08  11:13:35 UTC
   Image Type:   PowerPC U-Boot Standalone Program (uncompressed)
   Data Size:    16036 Bytes = 15.7 kB
   Load Address: 00040000
   Entry Point:  00040000
OK
puts ok
printf ok
PVR = 80822014
MSR = 0000b002
MSR = 00003002
MBAR (from SPR)  = f0000000
MBAR (from MBAR) = 0000f000
MBAR (from bd)   = f0000000
IBPclock = 66000000
baudrate = 115200
MSR = 00003002
MSR_EE set OK
> echo aaa
 aaa
OK
> echo bbb
 bbb
OK
> echo test
 test
OK
> threads
extintr
idle
command
OK
> 
おー,動いた.echoコマンドやthreadsコマンドにきちんと応答できている.

なんかこれいいね.実ハードで動くと,シミュレータ上で動かすのとはまた違った 感動があるものだなあ.


メールは kozos(アットマーク)kozos.jp まで