Storport によって提供される機能
Storport ドライバーには、次のものが用意されています。
アドレス指定
Microsoft Windows では、異なる種類の I/O バスや、同じ種類の複数の I/O バスを含むシステムがサポートされています。 この多様性を処理するには、一般的なアドレス指定スキームが必要です。
PCI デバイスは、I/O ポートとメモリ レジスタ リソースの両方を持つことができます。 論理アドレスは、この区別をポート ドライバーに対して透過的にするために役立ちます。
一部のシステムには、複数のバスに接続されている HBA が含まれています。このような HBA では、複数のアドレス変換セットが必要になる場合があります。
CISC ベースおよび RISC ベースのマシン間の移植性には、論理アドレスが必要です。
再試行とエラー処理
記憶域クラス ドライバーは、デバイスがビジー状態で処理できない場合に IRP を再試行するためのアルゴリズムを実装する必要はありません。 Storport ドライバーは、この機能を実装します。
クラス ドライバーは要求のタイムアウト値を設定し、Storport は要求の適用を担当します。 ただし、Storport ドライバーは、バスの状態を考慮に入れて、クラス ドライバーのタイムアウト値を柔軟に適用できます。 たとえば、Storport によって管理されているファイバー チャネル リンクが 20 秒間ドロップした場合、Storport はダウンタイム中にタイムアウト カウンターを中断する可能性があります。そのため、たとえば、タイムアウトが 10 秒の要求は、リンクがバックアップされてから 10 秒後まではエラーになりません。 Storport は、I/O トラフィックの増加に応じて要求に割り当てられるタイムアウト値を増やします。I/O トラフィックが多い場合、デバイスは要求を完了するためにより多くの時間を必要とするためです。
Storport は、ターゲット エラーとコントローラービジー エラー、トランスポート エラー状態 (つまり、バス上のデータの実際の転送に関連するエラー) を処理します。 次に例を示します。
- bus-parity エラー
- 選択タイムアウト
構成、キュー、電源状態の管理
ホスト アダプターの制限に関する情報をクラス ドライバーに提供します: クラス ドライバーは、ホスト バス アダプター (HBA) の制限に合わせてデータ転送のサイズを調整する必要があります。 ただし、Storport は、このタスクを実行するために必要な情報をクラス ドライバーに提供します。 Storport は、 IOCTL 要求 (IOCTL_STORAGE_QUERY_PROPERTY) に応答してアダプター記述子 (STORAGE_ADAPTER_DESCRIPTOR) にこの情報を提供します。 クラス ドライバーは、この記述子で報告された情報に基づいて、要求を適切なサイズのチャンクに分割します。
バスの相対アドレスを論理アドレスに変換します: 照会されると、アダプターは I/O ポート、コマンド レジスタ、制御状態レジスタのバス相対アドレスを提供します。 ただし、ミニポート ドライバーは、ホスト バス アダプター (HBA) と通信するバス相対アドレスを使用できません。 Storport は、ミニポート ドライバーが透過的な方法でバス アドレスにアクセスできるように、論理アドレスにバスの相対アドレスを変換します。 それには、いくつかの理由があります。
デバイスが起動する前に、デバイスとその基になるすべてのデバイスが (D0 デバイスの電源状態で) 電源がオンになっていることを確認します。デバイスの電源を入れる準備ができていないと、Storport はデバイスの準備ができるまでそのデバイスの D0 要求をキューに入れます。
クラス ドライバーからの非同期要求をキューに格納し、ターゲット デバイスに非同期的に転送します: クラス ドライバーは、次の要求を送信する前に要求が完了するのを待つ必要はありません。 Storport は、基になるハードウェアの処理能力を超えないように、これらの要求をキューに入れます。
内部 I/O 要求キューの内部管理と外部管理の両方のサポート: ほとんどのキュー管理操作は、Storport 自体によって開始されます。 たとえば、Storport は、エラーが発生したときにキューを固定し、クラス ドライバーにエラー状態を報告して、さらに要求が処理される前にクラス ドライバーが応答できるようにします。 ただし、Storport は、クラス ドライバーまたはその他の上位レベルのドライバーからの要求にも応答して、内部要求キューをロック、ロック解除、固定、固定解除のいずれかを行います。 上位レベルのドライバーは、SRB_FUNCTION_RELEASE_QUEUE 要求を使用して、Storport の内部キューの固定を解除することを強制できます。 キューの "固定"、"ロック"、"ロック解除" の意味については、「Storport のキュー管理」を参照してください。
デバイスによって報告されたエラーを SCSI-3 センス データ形式に変換して、クラス ドライバーで処理します。
Storport は、Storport ライブラリ ルーチンを使用してミニポート ドライバーにサービスを提供します。 ミニポート ドライバーのライターは、単一のモノリシック ポート ドライバーに提供する機能をコーディングするのではなく、これらのルーチンを呼び出すことができます。 これらのルーチンを使用して提供される最も重要なサービスの一部を次に示します。
Storport ミニポート ドライバーは、多くの OS に依存する初期化操作を Storport の StorPortInitialize ライブラリ ルーチンに委譲できます。 たとえば、Storport ドライバーは、PnP と DMA マッピングに関連する詳細を処理します。 これにより、Storport ミニポート ドライバーが実行する必要がある作業量が減ります。 Storport ミニポート ドライバーの初期化作業の詳細については、「Storport を使用したハードウェアの初期化」を参照してください。
PnP 以外のデバイスの Storport ミニポート ドライバーは、アダプターを検索し、PnP マネージャーにそのリソースを報告するタスクを免除されます。 これは StorPortInitialize で行われます。
Storport ミニポート ドライバーは、ドライバー オブジェクトのディスパッチ エントリ ポイントを初期化しません。 ミニポート ドライバーが ScsiPortInitialize を呼び出すとき、Storport ドライバーは、ミニポート ドライバーの代わりにこれを行います。
Storport ミニポート ドライバーは、HalTranslateBusAddress を使用して、バス相対アドレスを論理アドレスに変換しません。 Storport ミニポート ドライバーは、StorPortGetDeviceBase の呼び出しによってこれを行います。
Storport ミニポート ドライバーで Storport で使用できるライブラリ ルーチンの完全な一覧については、「Storport ドライバー サポート ルーチン」を参照してください。