doc/note/boot.txt				 -*- text -*-

[BTRON/386 memo 3]

TITLE:	ブートメカニズム
AUTHOR: 内藤 隆一
DATE:	1 January 1994 (Last modify)
VER:	1.1



1. ブートの概要

  ブートは、いくつかの段階に分けて実行されます。


0) IPL

  IPL は、マシンの ROM に元々収められているプログラムです。
  IPL では、立ち上げデバイスの先頭ブロックにあるコードを読み取り、処理
を受けわたします。

1) first boot

  まず、立ち上げデバイスの先頭ブロック(ブートブロック)に入っているブー
トがマシンの IPL によって読み込まれ/実行されます。
  first boot は、コンソールに立ち上げメッセージを出力し、指定されたパー
ティションから second boot を読み込み実行します。このとき second boot 
のサイズは無条件に 64K bytes と見なします。
  first boot は、8086 モードで動作し、FD などの操作は、BIOS を介して行
います。
  なお、first boot は、as86 (Linux にあるアセンブラ)でかかれています。 


2) second boot

  second boot は、マシン(CPU)のモードを32 ビットに変更し、カーネルをロー
ドする。カーネルは、カーネル自身と最低限必要なマネージャがパックになっ
た形式で second boot の直後に入っています。
  second boot は、ファイルシステムの扱いかたを知っていますが、特に指定
しない限りファイルシステムは見に行きません。
  カーネルに処理を渡すときに、カーネルの動作環境も整える。具体的には、
仮想メモリ環境のセットアップ、CPUモードの変更、GDT/IDT の初期化などを
行います(つまりカーネルに制御が渡った時には、32ビットモードかつ仮想ペ
ージ機能つきで CPU が動いています)。

  second boot は、C によって記述されています(一部はアセンブラが入って
いる)。

  second boot が実行されたときのコンソールのメッセージを次に示します。
  (`;'の後は註釈です)
 
	Loading second boot...done	; first boot が出力します。
	Second BOOT for BTRON/386
	Version 1.0.0			; バージョン番号は異なっている
					; 場合があります。
	Waiting 10 second.		; 10秒間待ちます。このときに何
					; かキーを押すと対話モードに入
	Loading kernel...done		; ります。 
					; 後はカーネルに制御が渡ります


  second boot の対話モードでは、次のコマンドが使用できます。

  ls [parttion] [path]		pathで指定した実身のリンクを表示します
  boot [partition] [path]	pathで指定したカーネルをロードします
  reset				CPUをリセットします

  partition は、次のように指定します。

	FD:0		ドライブ A の FD
	SCSI0:0		SCSI ID 0 のパーティション 0

  path は、次のように指定します。

	/foo/bar	実身 foo の中の 実身 bar
	


2. ブートブロックの構造


  パーティションの先頭にあるブートブロックは、次の構造をしています。

  1) firstboot (1024 bytes)	0 ブロック - 1 ブロック
  2) second boot (64 K bytes)	2 ブロック - 129 ブロック
  3) kernel (MAX 1M bytes)	130 - 2177 ブロック

  !! 重要 !!
  現在の BTRON/386 のブートは1セクタ 512 バイトにしか対応していません
。もし、ブートを作り直した時にうまくローディングできなかった場合には、
フロッピィのフォーマットが1セクタ512バイトとなっているかを確認してみて
ください。



3. ファーストブート終了時のメモリマップ


ファーストブートがセカンドブートをロードした後のメモリマップは次のよう
になっています。

	  Addr			内容
	0x00000000	BIOSが使用する領域		4K
	0x00001000 --+	セカンドブートロード領域	60K
	    |        |	0x00001000 16bit code.
	    |	     |  0x00002000 32bit code.
            |        |
	0x0000FFFF --+
	0x00010000	GDTテーブル			2K
	    |
	0x00011FFF
	0x00012000	IDTテーブル			2K
	    |
	0x00013FFF



4. セカンドブート終了時のメモリマップ


セカンドブートがカーネルをロードした後のメモリマップは、次のようになっ
ています。

(1)仮想アドレス

	0x00000000
	     |
	     |
	0x7FFFFFFF

	0x80000000 --+	セカンドブートロード領域の残骸
	     |	     |	ページテーブルに使用する。
	     |       |  (0x80000000 - 0x800003FFF は、セカンドブートが
	     |       |	初期化する。
	0x8000FFFF --+
	0x80010000 	GDT テーブル				2K
	     |
	0x80011FFF
	0x80012000	IDTテーブル			2K
	     |
	0x80013FFF
	0x80020000 --+	カーネルが使用する領域		1G (Max)
	     |       |	ここにカーネルのイメージが
	     |       |  ロードされる。
	0xBFFFFFFF --+


(2)物理アドレス

	0x00000000 --+	セカンドブートロード領域の残骸
	     |	     |	ページテーブルに使用する。
	     |       |  (0x80000000 - 0x800003FFF は、セカンドブートが
	     |       |	初期化する。
	0x0000FFFF --+
	0x00010000 	GDT テーブル				2K
	     |
	0x00011FFF
	0x00012000	IDTテーブル			2K
	     |
	0x00013FFF
	0x00020000 --+	カーネルが使用する領域		1G (Max)
	     |       |	ここにカーネルのイメージが
	     |       |  ロードされる。
	0x3FFFFFFF --+

