Skip to content

Instantly share code, notes, and snippets.

@lufia
Last active October 9, 2017 13:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lufia/2e5f461141e50f6109fff714ccb5e914 to your computer and use it in GitHub Desktop.
Save lufia/2e5f461141e50f6109fff714ccb5e914 to your computer and use it in GitHub Desktop.
Plan 9のディスクブートメモ

Plan 9のブート

  1. ディスクからブートする場合、diskload.cのtrydiskboot()を呼ぶ
  2. trybootfile()でBoot構造体のstateはINITKERNELにセットされる
  3. fs.cのfsboot()でブートを開始する(最終的にカーネルの実行に移るので戻らない)
  4. fsboot()found 9pcflop.gz のようなメッセージを出力する
  5. カーネルを8KBずつ読み込み、bootpass()に渡す(bufはnon-nil)
  6. 全て読み込み終わったらbootpass()のバッファを0で渡す
  7. stateがTRYBOOTまたはREADGZIPの場合、最終的にboot9()を呼び出す
  8. boot9()ではi386(I_MAGIC)とamd64(S_MAGIC)で分岐する
  9. 386の場合はentry: 0xXXXをプリントしてwarp9()
  10. amd64の場合はwarp64(XXX)をプリントしてwarp64()
  11. 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

という行を出力する。

stateの遷移

主にbootpass()で変化するが、他にも色々な場所で変わることがある。 カーネルをディスクから読む場合は以下のようになる。

  1. INITKERNEL
  2. READEXEC
  3. 状態分岐
    • I_MAGICまたはS_MAGICなら: READ9TEXT
    • ELFなら: ELFCLASS32またはELFCLASS64
    • GZIPヘッダがあれば: READGZIP(完了)
  4. READ9TEXTなら: READ9DATA
  5. READ9DATAなら: TRYBOOT (完了)

カーネルの読み込みが終わったら(上の遷移で完了となった場合)カーネルの実行に移る。 これも読み込みと同じbootpass()が行うが、引数のバッファが0なら実行だと判断する。

TRYBOOTなら読み込んだままboot9()で実行になる。 READGZIPの場合、圧縮されたまま完了するが、 bootpass()で実行する際にreadgzip()を使って展開され、 最終的にboot9()に渡る。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment