- ディスクからブートする場合、diskload.cの
trydiskboot()
を呼ぶ trybootfile()
でBoot構造体のstateはINITKERNELにセットされる- fs.cの
fsboot()
でブートを開始する(最終的にカーネルの実行に移るので戻らない) fsboot()
は found 9pcflop.gz のようなメッセージを出力する- カーネルを8KBずつ読み込み、
bootpass()
に渡す(bufはnon-nil) - 全て読み込み終わったら
bootpass()
のバッファを0で渡す - stateがTRYBOOTまたはREADGZIPの場合、最終的に
boot9()
を呼び出す boot9()
ではi386(I_MAGIC)とamd64(S_MAGIC)で分岐する- 386の場合はentry: 0xXXXをプリントして
warp9()
- amd64の場合はwarp64(XXX)をプリントして
warp64()
warp9()
またはwarp64()
でカーネルへ処理が移る
READ9TEXTの場合、ディスクからの読み込みが終わったら以下のログが出力される
+(b->hdr->data)
READ9DATAの場合はこれ。
+(b->hdr->bss)=(b->hdr->text+b->hdr->data+bss)
READGZIPならこれ。 この出力があれば、カーネルはロードされてgzip展開も終わっているはず。
.gz......(b->wp-b->bp) => (b->hdr->text)+(b->hdr->data)+(b->hdr->bss)=(text+data+bss)
boot9()
では
entry: 0xXXXX
という行を出力する。
主にbootpass()
で変化するが、他にも色々な場所で変わることがある。
カーネルをディスクから読む場合は以下のようになる。
- INITKERNEL
- READEXEC
- 状態分岐
- I_MAGICまたはS_MAGICなら: READ9TEXT
- ELFなら: ELFCLASS32またはELFCLASS64
- GZIPヘッダがあれば: READGZIP(完了)
- READ9TEXTなら: READ9DATA
- READ9DATAなら: TRYBOOT (完了)
カーネルの読み込みが終わったら(上の遷移で完了となった場合)カーネルの実行に移る。
これも読み込みと同じbootpass()
が行うが、引数のバッファが0なら実行だと判断する。
TRYBOOTなら読み込んだままboot9()
で実行になる。
READGZIPの場合、圧縮されたまま完了するが、
bootpass()
で実行する際にreadgzip()
を使って展開され、
最終的にboot9()
に渡る。