Go to main content
Oracle® Solaris 11.3 デバイスドライバの記述

印刷ビューの終了

更新: 2016 年 11 月
 
 

デバイス割り込み

入出力バスは、2 つの一般的な方法、つまりベクター方式ポーリング方式で割り込みを実装します。一般に、どちらの方法でも、バス割り込みの優先順位レベルが指定されます。ベクター方式のデバイスでは、割り込みベクターも指定されます。ポーリング方式のデバイスでは、割り込みベクターは指定されません。

変化を続けるバス技術を取り入れるため、Oracle Solaris OS は拡張され、新しいタイプの割り込みと、長年使用されてきた従来の割り込みの両方に対応するようになりました。特に、Solaris OS は次の 3 つのタイプの割り込みを認識するようになりました。

  • レガシー割り込み - レガシー割り込みまたは固定割り込みとは、古いバス技術を使用する割り込みのことです。この技術では、割り込みのシグナルが「帯域外」で接続された、つまりバスのメインラインとは別個に接続された 1 つ以上の外部ピンを使って送信されます。PCI Express などの新しいバス技術では、帯域内メカニズムによってレガシー割り込みをエミュレートすることで、ソフトウェアの互換性が維持されます。このエミュレートされた割り込みは、ホスト OS によってレガシー割り込みとして扱われます。

  • メッセージシグナル割り込み - メッセージシグナル割り込み (MSI) は、ピンを使用しない帯域内メッセージであり、ホストブリッジ内のアドレスをターゲットにすることができます。ホストブリッジの詳細については、PCI ローカルバスを参照してください。MSI では、割り込みメッセージとともにデータを送信できます。各 MSI は共有されないため、デバイスに割り当てられる MSI はシステム内で一意であることが保証されます。PCI 関数は、最大で 32 個の MSI メッセージを要求できます。

  • 拡張メッセージシグナル割り込み - 拡張メッセージシグナル割り込み (MSI-X) は、MSI の拡張バージョンです。MSI-X 割り込みでは、次の利点が追加されています。

    • 32 個ではなく 2048 個のメッセージをサポートしている

    • メッセージごとに独立したメッセージアドレスとメッセージデータをサポートしている

    • メッセージごとのマスキングをサポートしている

    • ソフトウェアによるベクターの割り当て数がハードウェアの要求より少ない場合に柔軟性に優れている。ソフトウェアは、MSI-X の同じアドレスとデータを複数の MSI-X スロットで再利用できます。


注 - PCI Express などの一部の新しいバス技術には MSI が必要ですが、INTx エミュレーションを使用することでレガシー割り込みに対応できます。INTx エミュレーションは互換性を確保するために使用されますが、優れた方法であるとは考えられていません。

高レベルの割り込み

バスは、バス割り込みレベルのデバイス割り込みを優先します。次に、バス割り込みレベルは、プロセッサ割り込みレベルにマッピングされます。スケジューラ優先順位レベルよりも上位にある CPU 割り込み優先順位にマッピングされるバス割り込みレベルは、高レベルの割り込みと呼ばれます。高レベルの割り込みハンドラは、次の DDI インタフェースの呼び出しに限定されています。

バス割り込みレベルは、それだけでデバイス割り込みが高レベルかどうかを判定するわけではありません。特定のバス割り込みレベルを、あるプラットフォームでは高レベルの割り込みにマッピングし、別のプラットフォームでは通常の割り込みにマッピングできます。

高レベルの割り込みを持つデバイスをサポートするためのドライバは必要ありません。ただし、割り込みレベルをチェックするドライバは必要です。割り込み優先順位がシステムの最上位の優先順位以上である場合、割り込みハンドラは高レベルの割り込みコンテキストで実行されます。この場合、ドライバは接続に失敗するか、2 つのレベルのスキームを使って割り込みを処理する可能性があります。詳細については、高レベルの割り込みの処理を参照してください。

レガシー割り込み

システムがデバイス割り込みに関して持っている唯一の情報は、バス割り込みの優先順位レベルと割り込み要求番号です。バス割り込みの優先順位レベルの一例は、SPARC システムでの SBus 上の IPL です。割り込み要求番号の一例は、x86 システムの ISA バス上の IRQ です。

割り込みハンドラが登録されると、そのハンドラはシステムによって各 IPL または IRQ の潜在的な割り込みハンドラのリストに追加されます。割り込みが発生すると、システムは、指定された IPL または IRQ に関連付けられたすべてのデバイスの中から、実際に割り込みを発生させたデバイスを判定する必要があります。システムは、ハンドラが割り込みを取り込むまで、指定された IPL または IRQ のすべての割り込みハンドラを呼び出します。

次のバスは、ポーリング方式の割り込みをサポートできます。

  • SBus

  • ISA

  • PCI

標準メッセージシグナル割り込みと拡張メッセージシグナル割り込み

標準メッセージシグナル割り込み (MSI) と拡張メッセージシグナル割り込み (MSI-X) の両方が、帯域内メッセージとして実装されます。メッセージシグナル割り込みは、ソフトウェアによって指定されたアドレスと値を持つ書き込みとして送信されます。

MSI 割り込み

従来の PCI 仕様には、オプションのサポートとしてメッセージシグナル割り込み (MSI) が含まれています。MSI は、送信される書き込みとして実装される帯域内メッセージです。MSI のアドレスとデータはソフトウェアによって指定され、ホストブリッジに固有です。メッセージは帯域内にあるため、メッセージの受信は、割り込みに関連付けられたデータの「プッシュ」に使用できます。定義上、MSI 割り込みは共有されません。デバイスに割り当てられた各 MSI メッセージは、システム内で一意のメッセージであることが保証されています。PCI 関数は、1、2、4、8、16、または 32 個の MSI メッセージを要求できます。システムソフトウェアは、関数の要求より少ない数の MSI メッセージを関数に割り当てることができます。ホストブリッジは、デバイスに割り当てられた一意の MSI メッセージの数で制限できます。

MSI-X 割り込み

MSI-X 割り込みは MSI 割り込みの拡張バージョンであり、MSI 割り込みと同じ機能を持っていますが、次のような主な違いがあります。

  • デバイスごとに最大 2048 個の MSI-X 割り込みベクターがサポートされている。

  • アドレスとデータのエントリが割り込みベクターごとに一意である。

  • MSI-X は、関数ごとのマスキングとベクターごとのマスキングをサポートしている。

MSI-X 割り込みでは、デバイスの未割り当ての割り込みベクターは、前に追加または初期化された MSI-X 割り込みベクターを使用して、同じベクターアドレス、ベクターデータ、割り込みハンドラ、およびハンドラ引数を共有できます。ddi_intr_dup_handler(9F) 関数を使用すると、関連付けられたデバイスの未割り当ての割り込みベクターに対して、Oracle Solaris OS から提供されるリソースに別名を付けることができます。たとえば、2 つの MSI-X 割り込みがドライバに割り当てられ、32 個の割り込みがデバイスでサポートされている場合、そのドライバは ddi_intr_dup_handler() を使用して、デバイスの 30 個の追加割り込みに対して、受信した 2 つの割り込みに別名を付けることができます。

ddi_intr_dup_handler() 関数は、ddi_intr_add_handler(9F) を使って追加された、またはddi_intr_enable(9F) を使って初期化された割り込みを複製できます。

複製された割り込みは、最初は無効になっています。複製された割り込みを有効にするには、ddi_intr_enable () を使用します。元の MSI-X 割り込みハンドラは、この元の割り込みハンドラに関連付けられているすべての複製された割り込みハンドラが削除されるまで削除できません。複製された割り込みハンドラを削除するには、まずddi_intr_disable(9F) を呼び出し、次にddi_intr_free(9F) を呼び出します。元の割り込みハンドラに関連付けられているすべての複製された割り込みハンドラが削除されたら、ddi_intr_remove_handler(9F) を使用して元の MSI-X 割り込みハンドラを削除できます。例については、ddi_intr_dup_handler (9F) のマニュアルページを参照してください。

ソフトウェア割り込み

Oracle Solaris DDI/DKI は、ソフトウェア割り込みをサポートしています。ソフトウェア割り込みは、ソフト割り込みとも呼ばれます。ソフト割り込みは、ハードウェアデバイスではなくソフトウェアによって開始されます。この割り込みのハンドラは、システムとの間でも追加および削除する必要があります。ソフト割り込みハンドラは割り込みコンテキストで実行されるため、割り込みハンドラに属するタスクの多くを実行するために使用できます。

ハードウェア割り込みハンドラは、これらのタスクの実行中にほかのシステムアクティビティーを中断しなければならないことがあるため、タスクをすばやく実行する必要があります。この要件は、システムスケジューラの優先順位レベルより高い優先順位レベルで動作する高レベルの割り込みハンドラに特に当てはまります。高レベルの割り込みハンドラは、システムクロックの割り込み処理を含め、優先順位の低いすべての割り込み処理をマスクします。したがって、割り込みハンドラは、mutex の獲得など、割り込みハンドラのスリープの原因になることがあるアクティビティーにかかわることを避ける必要があります。

ハンドラがスリープ状態になると、クロックがマスクされてスリープスレッドのスケジューリングができなくなるため、システムがハングアップすることがあります。この理由で、高レベルの割り込みハンドラは通常、最小限の処理を優先順位の高いレベルで実行し、ほかのタスクをソフトウェア割り込みに委任します。ソフトウェア割り込みは、高レベルの割り込みハンドラの優先順位レベルの下で動作します。ソフトウェア割り込みハンドラはシステムスケジューラの優先順位レベルの下で動作するため、ソフトウェア割り込みハンドラは、高レベルの割り込みハンドラができなかった処理を行うことができます。