【原创】浅说windows下的中断请求级IRQL
一 中断分类
根据中断源不同,可以将中断分为
硬件中断:硬件上产生的中断,可以来自处理器的内部和外部。处理器的外部中断可以来自各种PIN信号接口和Local APIC的LINT0和LINT1引脚,以及外部的I/O APIC发送过来的中断信息。
软件中断:软件上产生的中断,使用INT指令主动发起的中断,如INT 0X40,调用0X40号的中断服务例程。
硬件中断源又可以分为
- 可屏蔽中断:可屏蔽的中断如下
通过处理器的INTR pin接收的中断请求,典型地,INTR连接到8259A PIC上,在支持APIC的处理器上,LINT0被作为INTR连接到外部中断控制器上
通过Local APIC产生的本地中断源
来自芯片组上的I/O APIC产生的中断信息
- 不可屏蔽中断:通过处理器NMI pin接收的中断请求是不可屏蔽的,在支持APIC的处理器上INTR1 pin被作为NMI pin使用,接收来自外部的NMI信号
二 中断控制器
- 以前的8259A PIC(8259可编程中断控制器)
在单处理器上,处理器的INTR pin接收来自外部8259中断控制器传送过来的中断请求,其位于PCI-to-ISA bridge(南桥)芯片的LPC控制器里。

每个8259A PIC的IR口都连接着一条IRQ线。主片的IR0到IR7对应着IRQ0到IRQ7线,但是IR2连接着从片的INTR pin。从片的IR0到IR7对应着IRQ8到IRQ15线。由于从片连接到主片的IR2上,所以从片的IR1同时连接到IRQ2和IRQ9。
在8259A中,主片IR0的中断请求优先级最高,主片IR7最低,从片IR0-7所有中断请求优先级都相当于IRQ2。所以IRQ线的优先级由高到低次序为IRQ0,IRQ1,IRQ8-15,IRQ3-7。
- 现在的中断控制器:APIC
为了适应多处理器,Intel在Pentium处理器开始引入了APIC(Advanced Programmable Interupt Controller)机制。
APIC经历了4个版本,82489DX芯片,APIC,xAPIC,x2APIC。xAPIC共有256个IRQ线,而x2APIC比xAPIC多了256个,总共512条IRQ线。

三 中断请求级IRQL
在APCI中,每个IRQ都有各自的优先级,一个正在运行的线程可能被中断打断,进入到中断处理函数,当遇到优先级更高的中断,处在低优先级的中断也会被打断,进入到更高级的中断处理函数。
windows将中断的概念进行了扩展,提出了中断请求级的概念,数字低的优先级高,其中不仅包括了APIC的所有中断,也包括了3个软件中断。

用户模式的代码运行在最低优先级PASSIVE_LEVEL。驱动中的DriverEntry,派遣函数,AddDevice等函数一般运行在PASSIVE_LEVEL,在必要的时候可申请进入DISPATCH_LEVEL函数。
需要特别注意的是,windows负责线程调度的组件是运行在DISPATCH_LEVEL级别,当前的线程运行完时间片后,系统自动从PASSIVE_LEVEL级别提升到DISPATCH_LEVEL级别。当线程切换完毕后,操作系统又从DISPATCH_LEVEL降到PASSIVE_LEVEL。驱动程序的StartIO函数和DPC函数也运行在DISPATCH_LEVEL级别。在内核模式,可以通过KeGetCurrentIrpl内核函数来得到当前的IRQL级别。
四 代码中断级
PASSIVE_LEVEL比DISPATCH_LEVEL低,在实际编程中,许多具有比较复杂功能的内核API都要求在PASSIVE下运行,而只有比较简单的API能在DISPATCH级执行。
在调用任何一个内核API前,必须查看WDK文档,了解这个内核API的中断要求
中断级的简单判断方法
如何判断我们正在编写的代码的中断级呢?暂时可以使用下面规则来处理。
- 规则1:如果在调用路径没有特殊情况(导致中断级的提高或降低),则一个函数的中断级与调用源的中断级相同;
- 规则2:如果在调用路径上有获取自旋锁,则中断级随之升高;如果有释放自旋锁,则中断级随之降低。
如果当前代码运行在DISPATCH级,而我们又必须调用PASSIVE级的内核API,使用内核API强制降低当前的中断请求级是不被允许的,windows的代码都运行在规范的中断级上,任意降低中断级都会导致不可预料的后果。
这样的问题有很多种解决方法,比如生成一个专门的线程去执行PASSIVE级的代码。
本文链接:http://www.cnblogs.com/cposture/p/4782880.html
【原创】浅说windows下的中断请求级IRQL的更多相关文章
- 【原创】windows下搭建vue开发环境+IIS部署
[原创]win10下搭建vue开发环境 如果要转发,请注明原作者和原产地,谢谢! 特别说明:下面任何命令都是在windows的命令行工具下进行输入,打开命令行工具的快捷方式如下图: 详细的安 ...
- windows下实现微秒级的延时
windowsintegeriostream汇编嵌入式任务 最近正在做一个嵌入式系统,是基于windows ce的,外接硬件的时序要微秒级的延时.1.微秒级的延时肯定不能基于消息(SetTimer函数 ...
- (原创)Windows下使用android ADT工具dmtracedump.exe绘图
在windows下使用dmtracedump绘图时,出现如下错误: 'dot' 不是内部或外部命令,也不是可运行的程序 或批处理文件. 应该是没有dot这个执行程序,安装:Graphviz程序,然后将 ...
- (原创)Windows下编译的Shell脚本不能再Linux中运行的解决办法
一.原理 Windows编译的文件和Linux编译的文件格式不太一样,导致在Linux运行Shell脚本的时候会提示:/bin/bash^M: bad interpreter: 没有那个文件或目录. ...
- 【原创】 windows下开发软件推荐
1. 数据库查看器工具 navicat.exe
- 在Windows及Linux下获取毫秒级运行时间的方法
在Windows下获取毫秒级运行时间的方法 头文件:<Windows.h> 函数原型: /*获取时钟频率,保存在结构LARGE_INTEGER中***/ WINBASEAPI BOOL W ...
- 原创 C++应用程序在Windows下的编译、链接:第三部分 静态链接(二)
3.5.2动态链接库的创建 3.5.2.1动态链接库的创建流程 动态链接库的创建流程如下图所示: 在系统设计阶段,主要的设计内容包括:类结构的设计以及功能类之间的关系,动态链接库的接口.在动态链接库中 ...
- 原创 C++应用程序在Windows下的编译、链接:第一部分 概述
本文是对C++应用程序在Windows下的编译.链接的深入理解和分析,文章的目录如下: 我们先看第一章概述部分. 1概述 1.1编译工具简介 cl.exe是windows平台下的编译器,link.ex ...
- windows下基于(QPC)实现的微秒级延时
1.为什么会写windows下微秒级延时 在上一篇 实现memcpy()函数及过程总结 中测试memcpy的效率中,测试时间的拷贝效率在微秒级别,需要使用微秒级时间间隔计数. windows下提供Qu ...
随机推荐
- CSS基础一
css作用 css将内容和样式相分离,便于修改样式.HTML 写网页的内容,CSS写内容的样式 CSS构成 p{ /*p为标签,也可以称为选择器,选择包住的内容的格式*/ font-size:12px ...
- 2019.03.11 COGS2652 秘术(天文密葬法)(分数规划+长链剖分)
传送门 题意:nnn个点的树,每个点两个值a,ba,ba,b,问长度为mmm的路径∑ai∑bi\frac{\sum a_i}{\sum b_i}∑bi∑ai的最大值. 思路:一眼要01分数规划, ...
- php hash_file
string hash_file ( string $algo , string $filename [, bool $raw_output = FALSE ] ) 参数¶ algo 要使用的哈希算法 ...
- linux时区和时间设置
1,修改时区 调整时区使用tzselect [root@lyn ~]# hwclock Tue Nov :: PM AST -0.198205 seconds [root@lyn ~]# tzsele ...
- Multi-pattern string match using Aho-Corasick
我是擅(倾)长(向)把一篇文章写成杂文的.毕竟,写博客记录生活点滴,比不得发 paper,要求字斟句酌八股结构到位:风格偏杂文一点,也是没人拒稿的.这么说来,arxiv 就好比是 paper 世界的博 ...
- ArcSDE
ArcSDE,即数据通路,是ArcGIS的空间数据引擎,它是在关系数据库管理系统(RDBMS)中存储和管理多用户空间数据库的通路.从空间数据管理的角度看,ArcSDE是一个连续的空间数据模型,借助这一 ...
- IDEL中easyui使用jstl和el出现传值不显示的问题
<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding=& ...
- 学习Python第五天
今天咱们讲一下元组,hash,字典,元组是数据类型其中之一 元组的特性为有序的,不可变的,但是如果其中有可变元素,这些可变元组还是可以改变的,代码如下: 元组的写法:name = (‘roy’,‘al ...
- Codeforces831B Keyboard Layouts
B. Keyboard Layouts time limit per test 1 second memory limit per test 256 megabytes input standard ...
- 【webpack】-- 入门与解析
每次学新东西总感觉自己是不是变笨了,看了几个博客,试着试着就跑不下去,无奈只有去看官方文档. webpack是基于node的.先安装最新的node. 1.初始化 安装node后,新建一个目录,比如ht ...