JavaScript is required to for searching.
ナビゲーションリンクをスキップ
印刷ビューの終了
デバイスドライバの記述     Oracle Solaris 10 8/11 Information Library (日本語)
search filter icon
search icon

ドキュメントの情報

はじめに

パート I Solaris プラットフォーム用デバイスドライバの設計

1.  Solaris デバイスドライバの概要

2.  Solaris カーネルとデバイスツリー

3.  マルチスレッド

4.  プロパティー

5.  イベントの管理とタスクのキュー

6.  ドライバの自動設定

7.  デバイスアクセス: プログラム式入出力

8.  割り込みハンドラ

割り込みハンドラの概要

デバイス割り込み

高レベルの割り込み

レガシー割り込み

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

MSI 割り込み

MSI-X 割り込み

ソフトウェア割り込み

DDI 割り込み関数

割り込み許可フラグ関数

割り込み初期化関数と割り込み破棄関数

優先順位管理関数

ソフト割り込み関数

割り込み関数の例

割り込みの登録

レガシー割り込みの登録

MSI 割り込みの登録

割り込みリソース管理

割り込みリソース管理機能

コールバックのインタフェース

コールバックハンドラ関数の登録

コールバックハンドラ関数の登録解除

コールバックハンドラ関数

割り込み要求のインタフェース

割り込みの割り当て

要求する割り込みベクターの数の変更

割り込みの使用率と柔軟性

割り込みリソース管理の実装例

割り込みハンドラの機能

高レベルの割り込みの処理

高レベルの mutex

高レベルの割り込み処理の例

9.  ダイレクトメモリーアクセス (DMA)

10.  デバイスメモリーおよびカーネルメモリーのマッピング

11.  デバイスコンテキスト管理

12.  電源管理

13.  Solaris ドライバの強化

14.  階層化ドライバインタフェース (LDI)

パート II 特定の種類のデバイスドライバの設計

15.  文字デバイスのドライバ

16.  ブロックデバイスのドライバ

17.  SCSI ターゲットドライバ

18.  SCSI ホストバスアダプタドライバ

19.  ネットワークデバイスのドライバ

20.  USB ドライバ

パート III デバイスドライバの構築

21.  ドライバのコンパイル、ロード、パッケージ化、およびテスト

22.  デバイスドライバのデバッグ、テスト、およびチューニング

23.  推奨されるコーティング方法

パート IV 付録

A.  ハードウェアの概要

B.  Solaris DDI/DKI サービスの概要

C.  64 ビットデバイスドライバの準備

D.  コンソールフレームバッファードライバ

索引

デバイス割り込み

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

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


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


高レベルの割り込み

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

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

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

レガシー割り込み

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

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

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

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

標準メッセージシグナル割り込み (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 割り込みと同じ機能を持っていますが、次のような主な違いがあります。

MSI-X 割り込みでは、デバイスの未割り当ての割り込みベクターは、前に追加または初期化された MSI-X 割り込みベクターを使用して、同じベクターアドレス、ベクターデータ、割り込みハンドラ、およびハンドラ引数を共有できます。ddi_intr_dup_handler(9F) 関数を使用すると、関連付けられたデバイスの未割り当ての割り込みベクターに対して、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) のマニュアルページを参照してください。

ソフトウェア割り込み

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

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

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