ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
![]() |
デバイスドライバの記述 Oracle Solaris 11.1 Information Library (日本語) |
パート I Oracle Solaris プラットフォーム用デバイスドライバの設計
2. Oracle Solaris カーネルとデバイスツリー
22. ドライバのコンパイル、ロード、パッケージ化、およびテスト
23. デバイスドライバのデバッグ、テスト、およびチューニング
ドライバのインストールの前に次の手順があります。
ドライバをコンパイルします。
必要に応じて構成ファイルを作成します。
次のいずれかの方法で、システムでドライバモジュールが識別されるようにします。
ドライバの名前を、デバイスノードの名前と一致させます。
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 ユーザーガイド』および 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) に対するすべての呼び出しを有効にすることができます。
表 22-1 SPARC および x86 64 ビットアーキテクチャーのコンパイラオプション
|
注 - Oracle Solaris Studio 12.2 またはそれより古いコンパイラを使って 32 ビットまたは 64 ビット x86 アーキテクチャー向けのコンパイルを行う場合は、デフォルト値が SSE2 なので、-xarch=sse2a を追加しないでください。
![]() | 注意 - x86 カーネルでは MMX 命令はサポートされません。MMX 命令を使用するとカーネルパニックが発生するため、使用しないようにしてください。 |
ドライバが安定したら、最適化フラグを追加して本稼働品質のドライバをビルドできます。Oracle Solaris Studio C コンパイラでの最適化に関する具体的な情報については、Oracle Solaris Studio 12.3 Command-Line Reference の 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 にする必要があります。
x86 プラットフォームでは、ブートシステムによってデバイス情報が提供されるようになりました。非自己識別デバイスであっても、ハードウェア構成ファイルは不要となりました。
ハードウェア構成ファイルの詳細については、driver.conf(4)、pseudo(4)、sbus(4)、scsi_free_consistent_buf(9F)、および update_drv(1M) のマニュアルページを参照してください。
ハードウェア構成ファイルでは任意のプロパティーを定義できます。構成ファイル内のエントリは、property= value という形式です。property はプロパティー名で、value はプロパティーの初期値です。構成ファイルを使うアプローチでは、プロパティー値を変更することでデバイスの構成が可能です。