ISR 中断服务例程

  当硬件设备的中断信号发生后, IRQL会提升至相应的DIRQL级别, 操作系统会调用相应的中断服务例程. 如何在驱动程序中写中断处理程序呢?当硬件启动的时候,会有一个IRP_MN_START_DEVICE包发送给驱动程序, 在这个包中包含中断信息, 驱动程序调用IoConnectInterrupt()函数将该中断注册, 这样windows内核就可以收到这个中断,并调用驱动中的对应的中断处理函数.

  每一个硬件中断都具有一个DIRQL, 所有的IRQL都比软件的IRQL高. 自旋锁的dispatch_level也要在DIRQL这下, 所以在有硬件中断参与的情况下,自旋锁已经起不到同步的作用了.StartIO, 派遣函数随时都可能被中断处理程序打断. 为了防止这种事情发生, windows提供了KeSynchronizeExecution()函数来提升程序的IRQL级别.

  DPC例程

  为什么需要DPC? 因为DIRQL的中断优先级特别高, 一旦它执行起来了, 其他的软件级别的代码根本得不到机会运行, 一些级别低的硬件中断也得不到机会运行, 比如鼠标和键盘可能都得不到响应.这种状态不好.所以我们WINDOWS提供给我们一种方法来解决这个问题,即将非常重要的代码放在ISR里面执行, 不是特别重要的代码转到DPC里面去执行, DPC是运行在DISPATCH_LEVEL级别的, 这样的话,至少键盘和鼠标可以有机会响应了.

  要使用DPC例程, 首先要初始化DPC对象,  KeInitializeDPC()负责这个初始化工作. 在DriverEntry()或AddDevice()进行这个初始化操作。

最后在中断处理程序里面调用DPC例程:

            BOOL Interrupt(interrupt , context) 

                     {

                                 ...

                                 IoRequestDPC(device, device->currentIRP, NULL);

                                 ...

                        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值