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.  ブロックデバイスのドライバ

ブロックドライバの構造の概要

ファイル入出力

ブロックデバイスの自動構成

デバイスアクセスの制御

open() エントリポイント (ブロックドライバ)

close() エントリポイント (ブロックドライバ)

strategy() エントリポイント

buf 構造体

bp_mapin 構造体

同期データ転送 (ブロックドライバ)

非同期データ転送 (ブロックドライバ)

無効な buf 要求のチェック

要求のキューへの入力

最初の転送の開始

割り込んでいるデバイスの処理

dump() エントリポイントと print() エントリポイント

dump() エントリポイント (ブロックドライバ)

print() エントリポイント (ブロックドライバ)

ディスク装置ドライバ

ディスクの ioctl

ディスクパフォーマンス

17.  SCSI ターゲットドライバ

18.  SCSI ホストバスアダプタドライバ

19.  ネットワークデバイスのドライバ

20.  USB ドライバ

21.  SR-IOV ドライバ

パート III デバイスドライバの構築

22.  ドライバのコンパイル、ロード、パッケージ化、およびテスト

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

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

パート IV 付録

A.  ハードウェアの概要

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

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

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

E.  pci.conf ファイル

索引

ディスク装置ドライバ

ディスク装置は、ブロックデバイスドライバの重要なクラスを表します。

ディスクの ioctl

Oracle Solaris ディスクドライバは、Oracle Solaris ディスクドライバに固有の ioctl コマンドの最小限のセットをサポートする必要があります。これらの入出力制御は、dkio(7I) のマニュアルページで指定されています。ディスク入出力制御は、デバイスドライバとの間でディスク情報を転送します。Oracle Solaris ディスク装置は、format(1M)newfs(1M) などのディスクユーティリティーコマンドでサポートされています。必須のディスク入出力制御は次のとおりです。

DKIOCINFO

ディスク制御装置を記述した情報を返します。

DKIOCGAPART

ディスクのパーティションマップを返します。

DKIOCSAPART

ディスクのパーティションマップを設定します。

DKIOCGGEOM

ディスクのジオメトリを返します。

DKIOCSGEOM

ディスクのジオメトリを設定します。

DKIOCGVTOC

ディスクのボリューム構成テーブルを返します。

DKIOCSVTOC

ディスクのボリューム構成テーブルを設定します。

ディスクパフォーマンス

Oracle Solaris DDI/DKI は、ファイルシステムのパフォーマンスを向上させるために入出力転送を最適化する機能を提供します。このメカニズムでは、ファイルシステムのディスクアクセスが最適化されるように入出力要求のリストが管理されます。入出力要求のキューへの入力の説明については、「非同期データ転送 (ブロックドライバ)」を参照してください。

diskhd 構造体は、入出力要求のリンクリストを管理するために使用されます。

struct diskhd {
    long     b_flags;         /* not used, needed for consistency*/
    struct   buf *b_forw,    *b_back;       /* queue of unit queues */
    struct   buf *av_forw,    *av_back;    /* queue of bufs for this unit */
    long     b_bcount;            /* active flag */
};

diskhd データ構造体には、ドライバが操作できる 2 つの buf ポインタがあります。av_forw ポインタは、最初のアクティブな入出力要求を指しています。2 番目のポインタである av_back は、リスト上の最後のアクティブな要求を指しています。

disksort(9F) には、この構造体へのポインタが、処理されている現在の buf 構造体へのポインタとともに引数として渡されます。disksort() ルーチンは、ディスクのシークを最適化するために buf 要求をソートします。このルーチンは次に、buf ポインタを diskhd リストに挿入します。disksort() プログラムは、buf 構造体の b_resid 内にある値をソートキーとして使用します。ドライバは、この値の設定を担当します。ほとんどの Oracle ディスクドライバは、シリンダグループをソートキーとして使用します。このアプローチによって、ファイルシステムの先読みアクセスが最適化されます。

diskhd リストにデータが追加されたら、デバイスはそのデータを転送する必要があります。デバイスが要求の処理によってビジー状態でない場合、xxstart() ルーチンは最初の buf 構造体を diskhd リストから取得し、転送を開始します。

デバイスがビジー状態の場合、ドライバは xxstrategy() エントリポイントから復帰します。ハードウェアでのデータ転送が完了すると、割り込みが生成されます。次に、デバイスに対する処理を行うために、ドライバの割り込みルーチンが呼び出されます。割り込みに対する処理を行ったあと、ドライバは、diskhd リスト内の次の buf 構造体を処理するために start() ルーチンを呼び出すことができます。