ダイレクト I/O の使用
一度に大量のデータを転送できるデバイスのドライバーは、それらの転送にダイレクト I/O を使用する必要があります。 大量転送にダイレクト I/O を使用すると、割り込みのオーバーヘッドを減らし、バッファー内の I/O に固有のメモリ割り当て操作とコピー操作を排除することで、ドライバーのパフォーマンスが向上します。
一般に、大容量記憶装置ドライバーは、ダイレクト メモリ アクセス (DMA) またはプログラミングされた I/O (PIO) を使用する最下位レベルのドライバーや、その上にチェーンされている中間ドライバーなど、転送要求に対してダイレクト I/O を要求します。
I/O マネージャーは、I/O 操作がダイレクト I/O を使用していることを次のように判断します。
IRP_MJ_READ 要求と IRP_MJ_WRITE 要求の場合、DO_DIRECT_IO は DEVICE_OBJECT 構造体の フラグ メンバーに設定されます。 詳細については「デバイス オブジェクトの初期化」を参照してください。
IRP_MJ_DEVICE_CONTROL 要求と IRP_MJ_INTERNAL_DEVICE_CONTROL 要求の場合、IOCTL コードの値には、IOCTL 値の TransferType 値として METHOD_IN_DIRECT または METHOD_OUT_DIRECT が含まれます。 詳細については「I/O 制御コードの定義」参照してください。
ダイレクト I/O を使用するドライバーでは、バッファー内の I/O を使用して一部の IRP を処理する場合もあります。 特に、ドライバーは通常、読み取りおよび書き込み操作にダイレクト I/O を使用するかどうかに関係なく、データ転送を必要とする IRP_MJ_DEVICE_CONTROL 要求の一部の I/O 制御コードにバッファー I/O を使用します。
ダイレクト I/O 転送の設定は、DMA と PIO のどちらが使用されているかによって若干異なります。 詳細については、以下を参照してください:
ドライバーは、DMA および PIO 転送中にキャッシュの一貫性を維持するための手順を実行する必要があります。 詳細については、「キャッシュの一貫性の維持」を参照してください。