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

印刷ビューの終了

更新: 2016 年 11 月
 
 

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

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

  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 ネットワークドライバの場合、ドライバ名が次の制約を満たしている必要があります。

  • 英数字 (a-z、A-Z、0-9) と下線 ('_') のみを使用できます。

  • 名前の最初と最後の文字はどちらも数字にすることができません。

  • 名前の長さは 16 文字を超えることはできません。推奨される名前の長さは 3 文字から 8 文字の範囲です。

ドライバで、異なる名前を持つ 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 User???s Guideおよび Oracle Solaris Studio Documentation を参照してください。コンパイルおよびリンクオプションの詳細については、Oracle Solaris Studio 12.3 Command-Line Reference ドキュメントを参照してください。GNU C コンパイラは /usr/sfw ディレクトリにあります。GNU C コンパイラについては、http://gcc.gnu.org/ を参照するか、/usr/sfw/man のマニュアルページを調べてください。

下の例は、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) に対するすべての呼び出しを有効にできます。

表 24  SPARC および x86 64 ビットアーキテクチャーのコンパイラオプション
コンパイラ
SPARC 64
x86 64
Studio 9
cc -D_KERNEL -xarch=v9 -c xx.c
サポートされていません
Studio 10
cc -D_KERNEL -xarch=v9 -c xx.c
cc -D_KERNEL -xarch=amd64 -xmodel=kernel -c xx.c
Studio 11
cc -D_KERNEL -xarch=v9 -c xx.c
cc -D_KERNEL -xarch=amd64 -xmodel=kernel -c xx.c
Oracle Solaris Studio 12
cc -D_KERNEL -m64 -c xx.c
cc -D_KERNEL -m64 -xmodel=kernel -c xx.c

–xmodel オプションを使用すると、コンパイラで Oracle Solaris x64 プラットフォーム用の 64 ビット共有オブジェクトを作成できます。このオプションは、そのようなオブジェクトのコンパイル時にのみ指定してください。詳細は、Oracle Solaris Studio 12.3: C User's Guide–xmodel オプションの説明を参照してください。


Caution

注意  -  Oracle Solaris Studio コンパイラを使用して、32 ビットまたは 64 ビットの x86 アーキテクチャー向けにコンパイルする場合は、コンパイルしても MMX 命令または SSE 命令が生成されないことを確認する必要があります。x86 カーネルでは MMX 命令および SSE 命令はサポートされません。MMX 命令または SSE 命令を使用するとカーネルパニックが発生するため、使用しないようにしてください。


次の表は、x86 アーキテクチャー向けの MMX 命令または SSE 命令を使用せずにコードを生成する際の考慮事項およびコンパイラオプションを示しています。

表 25  x86 アーキテクチャー向けの MMX 命令または SSE 命令を使用せずにコードを生成する際の考慮事項およびコンパイラオプション
Oracle Solaris Studio コンパイラバージョン
64 ビット用のコンパイル
32 ビット用のコンパイル
12.3 以前
  • ソースコードで浮動小数点型を使用しないでください。

  • -xvector=no コンパイラオプションを使用して、マイクロベクトル化を無効にします。

デフォルトでは、コンパイラは MMX 命令または SSE 命令を使用せずにコードを生成します。したがって、MMX 命令または SSE2 命令には –xarch オプション (sse2sse2a など) を追加しないでください。すべての –xarch 値のリストについては、『Oracle Solaris Studio 12.3: C ユーザーガイド』を参照してください。
12.4 以降
SSE2 命令の生成を回避するには、-xregs=no%float コンパイラオプションを使用します。
デフォルトでは、コンパイラは -xarch=sse2 オプションを使用して、SSE2 命令を追加します。したがって、-xregs=no%float コンパイラオプションを使用してください。

ドライバが安定したら、最適化フラグを追加して本稼働品質のドライバをビルドできます。Oracle Solaris Studio C コンパイラでの最適化に関する具体的な情報については、Oracle Solaris Studio 12.3 Command-Line Referencecc(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 にする必要があります。

x86 プラットフォームでは、ブートシステムによってデバイス情報が提供されるようになりました。非自己識別デバイスであっても、ハードウェア構成ファイルは不要となりました。

ハードウェア構成ファイルの詳細については、driver.conf(4)pseudo(4)sbus (4) 、scsi_free_consistent_buf(9F)、および update_drv(1M) のマニュアルページを参照してください。

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