Lions' 本読み (71)
昨晩の #geektable で確認できたことを控えておきます。
- estabur 手続きは user 構造体の par や pdr な属性に引数で渡された各セグメントの大きさに沿って_ユーザーセグメンテーションレジスタのプロトタイプ_を設定
- sureg 手続きは estabur でセットしたプロトタイプをレジスタに反映
最近 exec を云々してたなぁ、と言いつつ先程確認したところでは exec の中でテキスト、データ、スタックなセグメントの初期設定が完了した時点で estabur 手続きを呼び出して上記に列挙した処理を行なっています。
3152 estabur(u.u_tsize, u.u_dsize, u.u_ssize, u.u_sep);
ちなみにこの時点ではテキストセグメントには命令がコピーされていない可能性もあります。xalloc 手続きで 4451 から 4473 までの処理が行われる場合 (xp->x_ccount が 0 の場合とも言える?)、テキストセグメントもデータセグメントもスワップアウトされるように読めます。
しかも swtch でプロセスが切り替わりますね。
ちょっと脱線
上のソレがイメージできてれば swtch 手続きの以下の記述もよく分かりますね。
2228 retu(rp->p_addr); 2229 sureg();
目覚めるとき
以下なカンジなのかどうか。ハズしてる可能性もありますがメモってことで。
- sched でスワップイン
- ここでテキストセグメントに初めて命令列が書き込まれる
- 他のプロセスが sleep する時に swtch で切り替え
- swtch からの戻りで exec の 3131 から実行開始
- exec の残りを云々