# $NetBSD: README.xxboot,v 1.2 1998/01/05 20:52:22 perry Exp $ xxboot version 0.2 xxboot は: NetBSD/X68k を起動するためのブートプログラムです。 次のデバイスからのブートに対応しています。 o SCSI ディスクの先頭パーティション o フロッピーディスクの次の物理フォーマットのもの 1232KB (1024byte/sector, 8sector/track): X68k 標準フォーマット 1200KB (512byte/sector, 15sector/track): 俗に 2HC とかいうやつ 注意: 現在(NetBSD 1.2D)のところ、1232KB フォーマットのディスク上には 正常にファイルシステムが構築できませんので、root ファイルシステム などをこのフォーマットのディスクに置くことはできません。 これは fdboot でも同じです。 ただし、ファイルシステムを一旦 vnode disk driver (vnd) 上に作成して からフロッピーに書き込むことにより、memory disk (md) を root として 起動するブートディスクを作成することは可能だと思われます。 sdboot, fdboot との違い: xxboot は、NetBSD 1.2 に含まれている sdboot (chapuni氏作) や fdboot と 同じような機能を持っています。主な機能的な違いは次のようなものです。 o SCSI ディスクとフロッピーとで同じバイナリを使う。 o gzip で圧縮されたカーネルを読み込むことができる。 それにともない、デフォルトで読み込むカーネルのファイル名 として、netbsd のほかに netbsd.gz が加えられた。 要するに、sdboot, fdboot, gunzip をつぎはぎしたもですね。 install: 1. make します % make 2. /usr/mdec に置きます。 # make install ディスクへの書き込み: a. フロッピー 方法 1. /sbin/disklabel を -DNUMBOOT=1 付きでコンパイルしなおします。 こうしておけば、次のように disklabel の -B オプションで書く ことができます。 1232KB フォーマットの場合: # disklabel -B fd?a 1200KB フォーマットの場合: # disklabel -B fd?c なお、上の例は disklabel が予め書き込んであると仮定しています。 disklabel を同時に書き込む場合は、disklabel のマニュアルページ を参照してください。(disklabel -r -w -B fd?a floppy1232 とか) 方法 2. 邪悪な方法ですが、フロッピーに boot を書き込むコマンドを 作成しましたので、これを使っても書き込むことができます。 # ./writefdboot /usr/mdec/fdboot fd?[ac] この方法では、disklabel を予め書いておかなければなりません。 b. SCSI ディスク まだ disklabel コマンドは対応してませんから、使ってはいけません。 次のようにして書き込みます # dd if=/usr/mdec/sdboot of=/dev/rsd?a conv=sync bs=1024 count=8 ? の部分は書き込み先のドライブによって指定してください。 使いかたなど: sdboot と全く同じです。README.sdboot などを参照してください。 (ああなんて手抜き) カーネルに gzip をかけると、カーネルを参照するコマンド (ps とか dmesg とか netstat とか) は動作がおかしくなります。 常用カーネルは圧縮しない方がいいでしょう。 プログラムについて: ブートプログラムの大部分は chapuni さんが書いたものです。 gzip の展開部分 (gunzip/inflate.c) は、gzip-1.2.4 の Not copyrighted なコードから拝借しました。 Copyright のある部分は使用せずに私が書き直しましたので、 GPL に従う必要はありません。 私の作成/変更した部分について、(怪し気なスクリプトも含め) 著作権を主張するつもりはありません。 変更履歴: ver 0.2 o タイマ、外部 power on の場合に、正常に動かない不具合を修正した。 o ソースを一部整理し、また、コードサイズを減らした。 ver 0.1 o make depend がうまく動くように xxboot.s → xxboot.S に ファイル名を変更した。 o GPL なコードを排除した。 副作用として、100byte ほどコードが減った。 以下はソースを読む人向けです。 ソースについて: ブートプログラム本体は、text+data を 8KB に、bss を 56KB に 収める必要があります。 8KB におさめるために、あちらこちらで変なことをしています。 ちなみに、あと 480byte しか余っていません。 (disklabel の後に空きがありますが、それを入れても 900byte 位?) これでも 1KB は削ったかのなあ。 gunzip/inflate.c で malloc() を使っていたのですが、 malloc()/free() のパタンの性質を使って、にせものの malloc をでっち上げてあります。malloc() 用のバッファは bss ではなくスタックから取っています(bss も残り少ないから)。 bootufs.c ブートプログラム本体 xxboot.S アセンブリで書いた部分 chkfmt.s フロッピーのフォーマットを調べる部分 iocscall.h アセンブラ用ヘッダ xxboot.h C 用ヘッダ gunzip/* gzip の展開ルーチン asm() に注意 メモリマップ: 000000 |-----------------------------| | 最終的にカーネルは 0 番地に | | 転送される | | ↓ | 002400 |-----------------------------| | xxboot が最初に読まれる | 002800 |-----------------------------| | | | | 100000 |-----------------------------| | カーネル読み込みバッファ | | ↓ | | | : : | | | ↑ | | gzip の展開に使う | 3E8000 |-----------------------------| | ↑ | | xxboot のスタック | 3F0000 |-----------------------------| | xxboot の text + data (8KB) | 3F2000 |-----------------------------| | xxboot の bss (56KB) | 3FFFFF |-----------------------------| 4MB マシンの主記憶の上限 ブート動作: 1. まず、IOCS 等により、xxboot の先頭 1KB が、0x002400 に読み込まれ、 先頭アドレスが実行されます。 2. xxboot は、ブートデバイスを調べ、自分自身の全体 (8KB) を 0x3F0000- にロードし、実行します。 3. SHIFT キーが押されていれば 5. へ。 4. ルートディレクトリから "netbsd" という名前のファイルを探し、 0x100000- に読み込みます。"netbsd" が見つからなければ "netbsd.gz" も探します。読み込むことができれば 6. へ。 5. ルートディレクトリから、"netbsd" あるいは "vmunix" で始まる ファイルのリストを作成し、ユーザに選択させます。 ユーザが選んだファイルを 0x100000- に読み込みます。 6. 0x100000- に読み込んだファイルが gzip で圧縮されていれば、 そのファイルを一旦 ??????-0x3E7FFF に転送し、0x100000 が 先頭になるように展開しなおします。 7. 0x100000- に読み込んだファイルが NetBSD/m68k の NMAGIC の 実行ファイルでなければエラーとします。 8. 割り込みを禁止します。 IOCS が低位アドレスをワークとして使っているためです。 9. 読み込んだファイルの text, data, bss セグメントを 0x000000- に転送/作成します。 10. 読み込んだファイルにシンボルテーブルがあれば、 シンボルテーブル、ストリングテーブルを転送します。 11. レジスタ、引数を設定し、カーネルを実行します。 デバッグしたところ: シンボルテーブルが無いカーネルでもストリングテーブル (シンボル名のテーブル) を転送しようとしていたところを直した。 (電源投入直後だけフロッピーブートで 暴はる(京ことば) という 症状に悩まされていた。) TODO: o SCSI ディスクの先頭パーティションからしかブートできない のはなんとかしたいですね。で、どのパーティションから ブートしたのかどうやって調べるんでしょう?? o 1440KB フォーマットのフロッピーからもブートしたいんですが、 そうすると IOCS が使えないので、自前で読まなければならない ことになります。…で、8KB におさまりそうにないですねぇ。 o SASI とか、SASI ポート付きマシンを持っている人におまかせ しましょう :-)。あ、NetBSD のデバイスドライバもね。 ---written by Yasha (ITOH Yasufumi)