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 の残りを云々