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 の操作について確認しておく必要はあると思ってます。