IRQL

转自:http://blog.csdn.net/changsha2011/article/details/6895529

最近开始入门windows 驱动开发,遇到一个IRQL。不知道何解,于是找了些资料,顺带记录下。下面的东西可能有不准确,如发现错误之处请指正,以免误导他人(罪过),谢谢!。

1.什么是中断级(IRQL)

中断是一个大家都很熟悉的概念,这里只通俗的解释一下。假如我正在课堂看小说,这时老师过来了,于是我以大家都有的速度迅速将将小说切换为课本。这个过程中,“老师过来”中断了“看小说”转而为“看课本”。如果把我看成CPU,则“看”即CPU的动作(执行周期),“小说”是CPU当前执行的内容,“老师来了”引发一个中断信号,作为对这个中断信号的响应,CPU执行的内容由“小说”切换为“课本”。老师来了我之所以改看小说为看课本,可能基于两个原因(这也是响应中断的原因):

a.(处理紧急事务)我当时”悠哉的看小说“,老师的到来让我突然有了一个”看课本来骗过老师“的任务,于是我果断执行了。

b.(做更有意义的事情)我觉得看课本比看小说更有出息,所以我也果断执行了。(可能是老师的到来让我觉悟了)

对于不同的中断,其优先级通常是不一样的,即对中断的响应处理优先程度。比如说,我正在马路上走,这时突然前面出现一美女,同时后面出现一加速前进的车。这时,虽然我很想去追那美女,但我必须先停下来先让汽车过去。因为躲过汽车的优先级大于追美女。(话说,被汽车撞飞,一切美女就都是浮云了)。也就是说在处理一大堆中断时,我们是有个急缓先后的处理顺序。

IRQL是中断请求(Interrupt request)和级别(Level)两个词结合,即表示中断的优先级,简称中断级。

2. 选择性的响应中断

   虽然中断信号的到来表示有事情发生了,需要我们去处理。但有些时候,我们并不希望别人来打断我们当前所作的事,除非导致中断信号的事情非处理不可否则有严重的后果。这时我们就需要选择性的响应中断,对于不重要的中断全部屏蔽掉。比如说,一个医生正在实施重要手术,这时医生肯定是不希望被手机铃声打扰的,于是他将手机关机屏蔽手机产生的中断。但手术过程中发现血量不够了,这时他必须暂时停止手术去取血浆(假设只有他一个人在实施手术)。

这个过程就是选择性的响应中断。

3.驱动编程中IRQL的含义

驱动编程时,IRQL表示程序可以响应那些级别中断,而对那些级别的中断可以屏蔽掉。下面是Windows NT头文件中定义的IRQL表:

IRQL

X86 IRQL Value

AMD64IRQL Value

IA64 IRQL Value

Description

PASSIVE_LEVEL

0

0

0

User threads and most kernel-mode operations

APC_LEVEL

1

1

1

Asynchronous procedure calls and page faults

DISPATCH_LEVEL

2

2

2

Thread scheduler and deferred procedure calls (DPCs)

CMC_LEVEL

N/A

N/A

3

Correctable machine-check level (IA64 platforms only)

Device interrupt levels (DIRQL)

3-26

3-11

4-11

Device interrupts

PC_LEVEL

N/A

N/A

12

Performance counter (IA64 platforms only)

PROFILE_LEVEL

27

15

15

Profiling timer for releases earlier than Windows 2000  

SYNCH_LEVEL

27

13

13

Synchronization of code and instruction streams across processors

CLOCK_LEVEL

N/A

13

13

Clock timer

CLOCK2_LEVEL

28

N/A

N/A

Clock timer for x86 hardware

IPI_LEVEL

29

14

14

Interprocessor interrupt for enforcing cache consistency

POWER_LEVEL

30

14

15

Power failure

HIGH_LEVEL

31

15

15

Machine checks and catastrophic errors; profiling timer for Windows XP and later releases



对于驱动编程,我们通常只会接触到 0到2的IRQL以及DIRQL。    

PASSIVE_LEVEL:线程即运行在该中断级别上,它对所有中断都作出响应。用户模式代码都是运行在该中断级别上。

APC_LEVEL:当I/o 操作完成时,系统会产生这个中断。为了响应这个中断,应用程序向I/O 完成中断处理例程队列中插入一个APC回调函数,当I/O完成时,该APC函数被调用。如果你不想对这个中断做出响应,你就可以将IRQL提升至APC_LEVEL。这时当I/O完成时,应用程序将不会受到该中断信号。可以调用KeEnterCriticalRegion或KeEnterGuardedRegion来将IRQL提升至该级别。APC中断通常是由处理器引发,可以想自己发出也可是像其他处理器发出。一般情况下,是不应该的使用的APC_LEVEL的,除非你想使用Fast Mutexes之类的东西。

DISPATCH_LEVEL: 为了能够执行多任务,系统必须允许线程调度。而线程调度的根本就是靠时钟中断来保证的,该级别的中断即调度中断。当你的代码运行的IRQL被提升为DISPATH_LEVEL时,就意味着你的代码不在受线程中断影响力。你的代码会一直运行直到你将IRQL设置为低于DISPATH_LEVEL为止。这中间如果发生缺页错误之类的IRQL级别在DISPATH_LEVEL之下的严重中断时,这些中断均不会被处理。这时,代码将无法正常运行。所以,DISPATH_LEVEL的使用绝对要慎之又慎。只有在是偶那个自旋锁时,你才应该考虑选择该IRQL。

其他IRQL,这里暂不讨论了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509330.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

#pragma code_seg(INIT)/code_seg(PAGE)

转自:http://blog.chinaunix.net/uid-24504987-id-161192.html Windows规定有些虚拟内存可以交换到文件中,这类内存被称为分页内存 有些虚拟内存 永远不会交换到文件中,这些内存叫非分页内存 #define PAGEDCODE code_seg(“PAGE”);//分页内…

JSON.stringify() 方法

JSON.stringify() 方法是将一个JavaScript值(对象或者数组)转换为一个 JSON字符串,如果指定了replacer是一个函数,则可以替换值,或者如果指定了replacer是一个数组,可选的仅包括指定的属性。 语法 JSON.stringify(value[, repla…

师--链表的结点插入

Problem Description 给出一个只有头指针的链表和 n 次操作,每次操作为在链表的第 m 个元素后面插入一个新元素x。若m 大于链表的元素总数则将x放在链表的最后。Input 多组输入。每组数据首先输入一个整数n(n∈[1,100]),代表有n次操作。接下来的n行&…

BeanUtils工具的使用(转载)

原文章地址:https://www.cnblogs.com/vmax-tam/p/4159985.html BeanUtils工具 什么是BeanUtils工具 BeanUtils工具是一种方便我们对JavaBean进行操作的工具,是Apache组织下的产品。 BeanUtils工具一般可以方便javaBean的哪些操作? 1&…

线程可警告状态以及APC队列

转自:http://blog.csdn.net/qq_22423659/article/details/53425828 一、线程可警告状态的真实含义 1、通过另一些方法让线程"暂停"(非SuspendThread方法,比如SleepEx,wait函数族等),并可以进入一种称之为 Alterable的状…

数据结构实验之链表三:链表的逆置

Problem Description 输入多个整数,以-1作为结束标志,顺序建立一个带头结点的单链表,之后对该单链表的数据进行逆置,并输出逆置后的单链表数据。Input 输入多个整数,以-1作为结束标志。Output 输出逆置后的单链表数据。…

DBUtils使用详细示例(转载)

https://www.cnblogs.com/smyhvae/p/4085684.html

APC异步过程调用

转自:http://blog.sina.com.cn/s/blog_c2ef450f010192hx.html APC 异步过程调用 记得第一次看见这个名词的时候,觉得云里雾罩,然而上网看了下它的介绍,感觉说的都是没头没脑的 然而今天,我再次接触了它,我将…

张小龙:如何把产品做简单

今天从一个小故事开始讲:为什么苹果的手机只有一个按钮? (台下:我觉得对于用户来说,只有一个按钮不会有太多的干扰,只要从这里开始,其它的菜单都在这里面了,这是我个人的一些想法。&…

数据结构实验之链表九:双向链表

Problem Description 学会了单向链表,我们又多了一种解决问题的能力,单链表利用一个指针就能在内存中找到下一个位置,这是一个不会轻易断裂的链。但单链表有一个弱点——不能回指。比如在链表中有两个节点A,B,他们的关系是B是A的后…

不敢死队问题

Problem Description 说到“敢死队”,大家不要以为我来介绍电影了,因为数据结构里真有这么道程序设计题目,原题如下: 有M个敢死队员要炸掉敌人的一个碉堡,谁都不想去,排长决定用轮回数数的办法来决定哪个战…

槽边往事

http://chuansong.me/account/bitsea?start12

数据结构实验之链表五:单链表的拆分

Problem Description 输入N个整数顺序建立一个单链表,将该单链表拆分成两个子链表,第一个子链表存放了所有的偶数,第二个子链表存放了所有的奇数。两个子链表中数据的相对次序与原链表一致。Input 第一行输入整数N;; 第二行依次输…

聊天机器人调用API实现

后端调用API: package com.mychat.servlet;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder;…

Dump文件

1. Dump文件 1. Dump文件介绍 Dump文件(Dump File),也叫转储文件,以.DMP为文件后缀。dump文件是进程在内存中的镜像文件,通过转换然后存储成以.DMP后缀的文件。dump文件根据存储时的选项不同,会生成不同大小的文件,其中…

整理音乐

Problem Description 请用链表完成下面题目要求。 xiaobai 很喜欢音乐,几年来一直在收集好听的专辑。他有个习惯,每次在听完一首音乐后会给这首音乐打分,而且会隔一段时间给打好分的音乐排一个名次。今天 xiaobai 打开自己的音乐文件夹&#…

VS2013正在等待所需操作完成

在用VS2013打开解决方案的时候,遇到”正在等待所需操作完成 ,此对话框将在操作完成后关闭“一直弹出显示,解决方案无法加载的情况!此时需要将与解决方案名字相同的文件全部相同(除解决方案文件除外)全部删除…

web聊天室实现

后端: package com.jsx.chat;import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.concurrent.CopyOnWriteArraySet;import javax.websocket.OnClose; imp…