ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
デバイスドライバの記述 Oracle Solaris 11.1 Information Library (日本語) |
パート I Oracle Solaris プラットフォーム用デバイスドライバの設計
2. Oracle Solaris カーネルとデバイスツリー
probe() エントリポイント (SCSI ターゲットドライバ)
attach() エントリポイント (SCSI ターゲットドライバ)
detach() エントリポイント (SCSI ターゲットドライバ)
getinfo() エントリポイント (SCSI ターゲットドライバ)
scsi_alloc_consistent_buf() 関数
22. ドライバのコンパイル、ロード、パッケージ化、およびテスト
23. デバイスドライバのデバッグ、テスト、およびチューニング
Sun Common SCSI Architecture は、ターゲットドライバからホストバスアダプタドライバに SCSI コマンドを転送するための Solaris DDI/DKI プログラミングインタフェースです。このインタフェースは、ホストバスアダプタのハードウェアの種類、プラットフォーム、プロセッサのアーキテクチャー、およびインタフェース上でトランスポートされる SCSI コマンドには依存しません。
SCSA に準拠することで、ターゲットドライバはホストバスアダプタのハードウェア実装を認識することなく、SCSI コマンドをターゲットデバイスに渡すことができます。
概念上、SCSA は SCSI コマンドを構築することと、SCSI バスをまたいでデータとともにコマンドをトランスポートすることを区別しています。このアーキテクチャーは、高レベルと低レベルのソフトウェアコンポーネントの間のソフトウェアインタフェースを定義しています。高レベルソフトウェアコンポーネントは、1 つ以上の SCSI ターゲットドライバによって構成されます。このドライバは、I/O 要求を周辺デバイスにとって適切な SCSI コマンドに変換します。次の例に、SCSI のアーキテクチャーを示します。
下位レベルのソフトウェアコンポーネントは、SCSA インタフェース層と、1 つ以上のホストバスアダプタドライバから構成されています。ターゲットドライバは、必要な機能を実行するために必要とされる適切な SCSI コマンドの生成と、結果の処理を行います。
トランスポートエラーが発生しないと仮定すると、読み込みまたは書き込み要求の一般的な制御フローは、次に説明するステップのようになります。
ターゲットドライバの read(9E) または write(9E) エントリポイントが呼び出されます。メモリをロックダウンするために physio(9F) が使用され、buf 構造体の準備と strategy ルーチンの呼び出しが行われます。
ターゲットドライバの strategy(9E) ルーチンが要求をチェックします。strategy() は次に、scsi_init_pkt(9F) を使用して、scsi_pkt(9S) を割り当てます。ターゲットドライバはパケットを初期化し、scsi_setup_cdb(9F) 関数を使用して、SCSI コマンド記述子ブロック (CDB) を設定します。ターゲットドライバはタイムアウトも指定します。次に、ドライバはコールバック関数へのポインタを提供します。コールバック関数は、コマンドの完了時にホストバスアダプタドライバによって呼び出されます。buf(9S) ポインタは SCSI パケットのターゲット専用領域に保存される必要があります。
ターゲットドライバは scsi_transport(9F) を使用して、パケットをホストバスアダプタドライバに送信します。これでターゲットドライバは解放され、別の要求を受け入れることができます。ターゲットドライバは、パケットのトランスポート中にパケットにアクセスしてはいけません。ホストバスアダプタドライバまたはターゲットのいずれかがキューイングをサポートしている場合は、パケットのトランスポート中に新しい要求を送信できます。
SCSI が解放され、ターゲットがビジー状態でなくなるとすぐに、ホストバスアダプタドライバはターゲットを選択して CDB を渡します。ターゲットドライバはコマンドを実行します。ターゲットは次に、要求されたデータ転送を実行します。
ターゲットが完了ステータスを送信してコマンドが完了すると、ホストバスアダプタドライバはそれをターゲットドライバに通知します。通知を実行するため、ホストは SCSI パケットで指定されていた完了関数を呼び出します。この時点で、ホストバスアダプタドライバはパケットの処理を担当しておらず、ターゲットドライバがパケットの所有権を再取得しています。
SCSI パケットの完了ルーチンが、返された情報を分析します。完了ルーチンは次に、SCSI 操作が成功したかどうかを判定します。エラーが発生した場合、ターゲットドライバはもう一度 scsi_transport(9F) を呼び出して、コマンドを再試行します。ホストバスアダプタドライバが要求の自動検知をサポートしていない場合、ターゲットドライバは要求検知パケットを送信して、チェック条件に該当する場合に検知データを取得する必要があります。
正常に完了したあと、またはコマンドを再試行できない場合、ターゲットドライバは scsi_destroy_pkt(9F) を呼び出します。scsi_destroy_pkt() は、データを同期します。次に scsi_destroy_pkt() はパケットを解放します。パケットを解放する前にターゲットドライバがデータにアクセスする必要がある場合は、scsi_sync_pkt(9F) が呼び出されます。
最後に、ターゲットドライバは要求元アプリケーションに、読み取りまたは書き込みトランザクションが完了したことを通知します。この通知は、文字デバイスの場合、ドライバ内の read(9E) エントリポイントから通知が返されることによって行われます。それ以外の場合、通知は biodone(9F) を通して間接的に行われます。
SCSA によって、これらの操作の多くをプロセスのさまざまな時点で、オーバーラップとキューイングの両方の方法で実行できます。このモデルでは、ホストバスアダプタドライバでシステムリソースの管理が行われます。ソフトウェアインタフェースによって、さまざまな機能レベルの SCSI バスアダプタを使用して、ホストバスアダプタドライバでターゲットドライバ関数を実行できます。
SCSA では、資源の割り当てと解放、制御状態の検知と設定、SCSI コマンドのトランスポートを管理する関数が定義されています。次の表にこれらの関数を示します。
表 17-1 SCSA 標準関数
|