中断级别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中断级别了解的更多相关文章

  1. 64位内核开发第十二讲,进程监视,ring3跟ring0事件同步.

    一丶同步与互斥详解,以及实现一个进程监视软件. 1.用于线程同步的 KEVENT 事件很简单分别分为 事件状态. 以及事件类别. 事件状态: 有信号 Signaled 无信号 Non-signaled ...

  2. 64位内核开发第六讲,Windbg调试ring3跟Ring0.一起调试

    目录 驱动第六讲_Windbg连续调试Ring3.与Ring0 一丶Windbg连调试 驱动第六讲_Windbg连续调试Ring3.与Ring0 一丶Windbg连调试 有时候我们调试一个程序.可以使 ...

  3. 64位内核开发第四讲,查看SSDT表与showSSDT表

    目录 SSDt表与ShadowSSDT表的查看. 一丶SSDT表 1.什么是SSDT表 2.查看步骤 二丶ShadowSSDT表 1.什么是ShadowSSDT表 2.如何查看. 三丶工具介绍 SSD ...

  4. 64位内核开发第二讲.内核编程注意事项,以及UNICODE_STRING

    目录 一丶驱动是如何运行的 1.服务注册驱动 二丶Ring3跟Ring0通讯的几种方式 1.IOCTRL_CODE 控制代码的几种IO 2.非控制 缓冲区的三种方式. 三丶Ring3跟Ring0开发区 ...

  5. Win7 64位系统,IE11,如何让IE的Tab强制运行64位内核?

    有些人在使用TerraExplorer Pro 7版本进行web二次开发的时候,常会遇到下面截图中这样的问题, 这个问题主要是因为安装的TerraExplorer Pro 7 版本是64位的,而模型运 ...

  6. 64位内核注冊tty设备

    在64位系统中,注冊tty设备须要注意的是,Android跑在EL0而且在32位模式下,kernel跑在EL1而且在64位模式下,不但内核须要打开CONFIG_COMPAT选项,非常多android上 ...

  7. ASP.Net在64位环境开发部署常见问题

    越来越多的开发团队開始使用64位操作系统作为开发环境,也计划将应用部署在安装有64位操作系统的server上.对于ASP.Net开发人员来说.使用64位环境开发部署须要注意下面几个问题.可在项目过程中 ...

  8. win7win8 64位汇编开发环境合集安装与设置

    win7win8 64位汇编开发环境合集安装与设置 下载 win7 win8  64位汇编开发环境.rar 下载地址(免积分下载) http://download.csdn.net/detail/li ...

  9. 利用Code::Blocks搭建64位C++开发平台

    0.前言 随着64位计算机的普及,编写64位程序成为程序员基本的要求.我在<体验Code::Blocks下的C++编程>中描述了利用Code::Blocks官方提供的封装了编译器的安装包( ...

随机推荐

  1. kubernetes第八章--NFS PersistentVolume

  2. 【转载】 C#使用Math.PI常量来表示圆周率

    在C#中计算圆形面积的时候,我们时常会用到圆周率这个变量,圆周率我们一般定义为十进制decimal类型变量,圆周率的值为3.1415926535等一个近似值,其实在C#的数值计算类Math类中,有专门 ...

  3. ubuntu安装mysql数据库方法

    ubuntu基于linux的免费开源桌面PC操作系统,十分契合英特尔的超极本定位,支持x86.64位和ppc架构.一个比较流行的Linux操作系统,不仅简单易用,而且和Windows相容性非常好.那么 ...

  4. nginx 开启 gzip 压缩

    现在使用vue或react开发的项目越来越多,纯js渲染,导致js体积越来越多,动辄就是几百上千kb,此时可以使用gzip的方式压缩js大小,减少请求时间与流量. 配置: http { gzip on ...

  5. Ubuntu安装KScope

    命令安装 # apt-get install kscope 1. 编译安装 # tar xvf kscope-1.9.4.tar.gz # cd kscope-1.9.4 # qmake # make ...

  6. 如何使用jenkins部署maven父子工程

    最近使用jenkins自动部署项目时遇到一个问题,如果部署单个的maven工程,没有什么问题, 但是在部署maven创建的父子工程,如果只从svn或者git上拉取子工程源码时,会报找不到父 工程pom ...

  7. python使用tkinter无法获取输入框的值

    如果遇到:使用tkinter无法获取输入框Entty()的值的问题,需要检查一下,是否在定义Entry()时立即进行了pack() 会出现使用entryname.get()报错 解决方法:把定义和pa ...

  8. prometheus operator 部署

    prometheus operator 部署自定义记录 环境: k8s 1.11集群版本,kubeadm部署 docker 17.3.2版本 Centos 7系统 阿里云服务器 operator 源码 ...

  9. Linux常用时间函数

    time()函数: NAME time - get time in seconds SYNOPSIS #include <time.h> time_t time(time_t *tloc) ...

  10. CentOS7使用阿里yum源安装Docker

    yum install -y yum-utils device-mapper-persistent-data lvm2安装所需的包 # yum-config-manager --add-repo ht ...