BeBox
Boot
$Id: boot.html,v 1.2 2006/11/22 19:47:00 sakamoto Exp $
BeBox Bootの仕組み
- BeBoxにのっている PowerPC 603e は、電源を投入されると(Hard Reset)、
物理アドレス 0xFFF00100 から実行を開始する。[603um 4.5.1.1(4-19)]
- 2つのCPUの振る舞い
- 0xFFF00100あたりのアドレスにBeBoxのbootの要である Boot Rom が
マッピングされている。Boot Romは、MPU(CACHE、レジスタ等)、
メモリ、デバイス(PCIブリッジ、PCI、ISA等)の初期化を行ったのち、
BeOSファイルシステムにあるsystem/kernelを
0x3100に読み込み、0x3100から実行する。
- BeOSのファイルシステムは、フロッピー、ハードディスク、CD-ROMの
どれかに存在すれば良い。またBoot RomはBeOSファイルシステム
(新旧どちらでも良い。
つまりAAPR以降のbfsとDR8.3以前のofs)しか理解しない。
- system/kernelには
- PEF実行ファイルフォーマットであること。
- スタティックリンクされていること。
- __startエントリから実行される。
という条件がある。
- Linux/ppcなどは、PEFのブートイメージでブートしてから、
Linuxブートイメージを読み込み、起動させるという、
2段構えになっている。BeBoxのBOOT ROMがもっと柔軟になっていると
こんなことをしなくても良いのだが…
- 起動時に F1 キーを押していると、BeBoxのSERIAL 4に
BOOT ROMのデバッグメッセージが出力される。[BeOS User's GUIDE]
- これを見ると、どのデバイスから読み込まれたか、
どこにどのsectionがloadされたかなどが出力されるので結構便利。
- 参考URL:沖さんのBeBoxのページ
Boot floppy 作成方法 with DR8.x
- フロッピーをBeOSファイルシステムでフォーマットする。
- format -r /dev/floppy_disk fd
- フロッピーをマウントしたのち、systemディレクトリを作成する。
- mount /dev/floppy_disk
- cd /fd (フロッピーに付けた名前が"fd"の場合)
- mkdir system
- /fd/systemにkernelという名前で、
ブートするためのバイナリをコピーする。
-
cp boot /fd/system/kernel
CodeWarrior for BeOSで作る Boot Image
- スタートアップルーチンなどを自分で書き、
mwcc -cでオブジェクトを生成する。
- mwld -nodefaults [files]
で、実行ファイルを生成する。
- CodeWarriorでは、アセンブラが単体で存在してない。
すべてインラインアセンブラで書かなければならない。
- アセンブラ部分が結構タコだと思うので、苦労する :)
クロス環境のGCCで作る Boot Image
- まずは、クロス開発環境を構築する。
- LinuxppcではBeBoxでLinuxをbootするための
Floppy disk imageを配布している。
ソースも含まれているため、大変参考になる。
- また、このbe_bootアーカイブには、mk_pefという、
LinuxのBootイメージをPEFイメージに変換するツールのソースも
含まれているので、絶対に必要になる。さらに、
Linuxのソースツリー(arch/ppc/kernel)には、ELFバイナリを
Linux Bootイメージに変換する
mkboot が含まれているので、それも必要となる。
- クロス開発環境で、mkboot.cと、mk_pef.cをコンパイルするときには、
エンディアンに気をつけなければならない(LinuxppcもNetBSD/powerpcも
ビッグエンディアンを前提としている)。
それぞれのソースはクロス開発環境を考慮して、
リトルエンディアンマシン用のdefineが用意されているので、
それを利用する。
- NetBSD/powerpcは現在、Open FirmwareがのったPowerPCマシンをサポートしている。
BeBoxにはOpen Firmwareはのっていないので、ソースコードをそのまま
利用することはできない。
- NetBSD/bebox ブートローダソース
- Be NewsLetter Issue 05, 27を見るとわかるように、
BeBox起動時には、まずCPU0だけがsystem/kernelを実行しはじめる。
CPU1は、Hard RESETされ続けている。
- CPU1を、使用する方法は、Linux/ppcのbe_bootアーカイブのcpu.cと
main.cに詳しい。
CPU1のjumpテーブルに書き込み、CPU1をRESETから解放。
CPU1が動き出すのを待つ(flagを使ってチェック)、といったことを
すれば良い。
もどる