IRQL深入解析(2)--驱动级别

本文深入探讨了Windows驱动程序中IRQL的概念,解释了PASSIVE_LEVEL、APC_LEVEL、DISPATCH_LEVEL和DIRQL的含义及应用场景,强调了在不同IRQL级别下共享数据的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  今天来看看驱动中常见的几种IRQL。每个NDIS API函数,在DDK文档中都描述了它的IRQL.


      PASSIVE_LEVEL:


      IRQL最低级别,没有被屏蔽的中断(即中断所有IRQL的中断),在这个级别上,线程执行用户模式,可以访问分页内存。DriverEntry(), AddDevice()和大部分IRP Dispatch函数都运行在PASSIVE_LEVEL。


      APC_LEVEL:
      在这个级别上,只有APC级别的中断被屏蔽(即中断除了IRQL=APC_LEVEL的中断),,可以访问分页内存。当有APC发生时,处理器提升到APC级别,这样,就屏蔽掉其它APC,为了和APC执行一些同步,驱动程序可以手动提升到这个级别。比如,如果提升到这个级别,APC就不能调用。在这个级别,APC被禁止了,导致禁止一些I/O完成APC,所以有一些API不能调用。另外,系统在APC_LEVEL处理缺页中断,所以,执行在>=APC_LEVEL上的代码必须存放在NON-PGAE内存中。


        DISPATCH_LEVEL
        这个级别,DPC 和更低的中断被屏蔽,不能访问分页内存,所有的被访问的内存不能分页。因为只能处理分页内存,所以在这个级别,能够访问的Api大大减少。StartIo(),DPC函数和许多其他函数都运行在DISPATCH_LEVEL。这是因为,他们要存取device object和device extension的内容,这样克以不被IRP Dispatch routines所抢占。
        DIRQL (Device IRQL)
        一般的,更高级的驱动在这个级别上不处理IRQL,但是几乎所有的中断被屏蔽,这实际上是IRQL的一个范围,这是一个决定某个驱动有更高的优先级的方法。thread dispatch(线程调度)函数运行在这个LEVEL上。所以,运行在>=DISPATCH_LEVEL的线程将独占处理器,除非有比他高LEVEL的中断产生。


 


说明:如果要共享数据,那么所有对该数据存取的活动都要安排在高于PASSIVE_LEVEL的同一个IRQL上。这样,在单CPU环境下,就能有效地避免共享冲突。


http://blog.163.com/sun201201@126/blog/static/1186458020077311525743/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值