【问题标题】:Windows kernel mode programming: Is a deadlock between drivers possible?Windows 内核模式编程:驱动程序之间是否可能出现死锁?
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 太好了,回答了我的问题!谢谢。
    猜你喜欢
    • 2014-08-03
    • 2013-09-13
    • 2013-06-12
    • 2015-04-14
    • 2022-10-25
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2017-01-17
    相关资源
    最近更新 更多