【发布时间】:2013-07-03 17:33:34
【问题描述】:
在尝试向较低级别的驱动程序发送同步请求时,我们遇到了一些驱动程序挂起的问题。调用该例程时,该例程当前正在DISPATCH_LEVEL 处执行。
我一直在查看 Microsoft 提供的文档 "Locks, Deadlocks, and Synchronization",其中内容如下:
考虑以低 IRQL 运行的代码成功获取锁,但线程被中断以运行更高 IRQL 的代码的情况。如果更高 IRQL 代码尝试获取相同的锁,线程可能会永远挂起。较低 IRQL 代码在较高 IRQL 代码退出之前无法运行,但较高 IRQL 代码在较低 IRQL 代码释放锁之前无法退出。只涉及一个线程。为了防止这个问题,获取锁的代码通常会将其 IRQL 提升到任何获取锁的驱动程序代码都可以运行的最高 IRQL。
我们的问题是挂起和蓝屏。虽然我知道我们不应该在 DISPATCH_LEVEL 处等待并且我们的设计需要工作,但我只是想确保我正确理解 IRQL 机制。
IRQL 是针对每个处理器的,并且不同的驱动程序将在不同的处理器上运行,我是否正确?我想确认从DISPATCH_LEVEL 发出针对较低级别驱动程序的同步请求是否实际上是通过抢占另一个驱动程序中的线程来导致问题,因为它的IRQL 较高。
【问题讨论】:
标签: kernel driver deadlock kmdf wdf