Oracle® Solaris 11.2 デバイスドライバの記述

印刷ビューの終了

更新: 2014 年 9 月
 
 

DDI/DKI の機能

Oracle Solaris DDI/DKI インタフェースは、ドライバの移植性のために提供されています。DDI/DKI を使用すると、開発者はハードウェアやプラットフォームの違いについて心配することなく標準的な方法でドライバコードを作成できます。このセクションでは、DDI/DKI インタフェースのさまざまな局面について説明します。

デバイス ID

DDI インタフェースを使用すると、ドライバは持続的な一意の ID をデバイスに割り当てることができます。デバイス ID は、デバイスを識別したり、検出したりするために使用できます。この ID は、デバイスの名前や番号 (dev_t) には依存していません。アプリケーションでは、libdevid (3LIB) で定義された関数を使用すると、ドライバが登録したデバイス ID を読み取り、操作できます。

デバイスプロパティー

デバイスまたはデバイスドライバの属性は、プロパティーによって指定されます。プロパティーは名前-値ペアです。名前は、対応付けられた値を使ってプロパティーを識別する文字列です。プロパティーは、自己識別デバイスの FCode またはハードウェア構成ファイル (driver.conf(4) のマニュアルページを参照) で定義することも、ドライバ自身が ddi_prop_update (9F) ファミリのルーチンを使用して定義することもできます。

割り込み処理

DDI/DKI では、デバイス割り込み処理の次の局面に対応します。

  • システムへのデバイス割り込みの登録

  • デバイス割り込みの削除

  • 割り込みハンドラへの割り込みのディスパッチ

デバイス割り込みのソースは、interrupt と呼ばれるプロパティーに含まれています。このプロパティーは、自己識別デバイスとしての PROM、ハードウェア構成ファイル、または x86 プラットフォームでのブートシステムによって提供されます。

コールバック関数

一部の DDI メカニズムには、コールバックメカニズムが備わっています。DDI 関数には、条件が満たされたときにコールバックをスケジュールするためのメカニズムが備わっています。コールバック関数は、次の一般的な条件に対して使用できます。

  • 転送が完了した

  • リソースが利用できるようになった

  • タイムアウト期間が経過した

コールバック関数は、割り込みハンドラなどのエントリポイントに多少似ています。コールバックを許可する DDI 関数は、コールバック関数が特定のタスクを実行するものとみなします。DMA ルーチンの場合、コールバック関数は、障害が発生した場合にコールバック関数を再スケジュールする必要があるかどうかを示す値を返します。

コールバック関数は、単独の割り込みスレッドとして実行されます。コールバックは、通常のマルチスレッド問題をすべて処理する必要があります。


注 - ドライバは、デバイスを切り離す前に、スケジュールされたすべてのコールバック関数を取り消す必要があります。

ソフトウェアの状態管理

状態構造体を割り当てる際にデバイスドライバの作成者を支援するために、DDI/DKI ではソフトウェア状態管理ルーチン (soft-state ルーチン) と呼ばれる一連のメモリー管理ルーチンを提供します。これらのルーチンは、指定されたサイズのメモリー項目の動的な割り当て、取得、および破棄を行い、リスト管理の詳細を非表示にします。インスタンス番号は、目的のメモリー項目を特定するために使われます。この番号は通常、システムによって割り当てられるインスタンス番号です。

ルーチンは、次のタスクに対して提供されます。

  • ドライバのソフト状態リストを初期化する

  • ドライバのソフト状態のインスタンスに領域を割り当てる

  • ドライバのソフト状態のインスタンスを指すポインタを取得する

  • ドライバのソフト状態のインスタンスのメモリーを解放する

  • ドライバのソフト状態リストの使用を終了する

これらのルーチンの使用方法の例については、Loadable Driver Interfacesを参照してください。

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

プログラム式入出力デバイスアクセスとは、ホストの CPU からデバイスレジスタやデバイスメモリーの読み書きを行う動作のことです。Oracle Solaris DDI には、カーネルによってデバイスのレジスタやメモリーをマッピングするためのインタフェースのほかに、ドライバからデバイスメモリーの読み書きを行うためのインタフェースも備わっています。これらのインタフェースを使用すると、デバイスとホストのエンディアンネスのあらゆる違いを自動的に管理したり、デバイスで設定されたメモリーとストアのシーケンス要件を適用したりすることによって、プラットフォームやバスに依存しないドライバを開発できます。

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

Oracle Solaris プラットフォームでは、DMA 対応デバイスをサポートするための、アーキテクチャーに依存しないハイレベルなモデルを定義しています。Oracle Solaris DDI は、プラットフォーム固有の詳細からドライバを遮蔽します。この概念を使えば、複数のプラットフォームやアーキテクチャー上で 1 つの共通のドライバを動作させることができます。

階層化ドライバインタフェース

DDI/DKI には、階層化デバイスインタフェース (LDI) と呼ばれるインタフェースグループがあります。このインタフェースを使用すると、Oracle Solaris カーネルの内部からデバイスにアクセスできます。この機能を使用すると、開発者はカーネルデバイスの使用を監視するアプリケーションを作成できます。たとえば、prtconf (1M)fuser (1M) の両方のコマンドで LDI を使用すると、システム管理者はデバイス使用のさまざまな局面を追跡できます。LDI については、Chapter 14, Layered Driver Interface (LDI)で詳しく説明しています。