前回に引き続いて「割り込み」について解説していきます。ソフトウェア割り込み処理の解説や、少し趣を変えて、アセンブラのコードをのぞいてみることにします。
仮想マシンモニタ Xen 3.0解読室:
割り込み――実割り込み処理【後編】
前回に引き続いて「割り込み」について解説していきます。ソフトウェア割り込み処理の解説や、少し趣を変えて、アセンブラのコードをのぞいてみることにします。
では、Xen 3.0.2における割り込みハンドラの入り口の処理を見てみましょう(リスト1:右アイコンのリンク先)。正常シーケンスにおける主な処理は、
のようになります。また、リソースに対する排他的アクセスを実現するため、次のように割り込みコントローラーやスピンロックを制御しています。
割り込みハンドラ実行中は、割り込みハンドラ実行中であることを宣言します*(A11、A15)。
割り込みハンドラは、割り込みを許可して呼び出します(A12、A14)。これによって、ハンドラ実行中でも新たな割り込みを受け付け可能になります。
割り込みコントローラーに割り込みを受け付けたことを通知(A4)。これによって、割り込みコントローラーは次の割り込みを発生させても良いことを知ります。
割り込みコントローラーに割り込み処理が終了したことを通知(A17)。これによって、割り込みコントローラーは同一種類の割り込みを発生させても良いことを知ります。
irq_descテーブルの参照中に、ほかのCPUから参照中のエントリを変更されてしまわないよう、ロックして保護します(A3、A12、A17、A18)。
SMP環境では、異なるCPUにおいて、同一要因の割り込みが同時に発生する可能性があります。そのためXenでは、同一要因の割り込みを複数CPUで同時に実行しないよう、同一要因の割り込みに対する処理は直列化しています。この処理は各ハンドラ内でも実行可能ですが、共通部で実行する方が容易なためです(図1)。
割り込みハンドラ実行中は、IRQ_INPROGRESSフラグを立てますが(A8、A16)、もしすでにIRQ_INPROGRESSフラグが立っている場合は、ほかのCPUで実行中ということなので、ハンドラを実行せずに終了します(A7)。またこの場合、ほかのCPUに同種の割り込みが発生したことを、現在ハンドラを実行中のCPUに通知するため、IRQ_PENDINGフラグを立てておきます(A6)。
ハンドラを実行しているCPUは、IRQ_PENDINGフラグが立っている間(A9、A10)、処理対象が残っているとし、ハンドラを呼び出し続けます(表1)。
関数名 | 説明 |
---|---|
do_IRQ() | 外部デバイスからの割り込みを受け付け、割り込み要因に対応する割り込みハンドラを呼び出す |
__do_IRQ_guest() | 割り込みを仮想割り込みに変換し、ドメインに転送する |
setup_irq() | 割り込みに対応する割り込みハンドラを登録する |
free_irq() | 割り込みハンドラ登録を解除する |
現在は、割り込みハンドラから行えない処理を行っているか否かのエラーチェック程度にしか利用していない。
Copyright © ITmedia, Inc. All Rights Reserved.