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

印刷ビューの終了

更新: 2014 年 9 月
 
 

すべてのドライバに共通のエントリポイント

モジュールのロードに必要な関数や必須の自動構成エントリポイントなど、一部の処理はどのタイプのドライバでも実行できます。このセクションでは、すべてのドライバに共通したエントリポイントの種類について説明します。共通のエントリポイントの一覧は、Summary of Common Entry Pointsに、マニュアルページへのリンクとその他の関連情報とともに記載してあります。

デバイスアクセスのエントリポイント

文字デバイスとブロックデバイス用のドライバは、cb_ops (9S) 構造体をエクスポートします。この構造体では、ブロックデバイスアクセスと文字デバイスアクセス用のドライバエントリポイントを定義します。どちらのタイプのドライバも、open(9E) およびclose (9E) エントリポイントをサポートする必要があります。ブロックドライバは strategy(9E) をサポートする必要がありますが、文字ドライバはデバイスのタイプに適していれば、read (9E)write (9E)ioctl (9E)mmap(9E)、または devmap (9E) エントリポイントのどのような組み合わせの実装も選択できます。さらに、文字ドライバは chpoll(9E) を通じてポーリングインタフェースをサポートすることもできます。非同期入出力は、ブロックドライバと、ブロックファイルシステムおよび文字ファイルシステムの両方を使用できるドライバで、aread (9E) およびawrite (9E) を通じてサポートされます。

ロード可能なモジュールのエントリポイント

すべてのドライバは、ドライバモジュールのロード、アンロード、および情報の報告を行うためにロード可能なモジュールのエントリポイント _init(9E)_fini (9E)、および_info (9E) を実装する必要があります。

ドライバは、_init (9E) でグローバルリソースの割り当てと初期化を行うべきです。ドライバは、 _fini(9E) でそのリソースを解放するべきです。


注 - Oracle Solaris OS では、ロード可能なモジュールルーチンだけを、ドライバオブジェクトモジュールの外から表示できる必要があります。その他のルーチンには、ストレージクラス static を指定できます。

自動構成のエントリポイント

ドライバは、デバイスの自動構成のために attach (9E)detach (9E)、およびgetinfo (9E) エントリポイントを実装する必要があります。また、SCSI ターゲットデバイスなど、デバイスがブート中に自らを識別できない場合は、オプションのエントリポイントprobe (9E) を実装できます。これらのルーチンの詳細は、Chapter 6, Driver Autoconfigurationを参照してください。

カーネル統計情報のエントリポイント

Oracle Solaris プラットフォームには、カーネルレベルの統計情報 (kstats とも呼ばれる) を保持およびエクスポートするための豊富なインタフェースセットが用意されています。ドライバは、これらのインタフェースを自由に使用して、ドライバの内部状態を監視するために、ユーザーアプリケーションで使用できるドライバとデバイスの統計情報をエクスポートします。カーネル統計情報を処理するために 2 つのエントリポイントが提供されています。

  • ks_snapshot(9E) は、特定の時間に kstats を取り込みます。

  • ks_update(9E) は、kstats データを自由に更新するために使用できます。ks_update() は、デバイスがカーネルデータを追跡するように設定されているが、そのデータの抽出に時間がかかる場合に役立ちます。

詳細は、kstat_create (9F)kstat (9S) のマニュアルページを参照してください。Kernel Statisticsも参照してください。

電源管理のエントリポイント

電源管理機能を備えたハードウェアデバイスのドライバは、オプションのエントリポイント power(9E) をサポートできます。このエントリポイントの詳細は、Chapter 12, Power Managementを参照してください。

システム休止のエントリポイント

デバイスを管理するドライバでは、quiesce(9E) エントリポイントを実装する必要があります。デバイスを管理しないドライバでは、dev_ops 構造体の devo_quiesce フィールドを ddi_quiesce_not_needed() に設定できます。quiesce() 関数を呼び出せるのは、システムが、横取りが無効化された、高い PIL (Priority Interrupt Level) を持つシングルスレッドである場合だけです。したがって、この関数がブロックされてはいけません。デバイスに定義済みのリセット状態構成がある場合、ドライバは休止処理の一部として、デバイスをそのリセット状態に返すべきです。この場合の一例として、新しいオペレーティングシステムイメージへのブート時にファームウェアがバイパスされる高速リブートが挙げられます。

共通のエントリポイントのサマリー

次の表に、すべてのタイプのドライバで使用できるエントリポイントの一覧を示します。

表 1-1  すべてのドライバタイプ用のエントリポイント
カテゴリ/エントリポイント
用途
説明
cb_ops エントリポイント
必須
デバイスにアクセスできます。追加情報:
必須
デバイスへのアクセスを中止します。STREAMS ドライバ用の close() のバージョンには文字ドライバやブロックドライバとは異なるシグニチャーがあります。追加情報:
ロード可能なモジュールのエントリポイント
必須
ロード可能なモジュールを初期化します。追加情報: Loadable Driver Interfaces
必須
ロード可能なモジュールのアンロードの準備をします。すべてのドライバタイプに必須です。追加情報: Loadable Driver Interfaces
必須
ロード可能なモジュールに関する情報を返します。追加情報: Loadable Driver Interfaces
自動構成のエントリポイント
必須
初期化中にデバイスをシステムに追加します。中断されていたシステムの再開にも使用されます。追加情報: attach() Entry Point
必須
デバイスをシステムから切り離します。一時的にデバイスを中断する場合にも使用されます。追加情報: detach() Entry Point
必須
デバイス番号とそれに対応するインスタンス間のマッピングなど、ドライバに固有のデバイス情報を取得します。追加情報:
説明を参照
自己識別しないデバイスが存在するかどうかを判別します。自らを識別できないデバイスには必須です。追加情報:
カーネル統計情報のエントリポイント
オプション
kstat(9S) データのスナップショットを取得します。追加情報: Kernel Statistics
オプション
kstat(9S) データを動的に更新します。追加情報: Kernel Statistics
電源管理のエントリポイント
必須
デバイスの電源レベルを設定します。使用しない場合は、NULL に設定します。追加情報: power() Entry Point
システム休止のエントリポイント
説明を参照
デバイスが割り込みを生成したりメモリーへの変更やアクセスを行なったりしなくなるように、デバイスを休止します。
その他のエントリポイント
説明を参照
ドライバのプロパティー情報を報告します。ddi_prop_op(9F) が代用されないかぎり必須です。追加情報:
説明を参照
システム障害の発生中にメモリーの内容をデバイスにダンプします。パニックの発生時にダンプデバイスとして使用するデバイスには必須です。追加情報:
identify(9E)
廃止
このエントリポイントは使用しないでください。dev_ops 構造体で、このエントリポイントにnulldev(9F) を割り当ててください。