UNIX 6th code reading - boot

初めての方はこちらを参照 http://d.hatena.ne.jp/takahirox/20101024/1287923014

はじめに

今回は6章の続きです。
カーネルAPRの設定や、それに対応する物理メモリ空間の話などです。

boot loader

  • UNIX起動の流れ(307P参照)
    1. プロセッサ中のROMのブートストラッププログラムが起動。システムディスクのブロック#0からより大きなローダープログラムをロードする
    2. より大きなローダーが、/unixと呼ばれるファイルを探しだし、メモリの低位部にロード。UNIXが起動される

サイズの大きいUNIXファイルはプロセッサ中のROM内に持っておくことができない。なので、このように徐々に大きいファイルを読みだすような構成になっている(はず)。

ちなみに、システムディスクとはこのようなものだと思われる?

カーネルAPRの状態 & カーネルが使用する物理メモリ空間

その後、startでカーネルAPRの初期設定などが行われます(612行目-)。
カーネルAPRは以下のように設定されます。APR No以外の数値は全て8進数です。
4列目はAPRの設定に対応する物理メモリの領域です。

APR No PAR PDR physical memory note
1 0 077406 0-017777
2 0200 077406 020000-037777
3 0400 077406 040000-057777
4 0600 077406 060000-077777
5 01000 077406 0100000-0117777
6 01200 077406 0120000-0137777
7 01400(?) 007406 0140000-0143000(?) for process#0
8 $IO(=7600) 077406 0760000-0777777 for I/O
APR7について

APR7は実行中のprocessを指すように設定されます。
ここではprocess#0用に値が設定されます。
Lions本の通り、PAR7は$_endで決まります。$_endの値はわからなかったのですが、01400が設定されるのでは、と推測しています。PDP11 emu + unix v6などで、今度$_endの値を調べてみようと思っています。

APR8について

APR8はI/Oのためのページで、物理メモリの上位4Kワードに対応します。

PDRについて

APR7以外のPDRには077406という値がセットされます。これは以下を示します。

  • 128block(最大block数)
  • 読み書きOK

APR7のPDRの007406は以下を示します。

  • 16block(=USIZE)
  • 読み書きOK

その他メモ

  • 646 : SP(stack pointer)を$_u(140000)に設定
  • 647 : SR0をインクリメントすることで、メモリ管理を有効にする。ここから仮想アドレス→物理アドレスマッピングが有効になる?
  • 651-655 : bss($_edata 〜 $_end)をクリア
  • 659-663 : ユーザーブロック(たぶんproces#0のプロセス固有データ領域のこと, ($_u 〜 $_u + USIZE * 64)をクリア
  • 668 : PSの前モード(13, 12bit目)をユーザーモード(11)に設定。mtpi, mfpi命令を有効にするため
    • mtpi, mfpiは現モードと前モード間でデータを転送する命令らしい(?)
  • 669 : jsrでmainへジャンプ
$_u(140000)について

7章にて「$_u(140000)がカーネルアドレス空間の7ページ目の先頭で見つけられることになっている」と書いてありますが、その理屈は以下です。

前回のエントリで使用した絵です。
仮想アドレスの先頭3bit, [15:13]でAPRを選択します。
そして140000の[15:13]は110(10進数で6)、つまり0から数えて7番目のAPRが選択されます。
また、ページ中のオフセットを示す[12:0]は0なので、7番目のAPRに対応した空間の先頭を指すわけです。

終わりに

まとめているうちに、自分の理解が怪しいと感じる箇所などがありました。なので、誤った情報が含まれているかもしれません。見つかったらすぐに修正します。

また、後日フォローを追加するかもしれません。

次回はmainにうつります。6章はやはり重いです。