Lions' 本読み (72)

まごろくさんからフォロー頂いてた

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

https://twitter.com/magoroku15/status/224160431370018817 より引用
という部分について確認してみます。

始点

sched 手続きの以下の部分。

2021 found1:
2022    spl0();
2023    rp->p_flag =& ~SLOAD;
2024    xswap(rp, 1, 0);
2025    goto loop;

xswap 手続きは引数で渡された proc 構造体が指すプロセスを swapout する手続きとのこと。ざっくりベースで、swapout する領域を確保して

4375    a = malloc(swapmap, (rp->p_size+7)/8);
4376    if(a == NULL)
4377            panic("out of swap space");

xccdec 手続きを呼び出して swap してます。

4378    xccdec(rp->p_textp);
4379    rp->p_flag =| SLOCK;
4380    if(swap(a, rp->p_addr, os, 0))

この後、rp->p_addr な領域は解放されてますが、そこはスルー。とは言え

  • xccdec で何をしているか
  • p_addr 属性で始まる p_size な大きさの領域が正確にどこからどこまでかを確認

な課題あり。

xccdec で何をしているか

ここがある意味このエントリの核心ですね。手続き定義を以下に引用。

4490 xccdec(xp)
4491 int *xp;
4492 {
4493    register *rp;
4494
4495    if((rp=xp)!=NULL && rp->x_ccount!=0)
4496            if(--rp->x_ccount == 0)
4497                    mfree(coremap, rp->x_size, rp->x_caddr);
4498 }

確かに swapout じゃなくていきなり解放してますね。
む、374p に_すでにディスクスワップ領域にコピーがあるので、テキストセグメントをコピーする必要はない (Lions' Commentary on UNIX より引用)_という記述がありますね。

あら?

たしかに sched の swapin する箇所な手続きの記述は以下になってますが

2031 found2:
2032    if((rp=p1->p_textp) != NULL) {
2033            if(rp->x_ccount == 0) {
2034                if(swap(rp->x_daddr, a, rp->x_size, B_READ))
2035                    goto swaper;

swapmap な領域が一杯になったらどうするんだろ。ちなみに、xfree という手続きもざっくり確認済みで ISVTX なビットが立ってたら swapmap な領域に居たまんま、になるようですね。逆に言えばそうでなければ xfree 手続きにおいて swapmap から削除される、という理解で良いのかどうか。

どちらにせよ

このあたりもうすぐ再確認な方向なので色々な切り口で掘削の方向ッス。
ちなみに明日も朝練なので控えておくと、xfree 手続きでは x_count 属性が 0 になったら解放、という事をしてる模様。x_count と x_ccount の操作について確認しておく必要はあると思ってます。