中断级和自旋锁

本文详细介绍了中断级的概念,包括中断级的分类、如何提高到DPC级及其应用场景,强调了在DPC级别中不能使用分页内存的原因。同时,文章探讨了自旋锁的原理和作用,作为保证内核函数访问同步的一种机制,并给出了自旋锁的编码示例。最后,文章通过两个试验展示了如何提高优先级和插入函数到DPC队列。
摘要由CSDN通过智能技术生成

知识点

中断级

1、中断级(IRQL):数字越大优先级越高,优先执行,等级越低越容易被等级高的程序打断。0级 pass_level 1级 apc_level 2 级 dpc_level,比2级dpc高的是 硬件中断级 。我们一般就是要提高到DPC级

每一个内核函数都要运行优先级
在这里插入图片描述

2、通过编程可以把代码提高到2级 DPC这个中断基本,这个也叫做ISR延时调用,当某个硬件设备引发一个高中断的时候,可以把不那么紧急的任务放在DPC里面跑。DPC是通过无硬件达到的最高例程,这个中断很难被打断,能打断它的只有硬件中断。
dpc有一个队列,也可以叫线程池,当CPU处理完高于DPC中断级的任务后就来找这个队列,然后依次执行这个队列,我们也可以不用插队列的形式短暂的把我们当前任务请求级别提高到DPC

3、通过KeGetCurrentIrql()函数可以知道当前代码运行在哪个中断级。

4、KeRaiseIrqlToDpcLevel() 提高到DPC优先级,返回值是提高前的优选级

5、KeLowerIrql(oldirql) 恢复到以前的优选级

6、如果提高到DPC优选级后不降低优选级会蓝屏

7、要HOOK NtOpenFile 在修改该函数头时,第一,不希望它被执行,第二我们不希望我们正在修改的这个过程被打断,先要把IRQL 提升到DPC 等级 ,而且要关闭CPU中断,然这一小段时间然CPU不接收任何中断,就可确保这个修改函数的过程一次通过

8、DPC的中断级很高,DPC中不允许使用分页内存,当我们在一个DPC例程里面访问一个换页内存的时候,如果这个换页内存刚好换进了物理内存,在物理内存的时候,不在磁盘上,一切OK没有问题,但是当页面被页面被换到磁盘上的pagefile.sys 会引发
swappage换页,引发缺页中断,缺页中断一般打不断DPC的过程,这时DPC访问的是一个无效的内存时会蓝屏。所以DPC编程的时候切记不要使用换页内存,也就是不要使用ExAllocate这个函数

自旋锁

1、就是排队执行,不让多个程序访问一个内核函数时乱套

2、自旋锁机制,本质是提高中断级,进锁以后中断级就在DPC上面,保证进入锁的代码不会被其它代码打断

3、和我写前台多窗口切换线程是一个道理

4、要先初速化自旋锁

KSPIN_LOCK spinlock = {
    0 };//自旋锁全局变量    此段代码放在引用头文件后面
//---------------自旋锁开始 可放在入口函数-------------------

	/// KeInitializeSpinLock自旋锁函数
	///&spinlock 全局变量
	KeInitializeSpinLock(&a
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值