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 章以降をそのまま確認してみます。何かあれば追記の方向です。