Lions' 本読み (38)
なんとなくまごろくさんのスライドを眺めているに User モードな APR を云々するナニをスルーしてるな、という事に気づく。どうやらこのあたりの面倒を見ているのが sureg 手続きな模様。
で、コメントによればどうもここで取り出し元になってる
- u.u_uisa
- u.u_uisd
は estabur で設定されている模様。
別途 7 章確認必要ですね。どっちを先にヤるべきか迷うな。
あ、でも昨晩エントリな課題として
- retu 手続きと sureg 手続きの関連
が挙げてありますね。これは
- retu で渡した user 構造体を含むカーネルスタックに切り替え
- sureg で User モードな APR の再設定を行なう
という事で基本的に retu したら sureg すべきなはずなんですがどうなんだろう。ということで確認してみましたが呼び出しは三個所な模様。
一つ目は swtch 手続きでのプロセスのサーチ時にスタックを切り替える部分。
2190 /* 2191 * スケジューラのスタックに切り替える 2192 */ 2193 retu(proc[0].p_addr);
ここでは sureg の呼び出しはスルーです。二つ目は実行可能なプロセスを見つけた後の以下な記述。
2225 /* 新しいプロセスのスタックに切り替え、 2226 * そのセグメンテーションレジスタを設定する。 2227 */ 2228 retu(rp->p_addr); 2229 sureg();
三つ目は expand 手続きで以下。
2294 retu(p->p_addr); 2295 sureg(); 2296 }
swtch の中でプロセス探す処理以外はデフォで retu と sureg はセットですね。成程。
とりあえず
7 章に戻ります。昨日エントリの以下は課題として残存。
- savu(u.u_ssav) の目的とか副作用とかを確認
- expand 手続きと estabur 手続きの関連
- 381p の aretu と u.u_ssav に関する調査について確認
やっぱ一旦 15 章あたりまで読んで再読すると色々理解できてる (?) ので面白い。とは言え今日は (も?) かなりへろへろなので estabur および sureg の確認は別途ってことで。
あと newproc も確認したいな。そういえば明日は週末だなw