NetBSD/sys/arch/x68k/stand
..
gunzip
Makefile
README.sdboot
README.xxboot
all_bsr.sh
bootufs.c
bootufs.h
chkfmt.s
iocscall.h
writefdboot
xxboot.S
xxboot.h

README.xxboot

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)