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

ドキュメントの情報

はじめに

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

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

デバイスドライバの基本

デバイスドライバとは

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

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

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

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

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

自動設定のエントリポイント

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

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

共通のエントリポイントのまとめ

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

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

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

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

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

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

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

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

DDI/DKI の機能

デバイス ID

デバイスプロパティー

割り込み処理

コールバック関数

ソフトウェアの状態管理

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

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

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

ドライバコンテキスト

エラーの出力

動的メモリー割り当て

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

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

3.  マルチスレッド

4.  プロパティー

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

6.  ドライバの自動設定

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

8.  割り込みハンドラ

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

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

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

12.  電源管理

13.  Solaris ドライバの強化

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

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

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

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

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

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

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

20.  USB ドライバ

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

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

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

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

パート IV 付録

A.  ハードウェアの概要

B.  Solaris DDI/DKI サービスの概要

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

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

索引

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

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

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

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

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

文字デバイスとブロックデバイス用のドライバは、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) でその資源を解放します。


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


自動設定のエントリポイント

ドライバは、デバイスの自動設定のために attach(9E)detach(9E)、および getinfo(9E) エントリポイントを実装する必要があります。また、SCSI ターゲットデバイスなど、デバイスが起動中に自らを識別できない場合は、任意指定のエントリポイント probe(9E) を実装できます。これらのルーチンの詳細は、第 6 章ドライバの自動設定を参照してください。

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

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

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

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

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

共通のエントリポイントのまとめ

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

表 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 章文字デバイスのドライバを参照してください。

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

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) 関数を明示的に呼び出してエントリポイントを設定する必要があります。