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 を戻す形になるのかどうなのか。
このあたり
明確にイメージできていないのでもう少しねぶりマワす必要ありそげ。
もう少し
例の参考書籍でシステムコールの詳細について調査した結果な記述があります。お陰さまで微妙な部分を簡単に理解して先に進むことができます。感謝します。