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