exec 関連でフォロー頂きました

Lions' 本読み (71) に関してまごろくさんからいくつかフォロー頂きました。

テキストはReadOnlyなので、swapoutせずに捨てます。必要ならa.outのテキストを読み込めばよいから。なのでtext構造はinodeを保持しています。

https://twitter.com/magoroku15/status/224160431370018817

確かに変更はされないですね。ちなみに struct text な配列の定義が以下な部分。

4306 struct text
4307 {
4308  int   x_daddr;  /* セグメントのディスクアドレス */
4309  int   x_caddr;  /* ロードされている場合コアアドレス */
4310  int   x_size;   /* サイズ (64バイト単位) */
4311  int   *x_iptr;  /* プロトタイプのiノード */
4312  char  x_count;  /* 参照カウント */
4313  char  x_ccount; /* ロードされている参照数 */
4314 } text[NTEXT];

つうことは swapout されるのは最初の一発のみ (言い方微妙ですね) ということなのか。そしてこの struct text に関するまごろくさんフォローが以下です。

xallocのが獲得するtext構造の話。v6だとこのtext構造が多分一番難解でLions本の記述はあっさりなんです、ファイルシステム、メモリ管理、プロセス管理に跨ってて、sticky bitも絡んで普通の空間とはちと違うという話です。

https://twitter.com/magoroku15/status/224308414313013248 より引用
この tweet たちに関連して、ということなのだろうと思ってますが、例の参考書籍の copyright をお持ちの @superhoge さんも以下な tweet を出力なさってます。以下に列挙させて頂きます。

ちょうど似たようなあたりについて考えていた。プロセス管理とかファイルシステムとか、基本的には独立したモジュール(機能?)として捉えられるんだけれど、どうしてもそれをまたがるやつがいて、それの理解、そして解説は非常に難しい。

https://twitter.com/superhoge/status/224329019003383808 より引用

exec( )は序盤の壁の一つですよ、ほんと

https://twitter.com/superhoge/status/224329465633841152 より引用

プロセスについては当然把握する必要があるとして、プログラムデータを呼び出すからファイルシステムの理解が必要だし、a.outの知識も必要。テキストセグメント割り当てやデータセグメント(スタック+ヒープ)初期化のためにプロセスのメモリ空間についても知らないといけない

https://twitter.com/superhoge/status/224330346550931458 より引用

さらにexecシステムコールに対するユーザからの引数の渡し方や、実行するプログラムに対してどのように引数を渡すかなども理解しないといけない。まぁ、これらはUPMに書いてあるけど

https://twitter.com/superhoge/status/224331043690385408 より引用
一部、訂正が入ってる tweet もありましたがそのままアレしてます。スミマセン。

ということで

exec については 3166 以降がスルーになってるのでそこを確認入れるかどうか。いずれにせよこのペースと保ってぼちぼちと読み進めていく方向です。
ともあれ、先日実施された #geektable での v6 本読みは色々な事が確認できた、という意味でもとても良かったので、来月の開催を楽しみにしています。

昨日エントリを見返して

3152 な estabur 手続き呼び出しの時点では sched でテキストセグメントにスワップ領域に退避してた命令列はロード済みですね。
なので

ちなみにこの時点ではテキストセグメントには命令がコピーされていない可能性もあります。

はダウトなのか。つうか、exec でプログラムが置き換えられて実行開始されるのではなかったか、と思ったら以下な記述がありました。

3188    u.u_ar0[R7] = 0;

PC が 0 で初期化されてます。これが実行開始、な設定という理解で良いのかな。良いのだろうな。