ソフト・マクロのCPUでLinuxを動かす(後編) ──OSの実装とネットワーク対応機器への応用
●○● Column ●○●
◆ブート動作について◆
本ボードのブート・ローダは以下の二つのプログラムで構成されています.
- FPGA内蔵メモリ内のブート・ローダ(最低限の機能を実装)
- フラッシュ・メモリ上のhermit(高機能ブート・ローダ)
電源投入時,MicroBlazeは0番地から起動されます.0番地から格納されているのは割り込みベクタ・テーブルで,0番地にはリセット割り込みベクタが書き込まれています.本ボードでは,0番地以降にFPGA内蔵メモリを割り当てており,リセット後に動作するのは,FPGA内蔵メモリに格納されたブート・ローダです.
FPGA内蔵メモリ内のブート・ローダは,フラッシュ・メモリ上のhermitをSDRAMにコピーし,hermitの先頭アドレスにジャンプして,hermitが起動されます.
hermitは,フラッシュ・メモリ上にあるLinuxイメージをSDRAMにコピーし,Linuxイメージの先頭にジャンプしてLinuxが起動されます(図A).
このようにブート動作は2段階に分けられています.ブート・ローダを2段階に分けた理由は二つあります.一つ目の理由は,なんらかの原因でフラッシュ・メモリの内容が書き換えられても,最低限の機能のブート・ローダまでは動作させたかったためです.FPGA内蔵メモリからブートできるようにしておけば,そこからフラッシュ・メモリ書き換えプログラムを動作させて復旧させることができます.二つ目の理由はブート・ローダによって使用される内蔵メモリ容量を最低限に抑えたかったためです.
2段階のブートを使用しないことも可能です.しかし,圧縮されたプログラム・イメージを展開させたり,CompactFlashやハード・ディスクなどから高度なブートをさせようとすると,ブート・ローダのために多くのメモリが必要となります.FPGA内蔵メモリは貴重なリソースです.起動時にしか実行されないブート・ローダのために多くの容量を消費してしまうのは避けたいところです.
図A ブート動作のプログラム・コピー元とコピー先