ハードウェア リソースの概要

システムのハードウェア リソースは、I/O ポート、割り込みベクトル、ダイレクト メモリ アクセス (DMA) チャネル、およびシステムに接続されている各デバイスに割り当てる必要があるその他の通信パスです。 このセクションのトピックでは、カーネル モード ドライバー フレームワーク (KMDF) ドライバーがデバイスのハードウェア リソースリクエストをネゴシエートし、提案されたリソースのリストを確認し、割り当てられたリソースを受け取る方法について説明します。 このセクションでは、KMDF ドライバーとユーザー モード ドライバー フレームワーク (UMDF) ドライバーの両方が割り当てられたリソースにアクセスしてマップする方法についても説明します。

ユーザーが PnP デバイスを接続した後、デバイスを列挙するドライバーは通常、デバイスが使用できるハードウェア リソースの組み合わせである 1 つ以上論理構成を作成します。 これらの構成には次のものが含まれます:

  • システムの起動時にデバイスに必要なハードウェア リソースをリストするブート構成 。 (PnP デバイスの場合、この情報は BIOS によって提供されます。)

  • デバイスが動作できる追加の構成。 ドライバーは、 リソースリクエストリストにこれらの追加の構成を グループします。 PnP マネージャーは最終的に、このリストからリソースを選択してデバイスに割り当てます。

ドライバーは論理構成を作成した後、フレームワークに送信し、そして、フレームワークはこれらをPnP マネージャーに送信します。

次に、PnP マネージャーは、デバイスが必要とするドライバーを決定し、まだロードされていない場合はこれらをロードします。 PnP マネージャーは、デバイスのハードウェアリクエストリストを確認のためにデバイスのドライバーに送信します。 関数ドライバーとフィルター ドライバーは、このリストを変更し、PnP マネージャーに送り返すことができます。

PnP マネージャーは変更されたハードウェアリクエストリストを調べ、指定されたリソースのうち、どれがシステムで実際に使用できるかを判断します。 PnP マネージャーが以前に別のデバイスに割り当てたリソースがデバイスに必要な場合、PnP マネージャーはシステムのデバイス間でリソースの再配分を試みる可能性があります。

次に、PnP マネージャーは、PnP マネージャーがデバイスに割り当てる予定のリソースのリストである リソースリストを作成します。 PnP マネージャーは、このリストを確認のためにデバイスのドライバーに送信します。 この時点で、関数ドライバーとフィルター ドライバーはリストからリソースを取り外すことができますが、リソースを追加することはできません。

最後に、PnP マネージャーは、デバイスにリソースを割り当てます。 フレームワークは、デバイスの関数ドライバーとフィルター ドライバーにリソースのリストを渡し、デバイスとドライバーがリソースにアクセスできるように、デバイスの関数ドライバーは必要な初期化を実行します。

次のステップでは、このプロセスについて詳しく説明します:

  1. ユーザーがデバイスを接続します

  2. バス ドライバーはデバイスを検出し、それを列挙します 。

  3. フレームワークは、デバイスのブート構成を記述するリソース リストを作成するバスドライバーの EvtDeviceResourcesQuery コールバック関数を呼び出します。

  4. フレームワークは、デバイスのリソースリクエストリストを作成するバスドライバーの EvtDeviceResourceRequirementsQuery コールバック関数を呼び出します。

  5. PnP マネージャーはデバイスのドライバー スタックを作成するために、デバイスに必要なドライバーを決定し、まだロードされていない場合はこれらをロードします。

  6. PnP マネージャーは、デバイスのリソースリクエストリストを確認のためにドライバー スタックに送信します。 リストがドライバー スタックの下に移動すると、フレームワークは各関数とフィルタードライバーの EvtDeviceFilterRemoveResourceRequirementsコールバック関数を呼び出します。 リストがドライバー スタックに戻ると、フレームワークは各関数とフィルタードライバーのEvtDeviceFilterAddResourceRequirements コールバック関数を呼び出します。 これらのコールバック関数はどちらもリソースリクエストリストを変更できます。

  7. PnP マネージャーは、デバイスのリソースリストを作成し、確認のためにドライバー スタックに送信します。 フレームワークは、各関数とフィルター ドライバーの EvtDeviceRemoveAddedResources コールバック関数を呼び出します。この関数は、ドライバーの EvtDeviceFilterAddResourceRequirements コールバック関数が追加したリソースを取り外し、これによりバス ドライバーはそれらを使用しようとしません。

  8. フレームワークは、PnP マネージャーから最終的なリソースリストを受信して格納します。

  9. ドライバーがWdfInterruptCreateを呼び出して割り込みオブジェクトを作成する場合、フレームワークはリソースリストで割り込みリソースを検索し、割り込みオブジェクトに割り当てます。

  10. デバイスが初期化されていない D0 状態になった後、フレームワークは各ドライバーの EvtDevicePrepareHardware コールバック関数を呼び出し、入力引数としてデバイスのリソースリストの未処理と翻訳済みバージョンを渡します。 ドライバーは、フレームワークがドライバーのEvtDeviceReleaseHardware コールバック関数を呼び出すまで有効なリソースリストを保存できます。