阅读:1475回复:3
如何理解中断与分发例程
作为一个初学者,我深深感到如何写好驱动程序里中断例程非常重要.
但是我偏偏没有很好的理解中断与分发例程的关系,在这里希望各位前辈给我指点. 我现在列举一个简单的模型: 1.应用程序产生的IRP(如读.写)通过分发例程发送给标准设备的StartIo串行处理; 2.从驱动程序写数据到设备时,需要一个写中断..从设备读数据到驱动程序时,需要一个读中断. 我现在不是很明白IRP如何在这种模型中,是如何处理的,是怎样个流程. 是不是在AddDevice例程中,使用了IoConnectInterrupt例程链接到中断以后,在处理IRP的时候,必须等待到中断,标准设备的StartIo例程才开始处理IRP? |
|
沙发#
发布于:2002-01-09 17:06
[quote]作为一个初学者,我深深感到如何写好驱动程序里中断例程非常重要.
但是我偏偏没有很好的理解中断与分发例程的关系,在这里希望各位前辈给我指点. 我现在列举一个简单的模型: 1.应用程序产生的IRP(如读.写)通过分发例程发送给标准设备的StartIo串行处理; 2.从驱动程序写数据到设备时,需要一个写中断..从设备读数据到驱动程序时,需要一个读中断. 我现在不是很明白IRP如何在这种模型中,是如何处理的,是怎样个流程. 是不是在AddDevice例程中,使用了IoConnectInterrupt例程链接到中断以后,在处理IRP的时候,必须等待到中断,标准设备的StartIo例程才开始处理IRP? 1)IoConnectInterrupt只是表明你的驱动程序挂接了一个硬件中断 2)只要你调用IoStartPacket ,就会将一个IRP发到将IRP发IoStartIO 3)IRP被发到IOSTARTIO里后,因为,这个IRP的完成是要靠中断驱动的,也就是说,此IRP的完成在DPC里,在DPC的最后,会有一个IoStartNextPacket,这个函数就会将另一个在队列中的IRP发送到IoStartIO里(如果有IRP在排队的话) |
|
板凳#
发布于:2002-01-10 16:32
非常感谢jeosph。
现在我的困惑就是如何在什么地方进行处理IRP。 比如说现在我的程序中有一个Read和Write函数,对设备进行读和写。如果没有中断时,这些函数是在StartIo中进行处理。 VOID StartIo(IN PDEVICE_OBJECT fdo,IN PIRP Irp) { PWDM_DEVICE_EXTENSION dx = (PWDM1_DEVICE_EXTENSION)fdo->DeviceExtension; PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp); NTSTATUS status = STATUS_SUCCESS; switch( IrpStack->MajorFunction) { case IRP_MJ_WRITE: Write(dx,Irp); break; case IRP_MJ_READ: Read(dx,Irp); break; default: status = STATUS_NOT_SUPPORTED; break; } IoStartNextPacket( fdo, TRUE); } 如果是中断驱动的驱动程序中该如何调用这些函数来正确处理?比如DpcForIsr中该如何做? |
|
地板#
发布于:2002-01-11 10:36
非常感谢jeosph。 在你创建设备时同时:IoInitializeTimer() 在(***) IoStartTimer() (***) 处不要处理Write(dx,Irp); 到必要的信息必须保留(放在dx中) 等待设备中断 中断服务处理,申请DPC,在DPC中处理Write(dx,Irp), 处理完毕后 iostartNextPacket() 启动下一个IRP IoCompleteRequest()完成刚才被处理的IRP Timer的目的就是防止长时间没有中断,比如10秒,没有中断,可以失败此IRP。 另外,在ISR,DPC中就射击到判断fdo->CurrentIrp是否为当前IRP的问题,不要错误地处理了不存在的,或别人的IRP。 :P |
|