UNIX 6th code reading - 割り込みとトラップの概要
初めての方はこちらを参照 http://d.hatena.ne.jp/takahirox/20101024/1287923014
はじめに
今回は9章です。割り込みとトラップについてです。
9章では割り込み・トラップの概要のみを扱っており、コードはほとんど出てきません。
割り込み・トラップ処理の流れ
- 実行中のプロセスのPS, PCを保存する
- PSとPCがベクタ位置と呼ばれるアドレスからロードされる
- 元のPS, PCはスタックに積まれる。スタックは新しいPSのモード(カーネルモード or ユーザーモード)で決まる
ベクタ位置が各割り込み・トラップ毎に決まっているため、それぞれに適した処理が行われる。
実行中のプロセスが割り込み・トラップ処理用プロセスに切り替わるというよりも、実行中のプロセスが一時的に割り込み・トラップ処理を行うと言った方が近いかもしれない。もしくは、実行中のproc, userの上で割り込み処理を行うと言えるかもしれない。
割り込み・トラップ処理中もproc, userは割り込まれたプロセスのまま。なので、割り込み・トラップ処理中にsleepを呼び出してはいけない。割り込まれたprocのp_statがSSLEEP or SWAITになる。つまり、割り込まれたプロセスが寝てしまう。同様にuserをいじるのもよくない。
優先度
プロセッサの優先度はPS[7:5]で設定される(2章参照)。0から7の8段階ある。各割り込みに設定された割り込み優先度がプロセッサの優先度よりも低い場合、その割り込みは抑制される(遅らせられる? 無視される?)。
各デバイスの割り込み優先度はハードウェア結線により設定される。(PDP11に割り込み優先度を設定するスイッチがある?)
プロセッサ優先度はspl命令によって変更される。また割り込みの復帰などPSの再ロードでも変更される。PS[7:5]でプロセッサ優先度が決まるため。
割り込み処理ルーチンは割り込み優先度と同じプロセッサ優先度で実行される。処理の途中に一時的にプロセッサ優先度を上げることもある。
割り込み優先度よりも低いプロセッサ優先度で割り込み処理を行うのはよくない。割り込み処理中に同じデバイスからの割り込みや、同じ種類の割り込みが連続して起こる可能性があるから。
この場合不都合が生じることがある。
たとえば、割り込み1→割り込み2と連続して起こった場合、処理が割り込み2→割り込み1という順番で実行されることがあるから(? 要確認)
割り込みとトラップの処理
割り込みとトラップはそれぞれcall, trapというアセンブリルーチンで処理される(らしい)。
callとtrapは、最初の処理は異なるものの、後半からは同じ処理になる(らしい)。
割り込み・トラップ処理完了時にはrtt命令でPS, PCを復帰させる(らしい)。
詳細は後の章で確認する予定。
その他メモ
- 優先度による割り込み抑制はハードウェアで行っている? それともOSで行っている? 後半の章まで読めばわかるかもしれない
- なぜトラップは即座に処理されるのに、割り込み優先度の低い割り込みは後回しにされることもあるのだろうか
- 割り込みとトラップを同じメカニズムで処理しているが、これによるデメリットなどはあるのだろうか
終わりに
9章はは割り込み・トラップに関する概要が説明されている章で、実際にコードを追うのは次の章からです。
コードを見ていないので今一つ理解が浅い部分があります。後の章を読んだ後にこのエントリを更新するかもしれません。
割り込み・トラップの設計次第でスループットは大きく変わってきます。また、バグの温床にもなりかねません。技術者として割り込み・トラップロジックを追うことはとても有意義なことだと考えています。