DPC延迟过程调用

每个设备对象中都含有一个KDPC对象,DEVICE_OBJECT中有一个内置的DPC对象
Dpc。当在驱动程序的AddDevice例程创建了设备对象后,如果需要用DPC例程就要在
AddDevice例程中调用IolnitimizeDpcRequest初始化这个内置DPC对象,同时注册
一个DPC例程。IolnitializeDpcRequest的~个参数为FDO设备对象,一个为指向DPC
例程的指针。
PCI总线接口板及其WDM驱动程序开发
在初始化一个DPC对象后,你就可以在ISR中调用IoRequestDpc请求一个DPC调
用,调用IoInitializeDpcRequest函数将DPC对象与DPC例程、驱动程序创建的设备
对象联系起来。当在ISR中调用IoRequestDpc时,I/0管理器调用KeInsertQueueDpc
函数将DPC对象排队。当IRQL低于DISPATCH_LEVEL时内核将DPC对象出队,然后在
DISPATCH—LEVEL运行驱动程序的DPC例程。
为了进行下一次的设备IO操作,DPC例程一般情况下要设置相应的硬件设备,然后
调用IoStartNextPacket将下一个IRP出队,调用IocoIIlpleteRequest完成当前的iRP
请求,
VOID DpcForIsr(⋯)
{
PIRP Irp=fdo一>CurrentIrp:
IoStartNextPacket(fdo,TRUE):
IoCompleteRequest(Irp,<boost value>):
)

IoStartNextPacket的TRUE参数指出下一个IRP可以被取消,即loStartPacket
的原始调用中指定了取消例程,这将使IoStartNextPacket函数在访问设备对象和
CurrentIrp时需申请全局取消自旋锁的保护。
通常我们在调用loCompleteRequest前先调用loStartNextPacket函数,这样在开
始完成有可能是长耗时的IRP处理前,可以使设备忙于处理新请求。
由于ISR阻断了低于其中断级的所有操作,当有大量的数据传输时,要衡量传输时
间与系统效率的平衡,一般情况下要在DPC例程中完成数据传输。如果数据很少,可以
在ISR中直接完成传输,而DPC例程只用来在最后完成IRP请求,并使下一个IRP出队,
进行处理。
IoRequestDpc函数把它的DPC对象放到队列中。如果在DPC例程运行前,设备又生
成一个中断,并且ISR为此又请求了一个DPC,那么内核将忽略第二个DPC请求。不管
ISR连续请求了多少个DPC,DPC对象仅在队列上排队一次,而且内核也仅调用DPC例
程一次。在这个调用中,DPC例程需要完成所有发生在第一个DPC之后的所有中断的相
关工作,这样在ISR中要记录相应的设备状态及中断的次数。
除了可以使用设备对象内置的DPC对象外,还可以在设备扩展中创建自己的DPC对
象,然后在AddDevice例程中调用KeInitializeDpc初始化该对象,并且将~个白定义
DPC例程的地址与该DPC对象联系起来。为了运行自定义DPC例程,要在中断处理程序
中调用KeInsertQueueDpc函数将DPC对象排队,如果排队成功则返回TRUE,如果该
DPC已经在队列中则返回FALSE。传递给DPC例程的参数一个在调用KelnitializeDpc
时提供,另外两个在调用KeInsertQueueDpc函数时提供,为了与基本DPC处理程序兼
容,可以将参数设置为FDO、IRP、和设备扩展。
驱动程序的StartIo例程、Dispatch例程、DpcForlsr例程或CustomDpc例程会与
中断例程频繁的访问相同的硬件资源,ISR的执行屏蔽了驱动程序中其他例程对硬件访
PCI总线接口扳及其WDM驱动程序开发
问的操作,这样就有可能破坏数据的完整性,为了解决这个问题,可以使用临界段的方
法。ISR例程与synchcritsection例程中的代码为临界段代码,系统在调用这两个例
程前,先提升处理器的IRQL到设备的DIRQL的值,并取得一个自旋锁,在例程返回后,
系统释放自旋锁,降低处理器的IROL,这样就可以阻止处理器被其他的中断例程所打
断。为了调用非中断例程的临界段代码,驱动程序必须调用KeSynchronizeExecution
例程。这个例程的一个参数为临界段例程的地址,一个驱动程序定义的上下文信息和一
个中断对象指针。同ISR例程一样,临界段例程也应该尽快完成,完成必须的设备寄存
器设置和上下文信息的更新。
一个设备驱动程序应将主要的10处理过程放在
PASSIVE LEVEL级的分发例程,DISPATCH_LEVEL级的StartIo例程和DPC例程。”””。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值