UNIX 6th code reading - boot
初めての方はこちらを参照 http://d.hatena.ne.jp/takahirox/20101024/1287923014
boot loader
- UNIX起動の流れ(307P参照)
サイズの大きい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へジャンプ
終わりに
まとめているうちに、自分の理解が怪しいと感じる箇所などがありました。なので、誤った情報が含まれているかもしれません。見つかったらすぐに修正します。
また、後日フォローを追加するかもしれません。
次回はmainにうつります。6章はやはり重いです。