Oracle® Solaris 11.2 デバイスドライバの記述

印刷ビューの終了

更新: 2014 年 9 月
 
 

一般的な制御フロー

トランスポートエラーが発生しないと仮定すると、読み込みまたは書き込み要求の一般的な制御フローは、次に説明するステップのようになります。

  1. ターゲットドライバの read(9E) またはwrite (9E) エントリポイントが呼び出されます。メモリーをロックダウンするために physio (9F) が使用され、buf 構造体の準備と strategy ルーチンの呼び出しが行われます。

  2. ターゲットドライバの strategy (9E) ルーチンが要求をチェックします。strategy() は次に、scsi_init_pkt(9F) を使用して、scsi_pkt(9S) を割り当てます。ターゲットドライバはパケットを初期化し、scsi_setup_cdb(9F) 関数を使用して、SCSI コマンド記述子ブロック (CDB) を設定します。ターゲットドライバはタイムアウトも指定します。次に、ドライバはコールバック関数へのポインタを提供します。コールバック関数は、コマンドの完了時にホストバスアダプタドライバによって呼び出されます。buf (9S) ポインタは SCSI パケットのターゲット専用領域に保存される必要があります。

  3. ターゲットドライバは scsi_transport(9F) を使用して、パケットをホストバスアダプタドライバに送信します。これでターゲットドライバは解放され、別の要求を受け入れることができます。ターゲットドライバは、パケットのトランスポート中にパケットにアクセスしてはいけません。ホストバスアダプタドライバまたはターゲットのいずれかがキューイングをサポートしている場合は、パケットのトランスポート中に新しい要求を送信できます。

  4. SCSI が解放され、ターゲットがビジー状態でなくなるとすぐに、ホストバスアダプタドライバはターゲットを選択して CDB を渡します。ターゲットドライバはコマンドを実行します。ターゲットは次に、要求されたデータ転送を実行します。

  5. ターゲットが完了ステータスを送信してコマンドが完了すると、ホストバスアダプタドライバはそれをターゲットドライバに通知します。通知を実行するため、ホストは SCSI パケットで指定されていた完了関数を呼び出します。この時点で、ホストバスアダプタドライバはパケットの処理を担当しておらず、ターゲットドライバがパケットの所有権を再取得しています。

  6. SCSI パケットの完了ルーチンが、返された情報を分析します。完了ルーチンは次に、SCSI 操作が成功したかどうかを判定します。エラーが発生した場合、ターゲットドライバはもう一度 scsi_transport(9F) を呼び出して、コマンドを再試行します。ホストバスアダプタドライバが要求の自動検知をサポートしていない場合、ターゲットドライバは要求検知パケットを送信して、チェック条件に該当する場合に検知データを取得する必要があります。

  7. 正常に完了したあと、またはコマンドを再試行できない場合、ターゲットドライバは scsi_destroy_pkt (9F) を呼び出します。scsi_destroy_pkt() は、データを同期します。次に scsi_destroy_pkt() はパケットを解放します。パケットを解放する前にターゲットドライバがデータにアクセスする必要がある場合は、scsi_sync_pkt(9F) が呼び出されます。

  8. 最後に、ターゲットドライバは要求元アプリケーションに、読み取りまたは書き込みトランザクションが完了したことを通知します。この通知は、文字デバイスの場合、ドライバ内の read(9E) エントリポイントから通知が返されることによって行われます。それ以外の場合、通知は biodone(9F) を通して間接的に行われます。

SCSA によって、これらの操作の多くをプロセスのさまざまな時点で、オーバーラップとキューイングの両方の方法で実行できます。このモデルでは、ホストバスアダプタドライバでシステムリソースの管理が行われます。ソフトウェアインタフェースによって、さまざまな機能レベルの SCSI バスアダプタを使用して、ホストバスアダプタドライバでターゲットドライバ関数を実行できます。