zoukankan      html  css  js  c++  java
  • 驱动中PAGED_CODE的作用

    参考:http://blog.csdn.net/broadview2006/article/details/4171397

    里面的内容出自<Windows内核情景分析>

    简而言之,Windows并没有将运行在Ring 0的代码全部视为内核,而是区分为Kernel和Executive,Executive可以理解为“管理层”的意思,解释为“执行体”不合理。

    其中,Kernel是狭义的内核,里面的代码包括用到的数据,都是常驻在物理内存中的,不支持分页机制。

    而除此之外的代码和数据,是支持分页机制的,并且可以被交换到pagefile中,即并非总是在物理内存中的。

    对于驱动来说,应该属于后者,因此在驱动中的函数的头部都会使用PAGED_CODE来判断一下,

    #define PAGED_CODE() PAGED_ASSERT(KeGetCurrentIrql() <= APC_LEVEL);
    
    #define PASSIVE_LEVEL 0             // Passive release level
    #define LOW_LEVEL 0                 // Lowest interrupt level
    #define APC_LEVEL 1                 // APC interrupt level
    #define DISPATCH_LEVEL 2            // Dispatcher level
    #define CMCI_LEVEL 5                // CMCI handler level
    
    #define PROFILE_LEVEL 27            // timer used for profiling.
    #define CLOCK1_LEVEL 28             // Interval clock 1 level - Not used on x86
    #define CLOCK2_LEVEL 28             // Interval clock 2 level
    #define IPI_LEVEL 29                // Interprocessor interrupt level
    #define POWER_LEVEL 30              // Power failure level
    #define HIGH_LEVEL 31               // Highest interrupt level
    
    #define CLOCK_LEVEL                 (CLOCK2_LEVEL)
    

    如果当前的中断请求级别(IRQL)太高(DPC以上),那么很可能属于Kernel部分,因此需要避免这种情况。

  • 相关阅读:
    摩根斯坦利面试
    Interview Preparation IV
    Interview Preparation III
    Interview Preparation II
    Interview Preparation I
    ASCII Characters
    Java Serialization
    贝莱德伦敦分部面试
    SVG基本知识
    前端知识整理(四)【HTTP相关】
  • 原文地址:https://www.cnblogs.com/long123king/p/3781902.html
Copyright © 2011-2022 走看看