在尝试向较低级别的驱动程序发送同步请求时,我们的驱动程序挂起时遇到了一些问题。当调用该例程时,该例程当前正在执行DISPATCH_LEVEL
。
我一直在查看 Microsoft 提供的文档“锁、死锁和同步”,它说以下内容:
考虑以低 IRQL 运行的代码成功获得锁,但线程被中断以运行更高 IRQL 的代码的情况。如果更高 IRQL 代码尝试获取相同的锁,线程可能会永远挂起。较低 IRQL 代码在较高 IRQL 代码退出之前无法运行,但较高 IRQL 代码在较低 IRQL 代码释放锁之前无法退出。只涉及一个线程。为了防止这个问题,获取锁的代码通常会将其 IRQL 提升到任何获取锁的驱动程序代码都可以运行的最高 IRQL。
我们的问题是给我们挂起和蓝屏。虽然我知道我们不应该进行在 DISPATCH_LEVEL 等待的调用并且我们的设计需要工作,但我只是想确保我正确理解 IRQL 机制。
我是否正确地认为 IRQL 是每个处理器的,并且不同的驱动程序将在不同的处理器上运行?我想确认是否发出针对较低级别驱动程序的同步请求DISPATCH_LEVEL
实际上是否会通过抢占另一个驱动程序中的线程,因为它的 IRQL 较高。