ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
デバイスドライバの記述 Oracle Solaris 11.1 Information Library (日本語) |
パート I Oracle Solaris プラットフォーム用デバイスドライバの設計
2. Oracle Solaris カーネルとデバイスツリー
22. ドライバのコンパイル、ロード、パッケージ化、およびテスト
23. デバイスドライバのデバッグ、テスト、およびチューニング
このセクションでは、次のカテゴリのエントリポイントの一覧を示します。
モジュールのロードに必要な関数や必須の自動構成エントリポイントなど、一部の処理はどのタイプのドライバでも実行できます。このセクションでは、すべてのドライバに共通したエントリポイントの種類について説明します。共通のエントリポイントの一覧は、「共通のエントリポイントのサマリー」に、マニュアルページへのリンクとその他の関連情報とともに記載してあります。
文字デバイスとブロックデバイス用のドライバは、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) を実装できます。これらのルーチンの詳細は、第 6 章ドライバの自動構成を参照してください。
Oracle Solaris プラットフォームには、カーネルレベルの統計情報 (kstats とも呼ばれる) を保持およびエクスポートするための豊富なインタフェースセットが用意されています。ドライバは、これらのインタフェースを自由に使用して、ドライバの内部状態を監視するために、ユーザーアプリケーションで使用できるドライバとデバイスの統計情報をエクスポートします。カーネル統計情報を処理するために 2 つのエントリポイントが提供されています。
ks_snapshot(9E) は、特定の時間に kstats を取り込みます。
ks_update(9E) は、kstats データを自由に更新するために使用できます。ks_update() は、デバイスがカーネルデータを追跡するように設定されているが、そのデータの抽出に時間がかかる場合に役立ちます。
詳細は、kstat_create(9F) と kstat(9S) のマニュアルページを参照してください。「カーネル統計」も参照してください。
電源管理機能を備えたハードウェアデバイスのドライバは、任意指定のエントリポイント power(9E) をサポートできます。このエントリポイントの詳細は、第 12 章電源管理を参照してください。
デバイスを管理するドライバでは、quiesce(9E) エントリポイントを実装する必要があります。デバイスを管理しないドライバでは、dev_ops 構造体の devo_quiesce フィールドを ddi_quiesce_not_needed() に設定できます。quiesce() 関数を呼び出せるのは、システムが、横取りが無効化された、高い PIL (Priority Interrupt Level) を持つシングルスレッドである場合だけです。したがって、この関数がブロックされてはいけません。デバイスに定義済みのリセット状態構成がある場合、ドライバは休止処理の一部として、デバイスをそのリセット状態に返すべきです。この場合の一例として、新しいオペレーティングシステムイメージへのブート時にファームウェアがバイパスされる高速リブートが挙げられます。
次の表に、すべてのタイプのドライバで使用できるエントリポイントの一覧を示します。
表 1-1 すべてのドライバタイプ用のエントリポイント
|
ファイルシステムをサポートするデバイスは、ブロックデバイスと呼ばれます。このデバイス用に作成されたドライバは、ブロックデバイスドライバと呼ばれます。ブロックデバイスドライバは、buf(9S) 構造体の形でファイルシステム要求を受け取り、指定されたブロックを転送するために入出力操作をディスクに発行します。ファイルシステムへのメインインタフェースは、strategy(9E) ルーチンです。詳細は、第 16 章ブロックデバイスのドライバを参照してください。
ブロックデバイスドライバは、文字ドライバインタフェースを提供することもできます。これにより、ユーティリティープログラムはファイルシステムをバイパスして、デバイスに直接アクセスできます。このデバイスアクセスは一般に、ブロックデバイスへの raw インタフェースと呼ばれます。
次の表に、ブロックデバイスドライバで使用できる追加のエントリポイントの一覧を示します。「すべてのドライバに共通のエントリポイント」も参照してください。
表 1-2 ブロックドライバ用の追加のエントリポイント
|
文字デバイスドライバは通常、バイトストリームで入出力を実行します。文字ドライバを使用するデバイスの例には、テープドライブやシリアルポートがあります。文字デバイスドライバは、入出力制御 (ioctl) コマンド、メモリーマッピング、デバイスポーリングなど、ブロックドライバには存在しない追加のインタフェースも提供できます。詳細は、第 15 章文字デバイスのドライバを参照してください。
デバイスドライバの主なタスクは入出力を実行することですが、多くの文字デバイスドライバは、バイトストリームまたは文字 I/O と呼ばれる処理を行います。ドライバは、デバイスとの間のデータ転送を、特定のデバイスアドレスを使用しないで行います。このような転送は、ファイルシステム要求の一部がデバイス上の特定の位置を識別するブロックデバイスドライバとは大きく異なります。
read(9E) および write(9E) エントリポイントは、標準的な文字ドライバのバイトストリーム入出力を処理します。詳細は、「入出力要求の処理」を参照してください。
次の表に、文字デバイスドライバで使用できる追加のエントリポイントの一覧を示します。その他のエントリポイントについては、「すべてのドライバに共通のエントリポイント」を参照してください。
表 1-3 文字ドライバ用の追加のエントリポイント
|
STREAMS は、文字ドライバを作成するための別のプログラミングモデルです。端末やネットワークデバイスなど、データを非同期に受信するデバイスは、STREAMS の実装に適しています。STREAMS デバイスドライバは、ロードと自動構成 (第 6 章ドライバの自動構成を参照) をサポートする必要があります。STREAMS ドライバの作成方法については、『STREAMS Programming Guide 』を参照してください。
次の表に、STREAMS デバイスドライバで使用できる追加のエントリポイントの一覧を示します。その他のエントリポイントについては、「すべてのドライバに共通のエントリポイント」および「文字デバイスドライバ用のエントリポイント」を参照してください。
表 1-4 STREAMS ドライバ用のエントリポイント
|
フレームバッファーなどの特定のデバイスでは、バイトストリーム入出力を行うよりも、デバイスメモリーへの直接アクセスをアプリケーションプログラムに許可したほうが効率的です。アプリケーションのアドレス空間にデバイスメモリーをマッピングするには、mmap(2) システムコールを使用します。メモリーマッピングをサポートするために、デバイスドライバは segmap(9E) および devmap(9E) エントリポイントを実装します。devmap(9E) については、第 10 章デバイスメモリーおよびカーネルメモリーのマッピングを参照してください。segmap(9E) については、第 15 章文字デバイスのドライバを参照してください。
devmap(9E) エントリポイントを定義するドライバは通常、read(9E) および write(9E) エントリポイントを定義しません。これは、アプリケーションプログラムが、mmap(2) の呼び出し後にデバイスに対して直接入出力を実行するからです。
次の表に、devmap フレームワークを使ってメモリーマッピングを実行する文字デバイスドライバで使用できる追加のエントリポイントを示します。その他のエントリポイントについては、「すべてのドライバに共通のエントリポイント」および「文字デバイスドライバ用のエントリポイント」を参照してください。
表 1-5 メモリーマッピングに devmap を使用する文字ドライバ用のエントリポイント
|
GLDv3 (Generic LAN Driver version 3) フレームワークを使用するネットワークデバイスドライバ用のエントリポイントの一覧については、表 19-1 を参照してください。詳細は、第 19 章ネットワークデバイスのドライバの 「GLDv3 ネットワークデバイスドライバフレームワーク」および 「GLDv3 の MAC 登録関数」を参照してください。
次の表に、SCSI HBA デバイスドライバで使用できる追加のエントリポイントを示します。SCSI HBA トランスポート構造体については、scsi_hba_tran(9S) を参照してください。その他のエントリポイントについては、「すべてのドライバに共通のエントリポイント」および「文字デバイスドライバ用のエントリポイント」を参照してください。
表 1-6 SCSI HBA ドライバ用の追加のエントリポイント
|
次の表に、PC カードドライバで使用できる追加のエントリポイントの一覧を示します。その他のエントリポイントについては、「すべてのドライバに共通のエントリポイント」および「文字デバイスドライバ用のエントリポイント」を参照してください。
表 1-7 PC カードドライバ専用のエントリポイント
|