Windows内核模式编程:驱动程序之间是否存在死锁?

时间:2013-07-03 17:33:35

标签: kernel driver deadlock kmdf wdf

在尝试向较​​低级别的驱动程序发送同步请求时,我们的驱动程序挂起了一些问题。当调用此例程时,例程当前正在DISPATCH_LEVEL执行。

我一直在审核Microsoft提供的文档"Locks, Deadlocks, and Synchronization",并说明了以下内容:

  

考虑以低IRQL运行的代码成功获取锁的情况,但线程被中断以在更高的IRQL下运行代码。如果较高的IRQL代码尝试获取相同的锁,则该线程可能永远挂起。较低的IRQL代码在更高的IRQL代码退出之前无法运行,但是在较低的IRQL代码释放锁之前,较高的IRQL代码无法退出。只涉及一个线程。为了防止出现此问题,获取锁的代码通常会将其IRQL提升到最高IRQL,在该IRQL上可以运行获取锁的任何驱动程序代码。

我们的问题是给我们悬挂和蓝屏。虽然我知道我们不应该在DISPATCH_LEVEL等待调用并且我们的设计需要工作,但我只是想确保我正确理解IRQL机制。

我是否认为IRQL是每处理器,并且不同的驱动程序将在不同的处理器上运行?我想确认是否针对DISPATCH_LEVEL的低级驱动程序发出同步请求实际上是由于其更高的IRQL而抢占了另一个驱动程序中的线程而导致问题。

1 个答案:

答案 0 :(得分:2)

如果您正在进行常规呼叫,则其他代码将在同一级别的同一CPU上执行。如果您正在执行异步发送,则可以在不同的CPU上进行调度。如果您正在执行同步从较高级别驱动程序发送到较低级别的驱动程序,那么您可能应该被挂起。只需使其异步并编写完成例程。