64位内核开发第十讲,IRQL中断级别了解
中断级别IROL了解
一丶IRQL
1.了解什么是中断
中断就是产生的一个电信号.比如键盘.当按下就会产生电信号发送给CPU
而CPU就会停止当前处理.去执行电信号.他是根据IRQL中断级别来进行处理的.
如下图:

中断说白了就是个电信号.打断CPU执行的代码. 去调用中断处理函数.
此时CPU就处于硬件上下文.
2.IROL中断级别.
因为会产生很多CPU电信号.所有硬件同是发送中断处理级别怎么办.所以需要为这些级别分一个优先级. CPU会先执行优先级高的.会把优先级低的给屏蔽掉.
当CPU处于中断上下文的时候. CPU不能是阻塞的/阻塞. 没有进程可以调度.
了解CPU的上下文.至少脑海需要有印象
| 上下文 | 说明 |
|---|---|
| 中断上下文 | CPU代替硬件做某些事情. |
| 进程上下文 | CPU代替进程做某些事情. |
中断级别了解
如下图:

软件中只会处理下面三种级别.
DISPATCH_LEVEL最高
APC_LEVEL 其次
PASSIVE_LEVEL最低
3.遵守IROL编程规范的方式
1.查询MSDN.MSDN最下面有IRQL级别的说明.
运行在DISPATHCH_LEVEL级别的上下文.如何调用PASSIVE_LEVEL级别的函数.
如我们有一个需求.
当键盘按下的时候. 键盘的优先级最高. 会运行在DISPATCH_LEVEL级别.但是此时
按照我们Ring3编程的想法.你可能会调用ZwCreateFile这个函数进行将按键写入到文件中.
但是此时我们如果查询MSDN之后就会发现.其实ZwCreateFile是不能运行在DISPATCH级别的. 此时解决方法 就是创建一个 工作线程. 工作线程中完成
我们想要操作的事情.
3.在PASSIVE级别下.我们可以使用任何内存没有限制.
首先了解下如下表格.
| 函数 | 运行级别 |
|---|---|
| DriverEntry | Passive级别. |
| 各种派遣函数 | Passive级别 |
| 完成函数 | Dispatch级别 |
| 各种NDIS回调函数 | Dispatch级别 |
PASSIVE级别是可以使用任何函数和内存
DISPATCH级别只能访问能运行在DISPATCH级别内存.
非分页内存
NONPAGEPOOL 内存是可以在任何级别使用的.
相关申请内存函数为:
ExAllocatePoolWithTag
PAGEDPOOL 分页内存
只能在PASSIVE级别或者APC级别使用.
我们可以加入一个宏.来判断当前的中断级别.有没有高于APC
产生一个断言.如果当前级别大于APC级别就会报错.
断言宏的意思就是 我决定当前的事就是某事. 如果你不是我指定的.
那么对不起.报错.
使用PAGE_CODE这个宏即可.
其实很简单.宏站看看一下.
#define PAGED_CODE() PAGED_ASSERT(KeGetCurrentIrql() <= APC_LEVEL);
#if (NTDDI_VERSION >= NTDDI_VISTA)
#define PAGED_ASSERT( exp ) NT_ASSERT( exp )
#else
#define PAGED_ASSERT( exp ) ASSERT( exp )
#endif
往下跟很多.....
直到最终
#define NT_ASSERT_ACTION(_exp) \
((!(_exp)) ? \
(__annotation(L"Debug", L"AssertFail", L#_exp), \
DbgRaiseAssertionFailure(), FALSE) : \
TRUE)
其实很简单. 首先调用 KeGetCurrentIrql() 这个函数来判断是否小于等于 APC级别.
然后当参数传递给 PAGED_ASSERT(exp)宏. 里面就调用函数进行断言
断言宏只会在Debug版本中有效.让我们尽快发现问题.
把 PAGE_CODE 放到我们代码块中即可.
64位内核开发第十讲,IRQL中断级别了解的更多相关文章
- 64位内核开发第十二讲,进程监视,ring3跟ring0事件同步.
一丶同步与互斥详解,以及实现一个进程监视软件. 1.用于线程同步的 KEVENT 事件很简单分别分为 事件状态. 以及事件类别. 事件状态: 有信号 Signaled 无信号 Non-signaled ...
- 64位内核开发第六讲,Windbg调试ring3跟Ring0.一起调试
目录 驱动第六讲_Windbg连续调试Ring3.与Ring0 一丶Windbg连调试 驱动第六讲_Windbg连续调试Ring3.与Ring0 一丶Windbg连调试 有时候我们调试一个程序.可以使 ...
- 64位内核开发第四讲,查看SSDT表与showSSDT表
目录 SSDt表与ShadowSSDT表的查看. 一丶SSDT表 1.什么是SSDT表 2.查看步骤 二丶ShadowSSDT表 1.什么是ShadowSSDT表 2.如何查看. 三丶工具介绍 SSD ...
- 64位内核开发第二讲.内核编程注意事项,以及UNICODE_STRING
目录 一丶驱动是如何运行的 1.服务注册驱动 二丶Ring3跟Ring0通讯的几种方式 1.IOCTRL_CODE 控制代码的几种IO 2.非控制 缓冲区的三种方式. 三丶Ring3跟Ring0开发区 ...
- Win7 64位系统,IE11,如何让IE的Tab强制运行64位内核?
有些人在使用TerraExplorer Pro 7版本进行web二次开发的时候,常会遇到下面截图中这样的问题, 这个问题主要是因为安装的TerraExplorer Pro 7 版本是64位的,而模型运 ...
- 64位内核注冊tty设备
在64位系统中,注冊tty设备须要注意的是,Android跑在EL0而且在32位模式下,kernel跑在EL1而且在64位模式下,不但内核须要打开CONFIG_COMPAT选项,非常多android上 ...
- ASP.Net在64位环境开发部署常见问题
越来越多的开发团队開始使用64位操作系统作为开发环境,也计划将应用部署在安装有64位操作系统的server上.对于ASP.Net开发人员来说.使用64位环境开发部署须要注意下面几个问题.可在项目过程中 ...
- win7win8 64位汇编开发环境合集安装与设置
win7win8 64位汇编开发环境合集安装与设置 下载 win7 win8 64位汇编开发环境.rar 下载地址(免积分下载) http://download.csdn.net/detail/li ...
- 利用Code::Blocks搭建64位C++开发平台
0.前言 随着64位计算机的普及,编写64位程序成为程序员基本的要求.我在<体验Code::Blocks下的C++编程>中描述了利用Code::Blocks官方提供的封装了编译器的安装包( ...
随机推荐
- 使用CertUtil.exe下载远程文件
使用CertUtil.exe下载远程文件 证书 https://www.cnblogs.com/17bdw/p/8728656.html 1.前言 经过国外文章信息,CertUtil.exe下载恶意软 ...
- 【洛谷 P5357】 【模板】AC自动机(二次加强版)(AC自动机,差分)
每次匹配都不停跳fail显然太慢了,于是在每个节点和fail指向的点连一条边,构成一棵树,在这棵树上差分一下就好了. AC自动机 就这个算法而言其实没用想象中那么难. #include <cst ...
- PHP写的简单数字验证码
用PHP写的随机生成的5位数字验证码 $yzm = ""; for($i=0;$i<5;$i++) { $a = rand(0,9); $yzm.= $a; } echo $ ...
- SIM800A 建立网络
SIM800A是一款两频GSM/GPRS模块,为SMT封装.其性能稳定,外观小巧,性价比高 可以低功耗实现语音.SMS和数据信息的传输 数据传输 GPRS class 12:最大85.6 kbps(下 ...
- [ipsec][strongswan] strongswan源码分析--(一)SA整体分析
strongswan SA分析(一) 1 概念 下面主要介绍两个本文将要阐述的核心概念.他们是SA和SP.注意,这不是一篇不需要背景知识的文章.作者认为你适合阅读接下来内容的的前提是,你已经具备了一下 ...
- Windows 上搭建Apache FtpServer
阅读目录 第一步:下载Apache FTPServer 第二步:解压Apache FTPServer 第三步:修改配置文件 第四步:启动FTPServer 第五步:访问FTP 第六步:FTPServe ...
- [MySQL] 行级锁SELECT ... LOCK IN SHARE MODE 和 SELECT ... FOR UPDATE
一.译文 翻译来自官方文档:Locking Reads If you query data and then insert or update related data within the same ...
- 初识python多线程
目录 GIL锁 Thread类构造方法 Lock类.Rlock类 参考: python3多线程--官方教程中文版 python多线程-1 python多线程-2.1 python多线程-2.2 pyt ...
- virtual box 6.0 扩容原有磁盘空间 ubuntu18.04
virtual box 6.0 扩容原有磁盘空间 ubuntu18.04 1虚拟介质管理 1.1点击菜单 1.2 修改磁罗容量大小(需要关闭虚拟机),点击应用 2使用ubuntu安装镜像将新加容量添加 ...
- 07 c++中的内联函数inline
文章链接: 问题描述:类中成员函数缺省默认是内联的,如果在类定义时就在类内给出函数定义,那当然最好.如果在类中未给出成员函数定义,而又想内联该函数的话,那在类外要加上 inline,否则就认为不是内联 ...