SSブログ

UNIXのカーネルブートローダーを読む

PDP-11でのブートプロセスは、
  (1) ROMのブートストラップローダ
  (2) ディスクのブートセクターに格納されているカーネルブートローダ
  (3) UNIXカーネル

の順に実行される。(1)が(2)をメモリにロードして、(2)が(3)をメモリにロードする。
で、下記サイト

に置いてあるUNIX V6のバイナリの、unix0_v6_rk.dsk のブートセクターに格納されてる
カーネルブートローダのソースは、mdec/fsboot.s である。

これの中身がアセンブラなので、少々流れがつかみづらい。
結構トリッキーなこともやっている。
(呼び出し先のサブルーチンが、実行結果によってスタックに積まれた戻りアドレスを直接変更しちゃってるとか。)
PDP-11の全盛期は、アセンブラプログラミングが当たり前なので、こういうのって当たり前なテクニックだったのかもしれん。

まあ、それはともかく、fsbootでは、以下のことをやっている。

(1) 自分自身のコードを退避している
 Kernelバイナリを0番地にコピーするので、自分自身を24*2048-512番地に退避している。
これメモリサイズが48KBを想定しているてことかな。
(2) メモリをクリアしている。(0番地〜上記24*2048-512の手前まで)
(3) @文字を出力して、文字入力を受け付ける。(文字はカーネルのバイナリファイル名で、通常はunix)
(4) rootディレクトリが格納されているinode 1番が格納されているディスクブロック(512バイト)
     を内部バッファにコピーし、その中からinodeの情報も抽出して、別のバッファにコピーしている
(5) inode情報からブロックデータをバッファにコピーし、それはフォルダーの構造になっているので
  そこから入力されたバイナリファイル名と一致するinodeを探す
(6) 上記一致したinodeのブロックデータを、0番地にコピーして、0番地に飛ぶ

かな。
コードの最後は読み切れてないが、UNIXのファイル構造にしたがって、ディスクアクセスしつつ
内部バッファにデータをためて、ファイル名検索して、という感じだ。

ファイルシステムの構造が分かれば、アセンブラで実装しようがCで実装しようがあまり関係ないが、
カーネルブートローダー自身は512バイトに収まる必要がある。


以上。


nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。