驱动内核堆栈不足导致蓝屏
内核模式堆栈是一个有限的存储区域,经常用于存储从一个函数传递到另一个函数的信息以及用于局部变量存储。虽然堆栈被映射到系统空间,但是它被视为原始调用例程的线程上下文的一部分,而不是驱动程序本身的一部分。这意味着只要调用线程正在运行,就可以保证存在堆栈,但是它可以随线程一起清除。在任何内核模式线程上运行的代码(不管它是系统线程还是驱动程序创建的线程)都使用该线程的内核模式堆栈(除非代码是 DPC,这种情况下它在某些平台上使用处理器的 DPC 堆栈)。
内核模式堆栈的大小在不同的硬件平台上有所不同。例如:
• |
在基于 x86 的平台上,内核模式堆栈是 12K。 |
• |
在基于 x64 的平台上,内核模式堆栈是 24K。 |
堆栈空间耗尽将导致操作系统崩溃和一个或几个可能的错误检查。可能包括下列错误检查:
0x7F:UNEXPECTED_KERNEL_MODE_TRAP(Parm1 设置为 EXCEPTION_DOUBLE_FAULT),由超出内核堆栈结束地址引起。
0x1E:KMODE_EXCEPTION_NOT_HANDLED,
0x7E:SYSTEM_THREAD_EXCEPTION_NOT_HANDLED 或
0x8E:KERNEL_MODE_EXCEPTION_NOT_HANDLED 和一个异常码 STATUS_ACCESS_VIOLATION,后者指示内存访问违法。
0x2B:PANIC_STACK_SWITCH,通常在内核模式驱动程序使用过多堆栈空间时发生。
kf(显示堆栈跟踪)
使用 IoGetStackLimits 和 IoGetRemainingStackSize 例程来确定是否存在足够的堆栈空间来调用函数去执行任务,如果没有,将任务排队到一个工作项中。 |
PREfast 是 Windows DDK 提供的带有驱动程序特定规则的静态源代码分析工具,可用来查找正在使用过量内核模式堆栈的函数。