0

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

我一直在查看 Microsoft 提供的文档“锁、死锁和同步”,它说以下内容:

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

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

我是否正确地认为 IRQL 是每个处理器的,并且不同的驱动程序将在不同的处理器上运行?我想确认是否发出针对较低级别驱动程序的同步请求DISPATCH_LEVEL实际上是否会通过抢占另一个驱动程序中的线程,因为它的 IRQL 较高。

4

1 回答 1

2

如果您正在执行常规调用,则其他代码将在同一级别的同一 CPU 上执行。如果您正在执行异步发送,那么它可能会安排在不同的 CPU 上。如果您正在从更高级别的驱动程序进行同步发送,那么您可能应该被绞死。只需使其异步并编写完成例程即可。

于 2013-07-03T17:54:07.893 回答