次の方法で共有


パケットベース システム DMA の使用

パケットベース DMA を使用する下位デバイスのドライバーは、DMA 転送を要求する IRP を処理する次の一般的な一連のサポート ルーチンを呼び出します。

  • システム DMA コントローラーの割り当てを試みる直前の KeFlushIoBuffers。(詳細については、キャッシュの一貫性の維持を参照)

  • ドライバーが DMA 用にデバイスをプログラミングする準備が整い、システム DMA コントローラーが必要な場合の AllocateAdapterChannel

    AllocateAdapterChannel は、ドライバーの AdapterControl ルーチンを呼び出します。

  • MapTransfer の最初の呼び出しでパラメーターとして必要な MDL にインデックスを取得するための MmGetMdlVirtualAddress

  • 転送操作用のシステム DMA コントローラーをプログラムする MapTransfer

    ドライバーは、転送要求の分割で説明されているように、要求されたすべてのデータを転送するために MapTransfer を複数回呼び出す必要がある場合があります。

  • 下位デバイス間の各 DMA 転送操作の直後の FlushAdapterBuffers

    ドライバーが要求されたすべてのデータを転送するために MapTransfer を複数回呼び出す必要がある場合は、MapTransfer を呼び出す回数だけ FlushAdapterBuffers を呼び出す必要があります。

  • 要求されたデータがすべて転送され次第、またはデバイスの I/O エラーが原因でドライバーが IRP に失敗する場合の FreeAdapterChannel

IoGetDmaAdapter によって返されるアダプター オブジェクト ポインターは、Irp->MdlAddress で渡される MDL へのポインターを必要とする KeFlushIoBuffersMmGetMdlVirtualAddress を除く、これらの各ルーチンに必要なパラメーターです。

個々のドライバーは、各ドライバーがデバイスにサービスを提供するために実装される方法に応じて、さまざまなポイントでこの一連のサポート ルーチンを呼び出します。 たとえば、あるドライバーの StartIo ルーチンが AllocateAdapterChannel への呼び出しを行い、別のドライバーがドライバーによって作成されたインターロック キューから IRP を削除するルーチンからこの呼び出しを行う場合があります。また別のドライバーが、下位 DMA デバイスがデータを転送する準備ができていることを示す際に、この呼び出しを行う場合があります。