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

ドキュメントの情報

はじめに

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

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

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

3.  マルチスレッド

4.  プロパティー

5.  イベントの管理とタスクのキュー

6.  ドライバの自動設定

7.  デバイスアクセス: プログラム式入出力

8.  割り込みハンドラ

9.  ダイレクトメモリーアクセス (DMA)

10.  デバイスメモリーおよびカーネルメモリーのマッピング

11.  デバイスコンテキスト管理

12.  電源管理

13.  Solaris ドライバの強化

14.  階層化ドライバインタフェース (LDI)

パート II 特定の種類のデバイスドライバの設計

15.  文字デバイスのドライバ

16.  ブロックデバイスのドライバ

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

ターゲットデバイスの概要

Sun Common SCSI Architecture の概要

一般的な制御フロー

SCSA 関数

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

宣言とデータ構造体

scsi_device 構造体

scsi_pkt 構造体 (ターゲットドライバ)

SCSI ターゲットドライバの自動構成

probe() エントリポイント (SCSI ターゲットドライバ)

attach() エントリポイント (SCSI ターゲットドライバ)

detach() エントリポイント (SCSI ターゲットドライバ)

getinfo() エントリポイント (SCSI ターゲットドライバ)

資源割り当て

scsi_init_pkt() 関数

scsi_sync_pkt() 関数

scsi_destroy_pkt() 関数

scsi_alloc_consistent_buf() 関数

scsi_free_consistent_buf() 関数

コマンドの構築とトランスポート

コマンドの構築

ターゲット機能の設定

コマンドのトランスポート

同期 scsi_transport() 関数

コマンドの完了

パケットの再利用

自動要求検知モード

ダンプの処理

SCSI オプション

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

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

20.  USB ドライバ

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

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

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

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

パート IV 付録

A.  ハードウェアの概要

B.  Solaris DDI/DKI サービスの概要

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

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

索引

資源割り当て

SCSI コマンドをデバイスに送信するには、ターゲットドライバで scsi_pkt(9S) 構造体を作成して初期化する必要があります。次に、この構造体をホストバスアダプタドライバに渡す必要があります。

scsi_init_pkt() 関数

scsi_init_pkt(9F) ルーチンは scsi_pkt(9S) 構造体を割り当てて 0 に設定します。 scsi_init_pkt() は、pkt_private *pkt_scbp、および *pkt_cdbp へのポインタも設定します。さらに、scsi_init_pkt () は資源を使用できない場合を処理するコールバック機構を提供します。この関数の構文は次のとおりです。

struct scsi_pkt *scsi_init_pkt(struct scsi_address *ap,
     struct scsi_pkt *pktp, struct buf *bp, int cmdlen,
     int statuslen, int privatelen, int flags,
     int (*callback)(caddr_t), caddr_t arg)

各表記の意味は次のとおりです。

ap

scsi_address 構造体へのポインタです。ap は、デバイスの scsi_device(9S) 構造体の sd_address フィールドです。

pktp

初期化する scsi_pkt(9S) 構造体へのポインタです。このポインタが NULL に設定されている場合、新しいパケットが割り当てられます。

bp

buf(9S) 構造対へのポインタです。このポインタが NULL ではなく、有効なバイトカウントがある場合、DMA 資源が割り当てられます。

cmdlen

SCSI コマンド記述子ブロックの長さ (バイト単位) です。

statuslen

SCSI ステータス完了ブロックの必要な長さ (バイト単位) です。

privatelen

pkt_private フィールドのために割り当てるバイト数です。

flags

フラグのセットです。

  • PKT_CONSISTENTscsi_alloc_consistent_buf(9F) を使用して DMA バッファーが割り当てられた場合は、このビットを設定する必要があります。この場合、ホストバスアダプタドライバによって、ターゲットドライバのコマンド完了コールバックを実行する前にデータ転送が適切に同期されることが保証されます。

  • PKT_DMA_PARTIAL – ドライバが部分的な DMA マッピングを受け入れる場合、このビットを設定できます。設定されている場合、scsi_init_pkt(9F)DDI_DMA_PARTIAL フラグを設定して、DMA 資源を割り当てます。scsi_pkt(9S) 構造体の pkt_resid フィールドは、ゼロ以外の未処理の内容を格納して復帰できます。ゼロ以外の値は、scsi_init_pkt(9F) が DMA 資源を割り当てることができなかったバイト数を示します。

callback

資源を使用できない場合に実行する処理を指定します。NULL_FUNC に設定されている場合、scsi_init_pkt(9F) はすぐに値 NULL を返します。SLEEP_FUNC に設定されている場合、資源が使用可能になるまで scsi_init_pkt() は復帰しません。その他すべての有効なカーネルアドレスは、資源が使用可能になる可能性が高いときに呼び出される関数のアドレスとして解釈されます。

arg

コールバック関数に渡されるパラメータです。

scsi_init_pkt() ルーチンはトランスポート前にデータを同期します。トランスポート後にドライバがデータにアクセスする必要がある場合は、ドライバで scsi_sync_pkt(9F) を呼び出して、中間キャッシュをすべてフラッシュする必要があります。scsi_sync_pkt () ルーチンを使用すると、キャッシュされているすべてのデータを同期できます。

scsi_sync_pkt() 関数

ターゲットドライバが、データの変更後にパケットを再送信する必要がある場合は、scsi_transport(9F) を呼び出す前に scsi_sync_pkt(9F) を呼び出す必要があります。ただし、ターゲットドライバがデータにアクセスする必要がない場合は、トランスポート後に scsi_sync_pkt() を呼び出す必要はありません。

scsi_destroy_pkt() 関数

scsi_destroy_pkt(9F) ルーチンは、必要な場合、パケットに関連付けられている、残りすべてのキャッシュデータを同期します。このルーチンは次に、パケットと、関連付けられているコマンド、ステータス、およびターゲットのドライバの非公開データ領域を解放します。このルーチンは、コマンド完了ルーチンで呼び出す必要があります。

scsi_alloc_consistent_buf() 関数

ほとんどの入出力要求で、ドライバのエントリポイントに渡されるデータバッファーは、ドライバから直接アクセスされることはありません。バッファーは scsi_init_pkt(9F) に渡されるのみです。ドライバがSCSI コマンドを送信し、その操作対象がドライバ自体が調べているバッファーである場合、バッファーの DMA に整合性が必要です。SCSI 要求検知コマンドがその良い例です。scsi_alloc_consistent_buf(9F) ルーチンは buf(9S) 構造体と、DMA が一定である操作に適したデータバッファーを割り当てます。HBA は、コマンド完了コールバックを実行する前に、必要なバッファーの同期をすべて実行します。


注 - scsi_alloc_consistent_buf(9F) は不足しているシステム資源を使用します。そのため、 scsi_alloc_consistent_buf() は慎重に使用してください。


scsi_free_consistent_buf() 関数

scsi_free_consistent_buf(9F) は、buf(9S) 構造体と、scsi_alloc_consistent_buf(9F)によって割り当てられた、関連付けられているデータバッファーを解放します。例については、attach() エントリポイント (SCSI ターゲットドライバ)」detach() エントリポイント (SCSI ターゲットドライバ)」を参照してください。