boot関数に処理が移ると、やっと見慣れたC言語のコードが出て来ます :-) boot関数内では、ハードベッタリのコードが多くハードの仕様書がなかなか探し当てることが出来ないので苦労したりします。(つうか良くわからん)
boot関数の主な処理は、現在動作しているコンピュータのハードウエアの検出や設定を行ます。それが終了するとboot optionの処理を行い、kernelをロードしkernel側に処理を移行します。
この処理では下記の関数を使用します。
Boot バージョンをディスプレイに表示します。
Using drive 0 , partition 4 .
Loading........
probing:pc0 com1 com2 apm pci mem[639K 253M a20=on]
disk:fd0 hd0+
>OpenBSD/i386 BOOT 3.01
cmd_state構造体の変数cmdに値をセットします。
この変数には、kernelロード時に必要な情報が格納され、それぞれの変数は次の意味を持ちます。
struct cmd_state {
char bootdev[16];
char image[MAXPATHLEN - 16];
int boothowto;
char *conf;
void *addr;
int timeout;
char path[MAXPATHLEN];
const struct cmd_table *cmd;
int argc;
char *argv[8];
};
- cmd.bootdevに起動デバイス名をセット
-
devboot関数をcallして起動デバイス名を作成しセット。この関数で、以下の文字列がcmd.bootdevにセットされます。
HDDの場合 : "/dev/rhdxa" xはdevice no (例えば 0x81の場合"/dev/rhd1a")
FDDの場合 : "/dev/rfdxa" xはdevice no (例えば 0x00の場合"/dev/rfd0a")
CDの場合 : "/dev/cd0a" device noが0x100の時
- kernelのファイル名をセット
KERNELで定義されたファイル名をcmd.imageにセットします。
read_conf関数をcallします。read_conf関数ではcmd.confで指定されたboot.conf
に書かれているオプションを実行します。
cmd.pathにKernel imageのpathをセット。
cmd.path = cmd.bootdev + ':' + cmd.image = "/dev/rhd1a:/kernel"
pathをセットする前に、bootpromptの値を見ていますがbootpromptは0にセットしている所が無いので常に1なのか?
boot.confが存在しなかった場合や読込めなかった場合は、interactive command lineに移行して、オペレータからの入力待になります。
- 入力プロンプトの表示
-
入力プロンプトの表示を行う。
Using drive 0 , partition 4 .
Loading........
probing:pc0 com1 com2 apm pci mem[639K 253M a20=on]
disk:fd0 hd0+
>>OpenBSD/i386 BOOT 3.01
boot>_
- 入力コマンドの実行
-
getcmd関数をcallして、コマンドの入力処理(readline関数)を行ない、コマンドを実行(docmd関数)する。実行可能なコマンドはcmd_table配列とcmd_machine配列に定義される。
このwhile ループから抜出す条件は、
- boot command実行 Xboot関数が呼ばれ1が戻値になる。
- return key押下 および 入力タイムアウト Xnop関数が呼ばれ1が戻値になる。(但しKernel load リトライ時には無効になる)
booting メッセージの表示を行う。
Using drive 0 , partition 4 ;
Loading........
probing:pc0 com1 com2 apm pci mem[639K 253M a20=on]
disk:fd0 hd0+
>>OpenBSD/i386 BOOT 3.01
boot>
booting /dev/rhd0a:/kernel:
最初にmarks配列にイメージのロードアドレスをセットし、loadfile関数をcallします。loadfile関数では、Kernel image をloadしてメモリ上に展開し、配列marksには次の値を返します。
#define LOAD_ALL 0x003f
cmd.path = "/dev/rhd0a:/bsd";
marks[MARK_START] = DEFAULT_KERNEL_ADDRESS;
marks[MARK_ENTRY];
marks[MARK_NSYM];
marks[MARK_SYM];
marks[MARK_END];
marks[MARK_MAX];
loadfile(cmd.path, marks, LOAD_ALL);
そしてloadが成功した場合、whileループから抜出す。
Kernelのloadが成功したならば、run_loadfile関数をcallする。