Lions' 本読み (53)

8 章のあたりを勝手きままに掘削の方向。
やはり微妙に_うっ_とひっかかるのは savu および retu と aretu ですね。再読してもやっぱ_うっ_って感じます。

savu から

これは $_u な領域の先頭 (r_rsav 属性な領域) に現在の実行プロセスの r6 なスタックポインタと r5 な環境ポインタを保存してます。戻りは return ではなく jmp を使うのはスタックフレームを変更したくない、という意図だと認識してます。
使用例は swtch 手続きで以下を。

2186    /*
2187     * 呼び出し側のスタックを覚えておく
2188     */
2189    savu(u.u_rsav);
2190    /*
2191     * スケジューラのスタックに切り替える
2192     */
2193    retu(proc[0].p_addr);

直下でスタックが retu 手続き呼び出しによって proc#0 に切り替わっているので保存しとかないとマズいですね。

retu とか aretu とか

色々確認してる中、KISA6 と _u の意味というか役割りがワケワカになりはじめてます。て KISA6 はレジスタを参照するためのアドレスなのか。

1448 KISA6 = 172354

上記でパニクってましたが 7 番目の PAR なレジスタにアクセスできるようメモリにマップされてるのですね。とは言え $_u についても例の参考図書にある通りテキストでも以下な記述がありますね。

これは名前 u で通用し、常にカーネルアドレス 0140000 である。すなわち、カーネルアドレス空間の 7 ページ目の先頭で見つけられることになっている。

Lions' Commentary on UNIX より引用
例の参考図書でも 0140000 な仮想アドレスを変換すると 7 番目の APR が、という記述がありますね。これが答えなのか。
で、本題なんですが、retu と aretu の違いについては _u が書き替わるかどうか、という理解で良いのかな。
retu では KISA6 を経由して _u の実体が替わった挙句に r5 と r6 が更新されますが、aretu では _u はそのままです。これは swap な実装に依存してるんですね。
p_flag 属性に SSWAP が立ってるプロセスオブジェクトは u.u_ssav に_真の戻り先とスタックを保存している_という言い方で良いのかどうか。
ちなみに SSWAP が立つタイミングは xswap の呼び出し後らしいのですが、このあたりは別途詳細確認した方が良さげ。今日はここで止めます。