zoukankan      html  css  js  c++  java
  • 驱动内核堆栈不足导致蓝屏

      内核模式堆栈是一个有限的存储区域,经常用于存储从一个函数传递到另一个函数的信息以及用于局部变量存储。虽然堆栈被映射到系统空间,但是它被视为原始调用例程的线程上下文的一部分,而不是驱动程序本身的一部分。这意味着只要调用线程正在运行,就可以保证存在堆栈,但是它可以随线程一起清除。在任何内核模式线程上运行的代码(不管它是系统线程还是驱动程序创建的线程)都使用该线程的内核模式堆栈(除非代码是 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(显示堆栈跟踪)

    使用 IoGetStackLimitsIoGetRemainingStackSize 例程来确定是否存在足够的堆栈空间来调用函数去执行任务,如果没有,将任务排队到一个工作项中。

    PREfast 是 Windows DDK 提供的带有驱动程序特定规则的静态源代码分析工具,可用来查找正在使用过量内核模式堆栈的函数。

  • 相关阅读:
    JavaScript Date 对象
    javascript Array类型 方法大全
    Flexbox
    CSS 去除浏览器默认 轮廓外框
    多行文本溢出显示省略号(…) text-overflow: ellipsis
    最全CSS3选择器
    何时使用 Em 与 Rem
    前端笔试面试题
    oracle中 lob类型
    MySQL 5.5.62 安装方法(标准配置版)
  • 原文地址:https://www.cnblogs.com/ahuo/p/1852849.html
Copyright © 2011-2022 走看看