Lions' 本読み (64)

_間接_システムコールの具体的な例についてはとりあえずスルー。現時点での理解としては、trap 手続きの引数な pc (古い PC) が指してる位置に番地が格納されてて

2756                    a = fuiword(pc);

a が指す番地に命令が格納されている模様。

2758                    i = fuword(a);

ちなみに pdp11/40 はその範疇外なんですが、pc を用いて生成されるアドレスが i 空間、それ以外が d 空間として扱われるシステムの場合、fuiword と fuword の使い分けが重要、という記述がテキストにありますね。

システムコール内で発生したシグナル

例の参考書籍の 52p に記載があります。ちょっと直感的に意図を図りかねているのですが、u.u_qsav については f の呼び出し前に savu されて

2845    u.u_intflg = 1;
2846    savu(u.u_qsav);
2847    (*f)();
2848    u.u_intflg = 0;

sleep の末端で aretu されてます。

2105 psig:
2106    aretu(u.u_qsav);
2107 }

この psig ラベルに飛んでくるのは、シグナル処理が行なわれる優先度で、issig() が真を戻す場合となります。むむ、sleep ですか。ここも理解が微妙。
u_intflg も xref で確認してみた方が良いのかな。ってイキナリ出てきたのが以下。

2771            trap1(callp->call);
2772            if(u.u_intflg)
2773                    u.u_error = EINTR;

あらら、0 初期化されずに戻ったら errno 設定しとりますな (errno じゃないか)。そうかシグナル方面あまりきちんと確認してないんですが、上記の u.u_intflg が 0 以外の場合というのは sleep から aretu して戻ったケイス、ということになるのか。
ちょっとシステムコールを飛ばして 13 章読んだ方が良いような気がしてきました。とりあえず、trap から戻りで再設定されるレジスタを psig で設定してることを確認。

4059            u.u_ar0[R6] = n;
4060            u.u_ar0[RPS] =& ~TBIT;
4061            u.u_ar0[R7] = p;

これ、trap から戻りで再設定という前提を鑑みるにシステムコールハンドラ中で云々であれば、先にシグナルハンドラを実行して、ということなのか。しかも

この手続きからリターンすると、前に割り込まれた手続きが再開される。

(Lions' Commentary on UNIX より引用)
これは sleep からの復帰を指しているのだろうな。復帰先は trap 手続きのはず。どちらにしても EINTR を戻す形になるのかどうなのか。

このあたり

明確にイメージできていないのでもう少しねぶりマワす必要ありそげ。

もう少し

例の参考書籍でシステムコールの詳細について調査した結果な記述があります。お陰さまで微妙な部分を簡単に理解して先に進むことができます。感謝します。