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