UNIX 6th code reading - main

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

はじめに

今回も6章の続きです。startからmainへジャンプした後の話です。
ここからCで書かれた領域に入っていきます。

今回の範囲は特に難しい箇所もなかったので、本当に単なるメモ状態です。

メモ

main(1550) - newproc呼び出し(1627)まで
  • 1560 - 1570 : 物理メモリの、process#0用の領域の後ろから、メモリ最後端までをゼロクリア
    • 1560 : *ka6はPAR7を指す。それにUSIZE足すので、process#0の領域の後ろを指す。
  • 1589 - 1593 : process#0の初期設定
    • 1589 : proc構造体のp_addrには、そのプロセスに対応したプロセス固有領域の先頭アドレスを指定する。*ka6で指定しているので、p_addrには仮想アドレスではなくPARの値を設定するようだ(?)
  • 1599 - 1600 : *ka6はPAR7を指すので、ka6[1]はPAR8を指す(はず)。io用のセグメントを設定する。UISA->r[7], UISD->r[7]は、ユーザー用のAPR8?
  • 1613 - 1619 : iノードの初期設定。iノードについては後半の章で改めて確認する予定
  • 1627 : newprocを呼び出して、process#1を生成する
newproc(1826) - mainのsched呼び出し(1637)
  • 1841 - 1845 : 新しいプロセス用に一意のidを取得する
    • 1842 : 不等号が'<'なのは、mpidがunsignedではないため(そもそもunsignedが存在しない)。そのためmpidをインクリメントしていくと、最上位bitが立ち、負の値と判定されてしまう
  • 1846 - 1853 : proc構造体の配列から、空いているエントリを探す
    • 1849 : idの重複がないかチェック。id重複をチェックするために、必ずNPROC(配列の最後尾)まで探査しないといけない。NPROCが小さいので問題ない?
    • 1852 : 空いているエントリがないとpanic
  • 1859 - 1869 : 新しいプロセスの初期設定。大半が、現在のプロセスのコピーが設定される。
  • 1876 - 1883 : 必要に応じてエントリの参照を二重にする。各プロセスが使用している(見ている)ファイルに関する制御? 意味と意図がよく理解できていないのだが、後半の章まで読めばこの部分が理解できる?
  • 1889 : savuを呼び出して、現在のプロセス(process#0)のr5, r6を保存しておく
  • 1890 - 1917 : 新しいプロセス(process#1)用のプロセス固有データ領域をコアメモリから取得。空きがなければ現在のプロセスをスワップさせる。スワップに関しては、後の章で出てくるので、とりあえず置いておく
  • 1627 : newprocから戻ってくる。return(0)なので、if文の中は実行しない
  • 1637 : schedを呼び出す

終わりに

一旦ここで切ります。次回はschedからicode(ブートストラッププログラム)実行まで。ようやく6章が終わります。
今回のエントリで端折ったsavuの解説、そしてセットでretuについての説明も書く予定です。
整理するために各プロセスのシーケンス図とかも描く予定で、重そうな予感……