割り込み――実割り込み処理【後編】仮想マシンモニタ Xen 3.0解読室(1/3 ページ)

前回に引き続いて「割り込み」について解説していきます。ソフトウェア割り込み処理の解説や、少し趣を変えて、アセンブラのコードをのぞいてみることにします。

» 2007年12月26日 03時17分 公開
[高橋浩和(VA Linux Systems Japan),ITmedia]

仮想マシンモニタ Xen 3.0解読室:

割り込み――実割り込み処理【後編】

前回に引き続いて「割り込み」について解説していきます。ソフトウェア割り込み処理の解説や、少し趣を変えて、アセンブラのコードをのぞいてみることにします。

実装

do_IRQ関数

 では、Xen 3.0.2における割り込みハンドラの入り口の処理を見てみましょう(リスト1:右アイコンのリンク先)。正常シーケンスにおける主な処理は、

  1. 割り込み要因から、参照するirq_descテーブルのエントリを求める(A1、A2)
  2. ゲストOSへ転送すべき割り込みの場合、仮想割り込みに変換して転送する(A5)
  3. Xenが受け取る割り込みの場合、登録されたハンドラを呼び出す(A13)

のようになります。また、リソースに対する排他的アクセスを実現するため、次のように割り込みコントローラーやスピンロックを制御しています。

  • エラーチェック

 割り込みハンドラ実行中は、割り込みハンドラ実行中であることを宣言します*(A11、A15)。

  • 割り込みの制御

 割り込みハンドラは、割り込みを許可して呼び出します(A12、A14)。これによって、ハンドラ実行中でも新たな割り込みを受け付け可能になります。

  • 割り込みコントローラーの制御(割り込みの受け付け)

 割り込みコントローラーに割り込みを受け付けたことを通知(A4)。これによって、割り込みコントローラーは次の割り込みを発生させても良いことを知ります。

  • 割り込みコントローラーの制御(割り込み処理の終了)

 割り込みコントローラーに割り込み処理が終了したことを通知(A17)。これによって、割り込みコントローラーは同一種類の割り込みを発生させても良いことを知ります。

  • SMP対応(irq_descテーブルエントリのロック)

 irq_descテーブルの参照中に、ほかのCPUから参照中のエントリを変更されてしまわないよう、ロックして保護します(A3、A12、A17、A18)。

  • SMP対応(同一要因による割り込みの同時発生を抑止)

 SMP環境では、異なるCPUにおいて、同一要因の割り込みが同時に発生する可能性があります。そのためXenでは、同一要因の割り込みを複数CPUで同時に実行しないよう、同一要因の割り込みに対する処理は直列化しています。この処理は各ハンドラ内でも実行可能ですが、共通部で実行する方が容易なためです(図1)

図1 図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() 割り込みハンドラ登録を解除する
表1 ハードウェア割り込みハンドラ制御関数

このページで出てきた専門用語

割り込みハンドラ実行中であることを宣言します

現在は、割り込みハンドラから行えない処理を行っているか否かのエラーチェック程度にしか利用していない。


関連キーワード

CPU | Xen | ドメイン | Linux | カーネル | x86


       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ