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
貴重なご意見を有り難うございました!

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

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

デバイスドライバは、サービスのコンシューマとしてもプロバイダとしても、Oracle Solaris OS と互換性がある必要があります。このセクションでは、デバイスドライバを設計する上で考慮する点として、次の項目について説明します。

DDI/DKI の機能

Oracle Solaris DDI/DKI インタフェースは、ドライバの移植性のために提供されています。DDI/DKI を使用すると、開発者はハードウェアやプラットフォームの違いについて心配することなく標準的な方法でドライバコードを作成できます。このセクションでは、DDI/DKI インタフェースのさまざまな局面について説明します。

デバイス ID

DDI インタフェースを使用すると、ドライバは持続的な一意の ID をデバイスに割り当てることができます。デバイス ID は、デバイスを識別したり、検出したりするために使用できます。この ID は、デバイスの名前や番号 (dev_t) には依存していません。アプリケーションでは、libdevid(3LIB) で定義された関数を使用すると、ドライバが登録したデバイス ID を読み取り、操作できます。

デバイスプロパティー

デバイスまたはデバイスドライバの属性は、プロパティーによって指定されます。プロパティーは名前-値ペアです。名前は、対応付けられた値を使ってプロパティーを識別する文字列です。プロパティーは、自己識別デバイスの FCode またはハードウェア構成ファイル (driver.conf(4) のマニュアルページを参照) で定義することも、ドライバ自身が ddi_prop_update(9F) ファミリのルーチンを使用して定義することもできます。

割り込み処理

DDI/DKI では、デバイス割り込み処理の次の局面に対応します。

デバイス割り込みのソースは、interrupt と呼ばれるプロパティーに含まれています。このプロパティーは、自己識別デバイスの PROM、ハードウェア構成ファイル、または x86 プラットフォームでのブートシステムによって提供されます。

コールバック関数

一部の DDI 機構には、コールバック機構が備わっています。DDI 関数には、条件が満たされたときにコールバックをスケジュールするための機構が備わっています。コールバック関数は、次の一般的な条件に対して使用できます。

コールバック関数は、割り込みハンドラなどのエントリポイントに多少似ています。コールバックを許可する DDI 関数は、コールバック関数が特定のタスクを実行するものとみなします。DMA ルーチンの場合、コールバック関数は、障害が発生した場合にコールバック関数を再スケジュールする必要があるかどうかを示す値を返します。

コールバック関数は、単独の割り込みスレッドとして実行されます。コールバックは、通常のマルチスレッド問題をすべて処理する必要があります。


注 - ドライバは、デバイスを切り離す前に、スケジュールされたすべてのコールバック関数を取り消す必要があります。


ソフトウェアの状態管理

状態構造体を割り当てる際にデバイスドライバの作成者を支援するために、DDI/DKI ではソフトウェア状態管理ルーチン (soft-state ルーチン) と呼ばれる一連のメモリー管理ルーチンを提供します。これらのルーチンは、指定されたサイズのメモリー項目の動的な割り当て、取得、および破棄を行い、リスト管理の詳細を非表示にします。インスタンス番号は、目的のメモリー項目を特定するために使われます。この番号は通常、システムによって割り当てられるインスタンス番号です。

ルーチンは、次のタスクに対して提供されます。

これらのルーチンの使用方法の例については、「ロード可能なドライバインタフェース」を参照してください。

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

プログラム式入出力デバイスアクセスとは、ホストの CPU からデバイスレジスタやデバイスメモリーの読み書きを行う動作のことです。Oracle Solaris DDI には、カーネルによってデバイスのレジスタやメモリーをマッピングするためのインタフェースのほかに、ドライバからデバイスメモリーの読み書きを行うためのインタフェースも備わっています。これらのインタフェースを使用すると、デバイスとホストのエンディアンネスのあらゆる違いを自動的に管理したり、デバイスで設定されたメモリーとストアのシーケンス要件を適用したりすることによって、プラットフォームやバスに依存しないドライバを開発できます。

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

Oracle Solaris プラットフォームでは、DMA 対応デバイスをサポートするための、アーキテクチャーに依存しないハイレベルなモデルを定義しています。Oracle Solaris DDI は、プラットフォーム固有の詳細からドライバを遮蔽します。この概念を使えば、複数のプラットフォームやアーキテクチャー上で 1 つの共通のドライバを動作させることができます。

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

DDI/DKI には、階層化デバイスインタフェース (LDI) と呼ばれるインタフェースグループがあります。このインタフェースを使用すると、Oracle Solaris カーネルの内部からデバイスにアクセスできます。この機能を使用すると、開発者はカーネルデバイスの使用を監視するアプリケーションを作成できます。たとえば、prtconf(1M)fuser(1M) の両方のコマンドで LDI を使用すると、システム管理者はデバイス使用のさまざまな局面を追跡できます。LDI については、第 14 章階層化ドライバインタフェース (LDI)で詳しく説明しています。

ドライバコンテキスト

ドライバコンテキストとは、ドライバが現在動作している状況のことを意味します。コンテキストは、ドライバが実行できる操作を制限します。ドライバコンテキストは、呼び出される実行コードによって異なります。ドライバコードは、次の 4 つのコンテキストで実行されます。

セクション 9F のマニュアルページには、各関数に使用できるコンテキストが記載されています。たとえば、カーネルコンテキストでは、ドライバは copyin(9F) を呼び出してはいけません。

エラーの出力

データ破壊などの予期しないエラーが発生した場合を除き、デバイスドライバからは通常メッセージは出力されません。ドライバのエントリポイントは代わりにエラーコードを返して、アプリケーションがエラーの処理方法を決定できるようにします。cmn_err(9F) 関数を使用してメッセージをシステムログに書き出せば、そのあとでコンソールに表示できます。

cmn_err(9F) によって解釈される書式文字列指定子は printf(3C) 書式文字列指定子に似ていますが、ビットフィールドを出力する %b 書式が追加されています。この書式文字列の最初の文字には特別な意味を持たせることができます。cmn_err(9F) の呼び出しでは、出力される重要度レベルを示すメッセージレベル (level) も指定します。詳細は、cmn_err(9F) のマニュアルページを参照してください。

CE_PANIC レベルには、システムをクラッシュさせるという副作用があります。このレベルは、システムが、続行することによってより多くの問題が発生するような不安定な状態である場合にだけ使用されます。このレベルは、デバッグ時にシステムコアダンプを取るためにも使用できます。CE_PANIC は本稼働デバイスドライバでは使用しません。

動的メモリー割り当て

デバイスドライバは、ドライバが作動させると宣言したすべての接続デバイスを同時に処理する準備ができている必要があります。ドライバが処理するデバイスの数には制限がありません。デバイスごとの情報をすべて動的に割り当てる必要があります。

void *kmem_alloc(size_t size, int flag);

標準的なカーネルメモリー割り当てルーチンは、kmem_alloc(9F) です。kmem_alloc() は C ライブラリルーチン malloc(3C) に似ていますが、flag 引数が追加されています。flag 引数には、要求されたサイズが使用できない場合に呼び出し側がブロックするかどうかを示す KM_SLEEP または KM_NOSLEEP を指定できます。KM_NOSLEEP が設定されていて、メモリーが使用できない場合、kmem_alloc(9F)NULL を返します。

kmem_zalloc(9F)kmem_alloc(9F) に似ていますが、割り当てられたメモリーの内容もクリアします。


注 - カーネルメモリーは限られた資源であり、ページング不可能なため、物理メモリーをめぐってユーザーアプリケーションやカーネルの残りの部分と競合します。ドライバが大量のカーネルメモリーを割り当てると、システム性能が低下する可能性があります。


void kmem_free(void *cp, size_t size);

kmem_alloc(9F) または kmem_zalloc(9F) によって割り当てられたメモリーは、kmem_free(9F) を使ってシステムに返されます。kmem_free() は C ライブラリルーチン free(3C) に似ていますが、size 引数が追加されています。ドライバは、あとで kmem_free(9F) を呼び出すために、割り当てられた各オブジェクトのサイズを追跡し記録する必要があります

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

このマニュアルには、ホットプラグによる取り付けに関する情報は載っていません。このドキュメントに記載されたデバイスドライバ作成のための規則や提案に従えば、ドライバでホットプラグによる取り付けを扱えるようになります。特に、自動構成 (第 6 章ドライバの自動構成を参照) と detach(9E) の両方がドライバで正しく機能することを確認してください。また、電源管理を使用するドライバを設計している場合は、第 12 章電源管理に記載された情報に従うようにしてください。SCSI HBA ドライバでは、ホットプラグによる取り付け機能を利用するために、cb_ops 構造体をその dev_ops 構造体 (第 18 章SCSI ホストバスアダプタドライバを参照) に追加することが必要な場合があります。

以前の Oracle Solaris OS バージョンでは、DT_HOTPLUG プロパティーを組み込むためにホットプラグ対応ドライバが必要でしたが、このプロパティーは必要なくなりました。ただし、ドライバの作成者が適切と思えば、DT_HOTPLUG プロパティーを組み込んで使用しても構いません。