NetBSD/sys/arch/x68k/stand/README.xxboot

220 lines
6.9 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)