ISR 中断服务例程

驱动学习 专栏收录该内容
30 篇文章 1 订阅

原文链接:http://blog.csdn.net/keepdoingit/article/details/5122702

当硬件设备的中断信号发生后, 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);

                                 ...

                        }

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值