Lions' 本読み (66)

ええと、システムコールハンドラ処理中にシグナルが発生して云々、という微妙なケースをいきなり掘るのは無理ということで一旦スルーした上でシグナルの 13 章を確認してみることにします。その後システムコールのあたりを確認の方向ということで。

とりあえず

確認ができている事としては

  • シグナルハンドラを実行する psig() 手続きは trap() 手続き及び clock() 手続きから呼び出される

ということで、トラップ発生時またはクロック割り込み時にシグナルハンドラが実行される、ということが言えるのかな。
しかも即座に呼び出される、という形ではなくて

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;

みたく割り込み (ないしトラップ) 時のカーネルスタックなナニを弄って云々、という事をしてます。つうかこれ、どうなるんでしょ。
362p の記述によれば

ユーザーモードへ戻ったとき、指定した手続きの先頭から実行が再開する。この手続きからリターンすると、前に割り込まれた手続きが再開される。

(Lions' Commentary on UNIX より引用)
ここからリターンしたらどこに戻るか、が問題なんですが、4055-4058 なあたりが謎だな。_ユーザーモードスタック_と記述されている。でも、u.u_ar0 は基本的にカーネルスタックを指してるはずなんですがこれは一体どーゆー意味だ。
ただ、4060-4062 な記述でトラップないし割り込みから抜けた時点で PC が p になり、SP が n になる、のか。あら、4055-4058 はユーザーモードスタックのてっぺんが

+---------------------------+
| セイブされた u.u_ar0[RPS] |
+---------------------------+
| セイブされた u.u_arp[R7]  | <- sp
+---------------------------+

という形になるのかどうか。で、ユーザーモードに割り込みから戻ったら p を云々して戻り番地がスタックのてっぺんにある、という事で良い?
これが本来のトラップないし割り込みからの復帰な、ナニ、ということか。あ、引用した文章ですが、こーゆー意味だな。

ユーザーモードへ戻ったとき、指定した手続きの先頭から実行が再開する。この_指定した_手続きからリターンすると、前に割り込まれた手続きが再開される。


えー、なんかでもこんなんでいいの的違和感があるな。

これはおそらく

正解ではないと思うのでメモを取りつつ掘削続行します。