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

ドキュメントの情報

はじめに

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

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

デバイスドライバの基本

デバイスドライバとは

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

デバイスドライバの設計上の考慮事項

DDI/DKI の機能

デバイス ID

デバイスプロパティー

割り込み処理

コールバック関数

ソフトウェアの状態管理

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

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

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

ドライバコンテキスト

エラーの出力

動的メモリー割り当て

ホットプラグによる取り付け

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

3.  マルチスレッド

4.  プロパティー

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

6.  ドライバの自動構成

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

8.  割り込みハンドラ

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

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

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

12.  電源管理

13.  Oracle Solaris ドライバの強化

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

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

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

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

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

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

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

20.  USB ドライバ

21.  SR-IOV ドライバ

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

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

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

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

パート IV 付録

A.  ハードウェアの概要

B.  Oracle Solaris DDI/DKI サービスのサマリー

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

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

E.  pci.conf ファイル

索引

ドキュメントの品質向上のためのご意見をください
簡潔すぎた
読みづらかった、または難し過ぎた
重要な情報が欠けていた
内容が間違っていた
翻訳版が必要
その他
Your rating has been updated
貴重なご意見を有り難うございました!

あなたの貴重なご意見はより良いドキュメント作成の手助けとなります 内容の品質向上と追加コメントのためのアンケートに参加されますか?

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

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

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

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

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

文字デバイスとブロックデバイス用のドライバは、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 つのエントリポイントが提供されています。

詳細は、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 すべてのドライバタイプ用のエントリポイント

カテゴリ/エントリポイント
用途
説明
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) ルーチンです。詳細は、第 16 章ブロックデバイスのドライバを参照してください。

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

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

表 1-2 ブロックドライバ用の追加のエントリポイント

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

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

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

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

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

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

表 1-3 文字ドライバ用の追加のエントリポイント

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

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

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

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

表 1-4 STREAMS ドライバ用のエントリポイント

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

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

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

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

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

表 1-5 メモリーマッピングに devmap を使用する文字ドライバ用のエントリポイント

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

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

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

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

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

表 1-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 バス上のすべての動作を停止します。追加情報: 「動的再構成 (DR)」
必須
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 バス上の入出力動作を再開します。追加情報: 「動的再構成 (DR)」

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

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

表 1-7 PC カードドライバ専用のエントリポイント

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