Lions' 本読み (65)

今朝、早めに着いたので色々確認してみたのですが、絶不調。以下なメモが残っている。

  • proc 構造体の p_sig 属性見てみるにシグナルの実行契機は psig() 手続き
  • trap1 で ssav したナニを復帰させているのは sleep 手続き

ええと、システムコールハンドラ内でシグナルが発生すると、という件ですが、psig 手続きが呼び出されるのは clock() 手続きと trap() 手続きのみ、な模様。シグナルの発生、というのは psig() の呼び出し、という意味ではないのかな。
例えばシステムコールハンドラ実行中に trap が発生したとして、trap 手続き末端で

2820 out:
2821    if(issig())
2822            psig();

みたいなことしてて、issig の中とかでは user 構造体を見てるんですが、割り込み (というかトラップ) 発生時ってプロセス固有データ領域はそのまんまなのかな。
しかもこのケイスってユーザモードからシステムコール呼び出しで trap してさらに別な理由で trap した、という状態なのか。
を、例の参考書籍に以下な記述があるな。

割り込み・トラップ処理中も proc、user は割り込まれたプロセスのまま。なので、割り込み・トラップ処理中に sleep を呼び出してはいけない。

(例の参考書籍から引用)
そりゃそうでしょ、と言われるとそれまでなんですが、ご容赦頂ければ幸いです。

そりゃ良いのですが

どうなるんだ? 今多重で trap してる状況として

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

で、この trap から抜ける時にシグナルハンドラに制御が移るのか。なのでシステムコールハンドラな trap には戻らないのか。
あら、何かがおかしいな。ここから trap 手続きの trap1 な呼び出しの次の命令に戻るには u.u_qsav で aretu するしかないんですが、それは sleep 手続きにしか記述がありません。
つうか、適当なシグナルハンドラを思いつかないあたり終わってるな。困った。
ちょっとこのあたり、もうすこし継続して掘削してみたいと思います。そろそろデバッガの登場なのかどうなのか。
微妙な部分をまとめておくと

  • システムコールハンドラ内でシグナル発生した場合
    • 発生、というかシグナルハンドラ呼び出しの発生?
  • 戻り先は u_qsav に保存されている trap1 の呼び出し元に戻る

というあたり。

ちなみに

システムコールに clock が割り込んだ場合は前モードはカーネルモードになるはずなので clock の中の 1 秒に 1 回なソレで、という部分はスルーのはず。

追記

想定してる状態が微妙なのかな。コメントでは_たとえば、タイプライタから読み出す_システムコールが云々とか書いてありますね。

psignal な記述を確認した所、3975 の記述が以下。

プロセスが非カーネルイベントを待っているならば、すなわち、正の優先度で sleep (2066) を呼び出したならば、そのプロセスを再び実行状態にする。

(Lions' Commentary on UNIX より引用)
あ、これはシグナル送ったプロセスが、という話か。
そもそもシグナルハンドラの実行が上記の通りだったとして、どこに戻るのか、という問題もありますね。
ちょっと頭を冷やして確認入れた方が良さげ。