Windows 设备驱动程序:如何处理非分页池中的内存碎片?

Windows 设备驱动程序:如何处理非分页池中的内存碎片?,windows,memory-management,windows-7,device-driver,pci,Windows,Memory Management,Windows 7,Device Driver,Pci,32位Windows 7环境中的PCI express板有问题。该板是一种音频/视频捕获设备,可对32个独立的SD模拟视频通道执行实时H.264编码。它使用DMA将压缩帧传送到Win7主机驱动程序 在系统启动时,板驱动程序使用DMAAAdapter对象的AllocateCommonBuffer函数从非分页池分配DMA缓冲区。缓冲区必须全部位于相同的256MB物理地址范围内,才能映射到电路板。当win7主机系统启动时,此分配总是成功的 除了简单的引导加载程序外,该板没有任何驻留固件;它要求在应用程

32位Windows 7环境中的PCI express板有问题。该板是一种音频/视频捕获设备,可对32个独立的SD模拟视频通道执行实时H.264编码。它使用DMA将压缩帧传送到Win7主机驱动程序

在系统启动时,板驱动程序使用DMAAAdapter对象的AllocateCommonBuffer函数从非分页池分配DMA缓冲区。缓冲区必须全部位于相同的256MB物理地址范围内,才能映射到电路板。当win7主机系统启动时,此分配总是成功的

除了简单的引导加载程序外,该板没有任何驻留固件;它要求在应用程序运行时(通过驱动程序)将固件映像下载到主板。但是,作为固件下载过程的一部分,windows应用程序必须通过驱动程序发出BOARD_RESET ioctl,以使该板进入已知状态。不幸的是,当电路板收到重置命令时,它会从win7 PnP管理器的视图中短暂“消失”,该管理器认为发生了意外的\u删除事件。随后,板驱动程序被迫将其分配的所有DMA缓冲区释放回非分页池,并等待来自PnP管理器的StartDevice事件

当接收到下一个StartDevice事件时,板驱动程序无法再完成DMA分配。由于碎片,无法从非分页池中找到足够的缓冲区,以便映射到相同的物理地址范围。驱动程序使StartDevice事件失败,然后由PnP manager从服务中删除


我正在寻找一个解决这种情况的方案。是否可以在线路板重置期间以某种方式暂停设备节点,以便PnP管理器不会将其检测为删除?是否有可以覆盖设备移除检测的PnP配置?是否有任何方法可以挂起驱动程序第一次启动时成功获取的DMA缓冲区?是否有办法在非分页池中保留页面范围,仅供此驱动程序使用?DMA缓冲区相当大:200个缓冲区,每个634880字节,它们都必须来自相同的256MB范围(即0x10000000边界)。我有完整的源代码为董事会驱动程序,可以作出任何必要的修改;它是从供应商处购买的参考设计的一部分。这是我第一次接触windows设备驱动程序

我必须考虑一下,但一个可能的解决方案是安装一个虚拟设备驱动程序,它与原始设备驱动程序通信。这可以在启动时获取DMA缓冲区,并将其发送给板驱动程序。我还想知道为该板实现电源管理功能是否可行。供应商最初没有在驱动程序代码中提供任何电源管理处理器(例如IRP_MJ_power)。电路板不支持任何低功耗或睡眠状态,但也许我可以更改电路板重置处理程序,使其在windows电源管理器中显示为“睡眠/唤醒”循环?也许这样可以保留设备节点和上下文?