硬件资源简介

系统的硬件资源包括 I/O 端口、中断向量、直接内存访问 (DMA) 通道,以及其他必须分配给连接到系统的每个设备的通信路径。 本节中的主题介绍Kernel-Mode驱动程序框架如何 (KMDF) 驱动程序协商设备的硬件资源要求、查看建议的资源列表,然后接收分配的资源。 本部分还讨论 KMDF 和 User-Mode Driver Framework (UMDF) 驱动程序如何访问和映射分配的资源。

用户插入 PnP 设备后, 枚举设备的 驱动程序通常会创建一个或多个 逻辑配置,这些配置是设备可以使用的硬件资源的组合。 这些配置包括:

  • 一种 启动配置 ,其中列出了设备在系统启动时所需的硬件资源。 (对于 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 回调函数之前有效。