…
|
||
---|---|---|
.. | ||
gunzip | ||
all_bsr.sh | ||
bootufs.c | ||
bootufs.h | ||
chkfmt.s | ||
iocscall.h | ||
Makefile | ||
README.sdboot | ||
README.xxboot | ||
writefdboot | ||
xxboot.h | ||
xxboot.S |
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)