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

ドキュメントの情報

はじめに

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

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

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

カーネルとは

マルチスレッドの実行環境

仮想メモリー

特殊ファイルとしてのデバイス

DDI/DKI インタフェース

デバイスツリーの概要

デバイスツリーコンポーネント

デバイスツリーの表示

libdevinfo ライブラリ

prtconf コマンド

/devices ディレクトリ

ドライバのデバイスへのバインド

汎用デバイス名

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.  コンソールフレームバッファードライバ

索引

カーネルとは

Solaris カーネルはシステムリソースを管理するプログラムです。カーネルはシステムハードウェアからアプリケーションを隔離し、入出力 (I/O) 管理、仮想メモリー、スケジューリングなどの重要なシステムサービスをアプリケーションに提供します。カーネルは、必要なときにメモリーに動的にロードされるオブジェクトモジュールから構成されます。

Solaris カーネルは論理的に 2 つの部分に分割できます。カーネルと呼ばれる最初の部分は、ファイルシステム、スケジューリング、および仮想メモリーを管理します。I/O サブシステムと呼ばれる 2 番目の部分は物理コンポーネントを管理します。

カーネルはアプリケーションが使用するインタフェースのセットを提供します。これらのインタフェースにはシステムコールを通してアクセスできます。システムコールについては、リファレンスマニュアルコレクション(Intro(2)を参照) の第 2 節に説明があります。一部のシステムコールは、I/O を実行するデバイスドライバを呼び出すために使用されます。デバイスドライバはロード可能なカーネルモジュールで、カーネルの残りの部分をデバイスハードウェアから隔離するのと同時にデータ転送を管理します。オペレーティングシステムとの互換性を確保するため、デバイスドライバはマルチスレッド化、仮想メモリーアドレス指定、32 ビットと 64 ビット両方の操作などの機能に対応できる必要があります。

次の図はカーネルを示しています。カーネルモジュールはアプリケーションプログラムからのシステムコールを処理します。I/O モジュールはハードウェアと通信します。

図 2-1 Solaris カーネル

image:図は、ユーザーレベルのアプリケーションから特定のカーネルレベルモジュールへの呼び出しと、ドライバ間およびその他のモジュールからデバイスへの呼び出しを示しています。

カーネルは次の機能を通してデバイスドライバへのアクセスを提供します。

マルチスレッドの実行環境

Solaris カーネルはマルチスレッドです。マルチプロセッサマシンでは、複数のカーネルスレッドでカーネルコードを実行可能であり、カーネルコードを平行して実行できます。カーネルスレッドも、いつでもその他のカーネルスレッドに横取りできます。

カーネルのマルチスレッド化では、デバイスドライバにいくつかの追加の制限が発生します。マルチスレッドの考慮事項の詳細情報については、第 3 章マルチスレッドを参照してください。デバイスドライバのコードは、多くの異なるスレッドの要求時に必要に応じて実行されるように記述する必要があります。ドライバはスレッドごとに、I/O 要求が重なることで発生する競合の問題を処理する必要があります。

仮想メモリー

Solaris 仮想メモリーシステムの全体的な概要については、このマニュアルが対象とする範囲に含まれていませんが、デバイスドライバについて説明するときに特に重要な仮想メモリー用語として、仮想アドレスとアドレス空間という 2 つの用語を使用しています。

特殊ファイルとしてのデバイス

デバイスは、ファイルシステム内では特殊ファイルによって表されます。Solaris OS では、これらのファイルは /devices ディレクトリ階層にあります。

特殊ファイルは、ブロック型または文字型のいずれかです。この型は、どの種類のデバイスドライバがデバイスを操作するかを示します。ドライバは両方の型で動作するように実装できます。たとえば、ディスクドライバは fsck(1) および mkfs(1) ユーティリティーで使用するために文字インタフェースをエクスポートし、ファイルシステムで使用するためにブロックインタフェースをエクスポートします。

各特殊ファイルにはデバイス番号 ( dev_t) が関連付けられます。デバイス番号はメジャー番号マイナー番号から構成されています。メジャー番号は、その特殊ファイルに関連付けられているデバイスドライバを識別します。マイナー番号は、特殊ファイルをさらに区別するために、デバイスドライバによって作成され、使用されます。通常、マイナー番号は、ドライバがアクセスする必要があるデバイスインスタンスと、実行する必要のあるアクセスの種類を識別するために使用されるエンコードです。たとえば、マイナー番号によって、バックアップのために使用されるテープデバイスを識別し、バックアップ操作が完了したときにはテープを巻き戻す必要があることを指定できます。

DDI/DKI インタフェース

System V Release 4 (SVR4) では、デバイスドライバと残りの UNIX カーネルとの間のインタフェースが DDI/DKI として標準化されました。DDI/DKI については、リファレンスマニュアルコレクションの第 9 節に説明があります。第 9E 節にはドライバのエントリポイントについての説明、第 9F 節にはドライバから呼び出すことができる関数についての説明、第 9S 節にはデバイスドライバによって使用されるカーネルのデータ構造についての説明があります。Intro(9E)Intro(9F)、およびIntro(9S)を参照してください。

DDI/DKI はデバイスドライバと残りのカーネルの間のインタフェースをすべて標準化し、文書化することを目的としています。さらに、DDI/DKI によって、Solaris OS を実行する任意のマシンでは、プロセッサのアーキテクチャーが SPARC であるか x86 であるかにかかわらず、ドライバのソースレベルとバイナリレベルの互換性が実現されます。DDI/DKI の一部になっているカーネル機能のみを使用するドライバは、DDI/DKI 準拠デバイスドライバと呼ばれます。

DDI/DKI を使用すると、Solaris OS を実行する任意のマシンのためにプラットフォームに依存しないデバイスドライバを記述できます。これらのバイナリレベルの互換性があるドライバによって、他社製のハードウェアとソフトウェアを、より簡単に Solaris OS を実行する任意のマシンに統合できます。DDI/DKI はアーキテクチャーに依存しないため、同じドライバが一連の多様なマシンアーキテクチャーにわたって動作可能です。

プラットフォームへの非依存は、次の領域における DDI のデザインによって実現されています。