コントローラー オブジェクトの概要
その名前が示すように、コントローラー オブジェクトは通常、デバイスが接続された物理デバイス コントローラーを表しています。 物理コントローラーによって調整された類似デバイスのセットの最下位レベルの非 WDM ドライバーは、コントローラー オブジェクトを作成し、それを使用して接続されたデバイス間で I/O 操作を同期できます。 ドライバーは、ControllerControl ルーチンを実装し、I/O マネージャーのコントローラー オブジェクトのサポート ルーチンを呼び出します。
Note
WDM ドライバーでは、コントローラー オブジェクトの使用はサポートされていません。
通常、次の条件が維持されている場合、ドライバーはコントローラー オブジェクトを使用して、接続されたデバイスに操作を同期します。
コントローラーは、中断なしで長い操作を実行しないため、ドライバーはデバイス専用のスレッドを作成したり、システム ワーカー スレッドを使用したりする必要はありません。
コントローラーに接続されているデバイスも同様です。 つまり、キーボードおよび補助デバイス コントローラーに接続できるキーボードやマウス デバイスなど、物理的なプロパティや操作機能がまったく異なるデバイスではありません。
ドライバーはモノリシックに設計されています。1 つ以上のクラス ドライバー (接続されたデバイス用) がポート ドライバーに重なって配置されたポート ドライバー (コントローラー用) として設計されるのではなく、デバイス コントローラーと接続された物理デバイスに関連して単一階層になっています。
I/O チャネルと一連の論理デバイス オブジェクトを持つデバイスのドライバーは、コントローラー オブジェクトを使用して、このようなデバイスのチャネル間で I/O 操作を同期することもあります。
コントローラー オブジェクトには名前がないため、I/O 要求のターゲットではありません。 これは、一連のデバイス オブジェクトから I/O をシリアル化する単なる同期メカニズムです。 コントローラー オブジェクトには名前がないため、ユーザー モードで保護されたサブシステム (ターゲット デバイス オブジェクトを表すファイル オブジェクトのハンドルを取得せずにデバイス I/O 要求を行うことができません) からは見えません。 コントローラー オブジェクトは、独自のデバイス オブジェクトをコントローラー オブジェクトにアタッチできない上位レベルのドライバーにも表示されません。 つまり、I/O マネージャーも上位レベルのドライバーも、コントローラー オブジェクトによって表されるデバイスで I/O を要求する IRP を設定することはできません。 I/O 要求は常に、デバイス オブジェクトに対して発行されます。 ドライバーのみがコントローラー オブジェクトを使用できます。
同期と重複 I/O
"AT" ディスク コントローラーのような機能を備えた物理デバイスのモノリシック ドライバーは、コントローラー オブジェクトを使用してデバイスの I/O 操作を同期する必要がありません。 たとえば、ドライバー ライターは、コントローラー オブジェクトを使用する代わりに、次のような同期手法を試すことができます。
I/O 要求のターゲットであるデバイスを表す、名前付きデバイス オブジェクトを設定します。
現在の I/O 操作のターゲットであるデバイス オブジェクトを示す状態情報 (各デバイス拡張機能または単一のデバイス拡張機能のデバイス ビジー フラグのセット) を維持します。
現在ビジー状態のデバイス オブジェクトの I/O 操作を実行し、現在の IRP が完了するまで、他のデバイス オブジェクトの受信 IRP を再びキューに入れます。
前述の同期手法では、ドライバーのすべてのターゲット デバイス オブジェクトの IRP 処理をシリアル化します。 また、StartIo ルーチンが次の IRP の処理を開始する前に、ドライバーが現在の IRP を完了するよう強制される点に注意してください。これにより、残念ながらドライバーのパフォーマンスが低下します。
特定のデバイス操作が重複する可能性がある場合、コントローラー オブジェクトを使用すると、ドライバーの I/O スループットが向上する可能性があります。これは、この同期手法により、ドライバーが物理デバイスを設定する直前に操作を重複できるかどうかを判断できるためです。 たとえば、ディスク コントローラーを使用すると、ドライバーが 1 つのディスク上のシークを、別のディスクでの読み取り/書き込み操作と重複させることができます。
さらに、コントローラー オブジェクトを使用する方法は、"AT" ディスク コントローラーなどの単一の物理デバイスを介して複数のターゲット デバイス オブジェクトの I/O 操作を同期する比較的簡単な方法です。 コントローラー オブジェクトを使用すると、モノリシック ドライバーは、1 つまたは複数のデバイス拡張機能内のすべてのデバイスとデバイス コントローラーに関する状態を維持したり、IRP を再びキューに入れたりしなくても、一連の名前付きデバイス オブジェクト間で I/O 操作を同期できるようになります。
ただし、全二重シリアル コントローラーやバス マスター アダプターなど、I/O 操作と重複するよう設計された一部のデバイスには、通常、IRP の内部キューを設定するドライバーがあります。