【原创】浅说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 ...
随机推荐
- 解决在静态页面上使用动态参数,造成spider多次和重复抓取的问题
我们在使用百度统计中的SEO建议检查网站时,总是发现“静态页参数”一项被扣了18分,扣分原因是“在静态页面上使用动态参数,会造成spider多次和重复抓取”.一般来说静态页面上使用少量的动态参数的话并 ...
- s6 传输层
标题 s6-1 传输层概述(2019-04-06 21:19) s6-2 UDP(2019-04-07 08:39) s6-3 通信模型(2019-04-07 08:47) s6-4 TCP 数据段( ...
- fromdata上传多个文件
function upload_single_file(value){ if(value==''){ layer.msg('请添加文件',{time:1500}) }else{ var formDat ...
- idea编辑器激活码
激活方式:License Server1.将地址 http://active.chinapyg.com/ 或者 http://idea.toocruel.net 任意一个复制到License Serv ...
- Beta冲刺 (2/7)
Part.1 开篇 队名:彳艮彳亍团队 组长博客:戳我进入 作业博客:班级博客本次作业的链接 Part.2 成员汇报 组员1(组长)柯奇豪 过去两天完成了哪些任务 熟悉并编写小程序的自定义控件 展示G ...
- python random 模块
http://blog.csdn.net/m0_38061927/article/details/75335069
- 记录一下msf的学习使用
刚刚用Metasploit Pro scan了一下云端服务器.RHOST直接输IP就好. 得到反馈如下: [*] [2019.04.04-14:27:35] Scan initiated: Speed ...
- java持有对象-集合类
面阿里的时候,面试就让我说一下集合 当时由于条件原因没听清面试官的问题,后来面试后,面试官让问他问题的时候,才说明白是什么 下面就接受一下我了解的集合类 集合类中大致可以分为两个体系 一.collec ...
- 常用的头文件—— common.h
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/sta ...
- Android中监控home键
一.需求 在应用开发过程中,启动服务开启线程锁等待服务返回解锁,为了避免点击home键使线程锁卡死的bug,需要监控home键,解锁线程. 二.实现 在应用时,需要register和unregiste ...