• 1110阅读
  • 0回复

IRQL与分页内存 [复制链接]

上一主题 下一主题
离线天道酬勤
 

只看楼主 倒序阅读 使用道具 楼主  发表于: 2016-05-19
— 本帖被 天道酬勤 从 编程技术交流 移动到本区(2016-05-19) —

//

// Interrupt Request Level definitions

//

#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 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 SYNCH_LEVEL (IPI_LEVEL-1)   // synchronization level

IRQL 等级:http://www.yoho.cn/spaces/log/573154/

IRQL是Interrupt ReQuest Level,中断请求级别。

一个由windows虚拟出来的概念,划分在windows下中断的优先级,这里中断包括了硬中断和软中断,硬中断是由硬件产生,而软中断则是完全虚拟出来的。

处理器在一个IRQL上执行线程代码。IRQL是帮助决定线程如何被中断的。在同一处理器上,线程只能被更高级别IRQL的线程能中断。每个处理器都有自己的中断IRQL。

我们在调用NDIS API时,在DDK帮助文档中都有该API函数的所在级别。

PASSIVE_LEVEL

IRQL最低级别,没有被屏蔽的中断,在这个级别上,线程执行用户模式,可以访问分页内存。

APC_LEVEL

在这个级别上,只有APC级别的中断被屏蔽,可以访问分页内存。当有APC发生时,处理器提升到APC级别,这样,就屏蔽掉其它APC,为了和APC执行一些同步,驱动程序可以手动提升到这个级别。比如,如果提升到这个级别,APC就不能调用。在这个级别,APC被禁止了,导致禁止一些I/O完成APC,所以有一些API不能调用。

DISPATCH_LEVEL

这个级别,DPC 和更低的中断被屏蔽,不能访问分页内存,所有的被访问的内存不能分页。因为只能处理分页内存,所以在这个级别,能够访问的Api大大减少。

DIRQL (Device IRQL)

一般的,更高级的驱动在这个级别上不处理IRQL,但是几乎所有的中断被屏蔽,这实际上是IRQL的一个范围,这是一个决定某个驱动有更高的优先级的方法。

关于IRQL:http://topic.csdn.net/u/20080217/21/b5246389-864e-4be3-8dd3-4b85815b39ed.html

系统内存堆可跟用户堆不一样啊,它表现为系统地址空间的两个所谓的内存池。

◎ 不分页池--不分页池不会分页到交换文件(swap file),自然也不需要分页回来。它们总是老老实实在物理内存里活动,在你想访问它们的时候总能找到它们(任何IRQL等级),并且不会出现分页错误(废话,不分页如果还出现分页错误,就太没有天理了。)这也正是它的优点啊,任何访问都不会出现页面错误!页面错误可是往往导致系统瘫掉的哦(当IRQL >= DISPATCH_LEVEL)!

◎ 分页池--顾名思义,就是可以分页(分入和分出)的了。你只能使用(IRQL < DISPATCH_LEVEL)的内存。

分页内存是不用的时候可以保存到分页文件中的内存。但要使用时必须映射到物理内存上(否则就不叫内存了,CPU没法直接访问硬盘),只要分页内存映射到物理内存上,不管IRQL是多少就都可以访问了。通过锁定内存操作可以让系统把分页内存一直保持在物理内存上,这样程序就可以大胆使用了,不必考虑IRQL。

快速回复
限100 字节
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
 
上一个 下一个