220 lines
6.9 KiB
Plaintext
220 lines
6.9 KiB
Plaintext
|
||
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)
|