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

ドキュメントの情報

はじめに

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

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

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.  ドライバのコンパイル、ロード、パッケージ化、およびテスト

ドライバ開発のサマリー

ドライバコードの配置

ヘッダーファイル

ソースファイル

構成ファイル

ドライバインストールの準備

ドライバのコンパイルとリンク

モジュールの依存関係

ハードウェア構成ファイルの記述

ドライバのインストール、更新、および削除

モジュールディレクトリへのドライバのコピー

add_drv を使用したドライバのインストール

ドライバ情報の更新

ドライバの削除

ドライバのロードとアンロード

ドライバのパッケージ化

パッケージのインストール後処理

パッケージの削除前処理

デバイステストの条件

構成のテスト

機能テスト

エラー処理

ロードとアンロードのテスト

ストレス、パフォーマンス、および相互運用性のテスト

DDI/DKI コンプライアンスのテスト

インストールとパッケージ化のテスト

特定の種類のドライバのテスト

テープドライバ

ディスクドライバ

非同期通信ドライバ

ネットワークドライバ

SR-IOV ドライバのテスト

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

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

パート IV 付録

A.  ハードウェアの概要

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

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

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

E.  pci.conf ファイル

索引

ドライバインストールの準備

ドライバのインストールの前に次の手順があります。

  1. ドライバをコンパイルします。

  2. 必要に応じて構成ファイルを作成します。

  3. 次のいずれかの方法で、システムでドライバモジュールが識別されるようにします。

    • ドライバの名前を、デバイスノードの名前と一致させます。

    • add_drv(1M) または update_drv(1M) を使用して、システムにモジュール名を通知します。

システムは、ドライバモジュールの名前と dev_info ノードの名前の間に 1 対 1 の関連付けを維持します。たとえば、mydevice という名前のデバイスの dev_info ノードについて考えます。デバイス mydevice は、同様に mydevice という名前のドライバモジュールによって処理されます。mydevice モジュールは、モジュールのパス内にある drv という名前のサブディレクトリに置かれます。32 ビットカーネルを使用している場合、モジュールは drv/mydevice 内にあります。64 ビット SPARC カーネルを使用している場合、モジュールは drv/sparcv9/mydevice 内にあります。64 ビット x86 カーネルを使用している場合、モジュールは drv/amd64/mydevice 内にあります。

STREAMS ネットワークドライバの場合、ドライバ名が次の制約を満たしている必要があります。

ドライバで、異なる名前を持つ dev_info ノードを管理する必要がある場合は、add_drv(1M) ユーティリティーで別名を作成できます。-i フラグでは、ドライバで処理するほかの dev_info ノードの名前を指定します。update_drv コマンドでも、インストールされているデバイスドライバの別名を変更できます。

ドライバのコンパイルとリンク

ドライバのソースファイルをそれぞれコンパイルし、得られたオブジェクトファイルをドライバモジュール内にリンクする必要があります。Oracle Solaris OS は Oracle Solaris Studio C コンパイラ、および Free Software Foundation, Inc. の GNU C コンパイラの両方と互換性があります。このセクションの例では、特に記載している場合を除いて、Oracle Solaris Studio C コンパイラを使用しています。Oracle Solaris Studio C コンパイラについては、『Oracle Solaris Studio 12.3: C ユーザーガイド』および Oracle Technology Network Web サイトにある Oracle Solaris Studio のドキュメントを参照してください。コンパイルとリンクのオプションの詳細については、Oracle Solaris Studio のマニュアルページ (http://docs.oracle.com/cd/E24457_01/html/E22003/index.html) を参照してください。GNU C コンパイラは /usr/sfw ディレクトリにあります。GNU C コンパイラについては、http://gcc.gnu.org/ を参照してください。

下の例は、2 つの C ソースファイルを持つ xx という名前のドライバを示しています。xx という名前のドライバモジュールが生成されます。この例で作成されるドライバは 32 ビットカーネル用です。ドライバが持つオブジェクトモジュールが 1 つだけであっても ld -r を使用する必要があります。

% cc -D_KERNEL -c xx1.c
% cc -D_KERNEL -c xx2.c
% ld -r -o xx xx1.o xx2.o

このコードがカーネルモジュールを定義していることを示すため、_KERNEL シンボルが定義されている必要があります。ドライバの private シンボルを除き、ほかのシンボルが定義されていてはいけません。DEBUG シンボルを定義すると、ASSERT(9F) に対するすべての呼び出しを有効にすることができます。

Sun Studio 9、Sun Studio 10、または Sun Studio 11 を使用して 64 ビット SPARC アーキテクチャー向けにコンパイルする場合は、-xarch=v9 オプションを使用します。

% cc -D_KERNEL -xarch=v9 -c xx.c

Sun Studio 12 を使用して 64 ビット SPARC アーキテクチャー向けにコンパイルする場合は、-m64 オプションを使用します。

% cc -D_KERNEL -m64 -c xx.c

Sun Studio 10 または Sun Studio 11 を使用して 64 ビット x86 アーキテクチャー向けにコンパイルする場合は、-xarch=amd64 オプションと -xmodel=kernel オプションの両方を使用します。

% cc -D_KERNEL -xarch=amd64 -xmodel=kernel -c xx.c

Oracle Solaris Studio 12 を使用して 64 ビット x86 アーキテクチャー向けにコンパイルする場合は、-m64 オプション、-xarch=sse2a オプション、および -xmodel=kernel オプションを使用します。

% cc -D_KERNEL -m64 -xarch=sse2a -xmodel=kernel -c xx.c

注 - Sun Studio 9 は 64 ビット x86 アーキテクチャーをサポートしていません。64 ビット x86 アーキテクチャー用ドライバのコンパイルとデバッグを行うには、Sun Studio 10、Sun Studio 11、または Oracle Solaris Studio 12 を使用します。


ドライバが安定したら、最適化フラグを追加して本稼働品質のドライバをビルドできます。Oracle Solaris Studio C コンパイラでの最適化に関する具体的な情報については、Oracle Solaris Studio 12.3 のコマンド行リファレンスマニュアルにある cc(1) のマニュアルページを参照してください。

グローバル変数は、デバイスドライバ内では volatile として処理する必要があります。volatile タグについては、「変数の volatile 宣言」で詳細に説明します。このフラグの用途はプラットフォームに応じて異なります。マニュアルページを参照してください。

モジュールの依存関係

ドライバモジュールが別のカーネルモジュールによってエクスポートされたシンボルに依存している場合、ローダー ld(1)-dy および -N オプションによって依存関係を指定できます。ドライバが misc/mySymbol によってエクスポートされたシンボルに依存している場合、下の例を使用してドライババイナリを作成する必要があります。

% ld -dy -r -o xx xx1.o xx2.o -N misc/mySymbol

ハードウェア構成ファイルの記述

デバイスが自己識別型でない場合、カーネルのために、そのデバイスのハードウェア構成ファイルが必要です。ドライバの名前が xx の場合、ドライバのハードウェア構成ファイルの名前は xx .conf にする必要があります。ハードウェア構成ファイルの詳細については、driver.conf(4)pseudo(4)sbus(4)scsi_free_consistent_buf(9F)、および update_drv(1M) のマニュアルページを参照してください。

ハードウェア構成ファイルでは任意のプロパティーを定義できます。構成ファイル内のエントリは、property= value という形式です。property はプロパティー名で、value はプロパティーの初期値です。構成ファイルを使うアプローチでは、プロパティー値を変更することでデバイスの構成が可能です。