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

印刷ビューの終了

更新: 2016 年 11 月
 
 

デバイスドライバのエントリポイント

このセクションでは、次のカテゴリのエントリポイントの一覧を示します。

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

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

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

文字デバイスとブロックデバイス用のドライバは、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) を実装できます。これらのルーチンの詳細は、ドライバの自動構成を参照してください。

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

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

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

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

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

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

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

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

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

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

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

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

ブロックデバイスドライバ用のエントリポイント

ファイルシステムをサポートするデバイスは、ブロック型デバイスと呼ばれます。このデバイス用に作成されたドライバは、ブロックデバイスドライバと呼ばれます。ブロック型デバイスドライバは、buf(9S) 構造体の形でファイルシステム要求を受け取り、指定されたブロックを転送するために入出力操作をディスクに発行します。ファイルシステムへのメインインタフェースは、strategy(9E) ルーチンです。詳細は、ブロックデバイスのドライバを参照してください。

ブロックデバイスドライバは、文字ドライバインタフェースを提供することもできます。これにより、ユーティリティープログラムはファイルシステムをバイパスして、デバイスに直接アクセスできます。このデバイスアクセスは一般に、ブロックデバイスへの raw インタフェースと呼ばれます。

次の表に、ブロックデバイスドライバで使用できる追加のエントリポイントの一覧を示します。すべてのドライバに共通のエントリポイントも参照してください。

表 2  ブロックドライバ用の追加のエントリポイント
エントリポイント
用途
説明
オプション
非同期読み取りを実行します。aread() エントリポイントをサポートしないドライバは、nodev(9F) エラー戻り関数を使用します。追加情報:
オプション
非同期書き込みを実行します。awrite () エントリポイントをサポートしないドライバは、nodev(9F) エラー戻り関数を使用します。追加情報:
必須
システムコンソールにドライバメッセージを表示します。追加情報: print エントリポイント (ブロックドライバ)
必須
ブロック入出力を実行します。追加情報:

文字デバイスドライバ用のエントリポイント

文字デバイスドライバは通常、バイトストリームで入出力を実行します。文字ドライバを使用するデバイスの例には、テープドライブやシリアルポートがあります。文字デバイスドライバは、入出力制御 (ioctl) コマンド、メモリーマッピング、デバイスポーリングなど、ブロックドライバには存在しない追加のインタフェースも提供できます。詳細は、文字デバイスのドライバを参照してください。

デバイスドライバの主なタスクは入出力を実行することですが、多くの文字デバイスドライバは、バイトストリームまたは文字 I/O と呼ばれる処理を行います。ドライバは、デバイスとの間のデータ転送を、特定のデバイスアドレスを使用しないで行います。このような転送は、ファイルシステム要求の一部がデバイス上の特定の位置を識別するブロックデバイスドライバとは大きく異なります。

read(9E) および write(9E) エントリポイントは、標準的な文字ドライバのバイトストリーム入出力を処理します。詳細は、入出力要求の処理を参照してください。

次の表に、文字デバイスドライバで使用できる追加のエントリポイントの一覧を示します。その他のエントリポイントについては、すべてのドライバに共通のエントリポイントを参照してください。

表 3  文字ドライバ用の追加のエントリポイント
エントリポイント
用途
説明
オプション
STREAMS 以外の文字ドライバのイベントをポーリングします。追加情報: ファイル記述子に対する入出力の多重化
オプション
文字ドライバの一連の入出力コマンドを実行します。ioctl() ルーチンでは、適宜 copyin(9F)copyout(9F)ddi_copyin(9F)、およびddi_copyout(9F) を明示的に使用して、ユーザーデータが確実にカーネルのアドレス空間に、またはカーネルのアドレス空間からコピーされるようにする必要があります。追加情報:
必須
デバイスからデータを読み取ります。追加情報:
オプション
デバイスメモリーをユーザー空間にマップします。追加情報:
必須
データをデバイスに書き込みます。追加情報:

STREAMS デバイスドライバ用のエントリポイント

STREAMS は、文字ドライバを作成するための独立したプログラミングモデルです。端末やネットワークデバイスなど、データを非同期に受信するデバイスは、STREAMS の実装に適しています。STREAMS デバイスドライバは、ロードと自動構成 (ドライバの自動構成を参照) をサポートする必要があります。STREAMS ドライバの作成方法については、STREAMS Programming Guideを参照してください。

次の表に、STREAMS デバイスドライバで使用できる追加のエントリポイントの一覧を示します。その他のエントリポイントについては、すべてのドライバに共通のエントリポイントおよび文字デバイスドライバ用のエントリポイントを参照してください。

表 4  STREAMS ドライバ用のエントリポイント
エントリポイント
用途
説明
説明を参照
ストリーム内のあるキューから次のキューへのメッセージの受け渡しを調整します。データを読み取るドライバの側を除き、必須です。追加情報: STREAMS Programming Guide
必須
キューに入っているメッセージを操作します。追加情報: STREAMS Programming Guide

メモリーマッピングされたデバイス用のエントリポイント

フレームバッファーなどの特定のデバイスでは、バイトストリーム入出力を行うよりも、デバイスメモリーへの直接アクセスをアプリケーションプログラムに許可したほうが効率的です。アプリケーションのアドレス空間にデバイスメモリーをマッピングするには、mmap(2) システムコールを使用します。メモリーマッピングをサポートするために、デバイスドライバはsegmap(9E) およびdevmap(9E) エントリポイントを実装します。devmap(9E) については、デバイスメモリーおよびカーネルメモリーのマッピングを参照してください。segmap(9E) については、文字デバイスのドライバを参照してください。

devmap(9E) エントリポイントを定義するドライバは通常、read(9E) および write(9E) エントリポイントを定義しません。これは、アプリケーションプログラムが、mmap(2) の呼び出し後にデバイスに対して直接入出力を実行するからです。

次の表に、devmap フレームワークを使ってメモリーマッピングを実行する文字デバイスドライバで使用できる追加のエントリポイントを示します。その他のエントリポイントについては、すべてのドライバに共通のエントリポイントおよび文字デバイスドライバ用のエントリポイントを参照してください。

表 5  メモリーマッピングに devmap を使用する文字ドライバ用のエントリポイント
エントリポイント
用途
説明
必須
メモリーマッピングされたデバイスの仮想マッピングを検証し、変換します。追加情報: マッピングのエクスポート
オプション
検証や保護に関する問題のあるマッピングに対してアクセスが行われたときにドライバに通知します。追加情報: devmap_access エントリポイント
必須
マッピングに対してデバイスコンテキストの切り替えを行います。追加情報: devmap_contextmgt エントリポイント
オプション
デバイスマッピングを複製します。追加情報: devmap_dup エントリポイント
オプション
デバイスマッピングを作成します。追加情報: devmap_map エントリポイント
オプション
デバイスマッピングを取り消します。追加情報: devmap_unmap エントリポイント

ネットワークデバイスドライバ用のエントリポイント

GLDv3 (Generic LAN Driver version 3) フレームワークを使用するネットワークデバイスドライバ用のエントリポイントの一覧については、表 19 を参照してください。詳細は、GLDv3 ネットワークデバイスドライバフレームワークGLDv3 の MAC 登録関数および ネットワークデバイスのドライバを参照してください。

SCSI HBA ドライバ用のエントリポイント

次の表に、SCSI HBA デバイスドライバで使用できる追加のエントリポイントを示します。SCSI HBA トランスポート構造体については、scsi_hba_tran(9S) を参照してください。その他のエントリポイントについては、すべてのドライバに共通のエントリポイントおよび文字デバイスドライバ用のエントリポイントを参照してください。

表 6  SCSI HBA ドライバ用の追加のエントリポイント
エントリポイント
用途
説明
必須
SCSI HBA (Host Bus Adapter) ドライバに転送されている、指定の SCSI コマンドを中止します。追加情報: tran_abort エントリポイント
オプション
SCSI バスをリセットします。追加情報: tran_bus_reset エントリポイント
必須
SCSI パケットに割り当てられているリソースを解放します。追加情報: tran_destroy_pkt エントリポイント
必須
SCSI パケットに割り当てられている DMA リソースを解放します。追加情報: tran_dmafree エントリポイント
必須
HBA ドライバによって提供される特定の機能の現在の値を取得します。追加情報: tran_getcap エントリポイント
必須
SCSI パケットにリソースを割り当てて初期化します。追加情報: リソース割り当て
オプション
通常は動的再構成のために、SCSI バス上のすべての動作を停止します。追加情報: 動的再構成
必須
SCSI バスまたはターゲットデバイスをリセットします。追加情報: tran_reset エントリポイント
オプション
バスのリセットに関して SCSI ターゲットデバイスの通知を要求します。追加情報: tran_reset_notify エントリポイント
必須
SCSI HBA ドライバによって提供される特定の機能の値を設定します。追加情報: tran_setcap エントリポイント
必須
SCSI コマンドのトランスポートを要求します。追加情報: tran_start エントリポイント
必須
HBA ドライバまたはデバイスによるデータのビューを同期させます。追加情報: tran_sync_pkt エントリポイント
オプション
ターゲットデバイスに代わって、割り当てられた SCSI HBA リソースが解放されるように要求します。追加情報:
オプション
ターゲットデバイスに代わって、SCSI HBA リソースが初期化されるように要求します。追加情報:
オプション
SCSI バス上の指定されたターゲットを調べます。追加情報: tran_tgt_probe エントリポイント
オプション
通常は動的再構成のために、tran_quiesce(9E) が呼び出されたあとで SCSI バス上の入出力動作を再開します。追加情報: 動的再構成

PC カードドライバ用のエントリポイント

次の表に、PC カードドライバで使用できる追加のエントリポイントの一覧を示します。その他のエントリポイントについては、すべてのドライバに共通のエントリポイントおよび文字デバイスドライバ用のエントリポイントを参照してください。

表 7  PC カードドライバ専用のエントリポイント
エントリポイント
用途
説明
必須
PC カードドライバのイベントを処理します。ドライバは、cb_ops のような構造体フィールドを使用するのではなく、csx_RegisterClient(9F) 関数を明示的に呼び出してエントリポイントを設定する必要があります。