Lions' 本読み (67)
psig() 手続きについて確認。手続き定義を再度引用しますが以下。
4055 n = u.u_ar0[R6] - 4; 4056 grow(n); 4057 suword(n+2, u.u_ar0[RPS]); 4058 suword(n, u.u_ar0[R7]); 4059 u.u_ar0[R6] = n; 4060 u.u_ar0[RPS] =& ~TBIT; 4061 u.u_ar0[R7] = p; 4062 return;
u.u_ar0[R6] はユーザーモードの SP になるのか。ユーザーモードのスタックを二つぶん伸ばして (4055-4056)、古い PC と PS を格納、ということなのか。であればユーザーモードなスタックは破綻はしないですね。
でも、スタックのてっぺんに PC と PS が居る、ということはシグナルハンドラの末端で rtt されるのだろうか。4060 で PS からトラップビットが off されてるのと何か関係があるのかなぁ。
追記
シグナルハンドラから戻る時に rtt する、が前提ならスタックに PS と PC が積んであってもそれが取り除かれることが保証されるんだろうけど、そう書かれるはずな根拠が今のところ無い。
トラップビットを自分で off にしてるのもアレ (4060)。
む
なんつーかきちんと把握できていないですね。call 手続きなんですが、前モードがカーネルモードの場合、以下な事をしてますね。
0798 bis $30000,PS
テキスト 342p の記述が以下。
PS は前モードがユーザーモードになるように変更する (0798)。
(Lions' Commentary on UNIX より引用)
あら? てことは clock でもシグナルの処理はするのかな。あ、違うか。trap な引数に push される PS はどちらもあり得ますね。なかなかにややこしい。
ちょっと
マニュアルをめくってみます。