v6 の main 手続き

確実に理解できてない。ので先に進めない。
具体的に何がか、というと main 手続きから呼ばれる newproc 手続きで savu で状態が保存された領域と、その後 swtch で savu で状態を保存する領域がイメージできてません。
どっちの _u も同じ場所なのではないか、と思ってました。あと、どこかに user 構造体と proc 構造体は相互参照、な記述があったんですが、proc 構造体側から参照してないのでは、と思っていたのですが、これも誤りだった模様。
一つづつ掘ってみます。

相互参照

user 構造体では u_procp という属性が

0424 int u_procp; /* user 構造体へのポインタ */

という形だったんですが、proc 構造体では user 構造体への参照が以下な記述になっています。

0371  int  p_addr; /* スワップ可能イメージへのアドレス */

このあたりを理解できてませんでした。

そして newproc 手続き

ざっくり手順的には

  • savu 手続きで現行の u.u_rsav にスタックと環境を保存
  • _u のサイズと先頭アドレスを確保
  • malloc 手続きで同じサイズの領域を確保
  • コピー元から複写

newproc では _u な領域を確保してコピィしてるんですね (他にも色々ヤッてますが)。swtch で savu して retu してるのは今の、を念押しする必要があるからかどうなのか。

fork が二つ戻る訳

あまり気にしてなかったんですが、そーゆーことだったのか的ソレですね。また、プロセス #0 が sleep に戻ってくるために swtch で savu して retu しているはず、と見てます。
ここまでイメージできたので、7 章以降をそのまま確認してみます。何かあれば追記の方向です。