阅读:984回复:4
请问一个irp的问题
应用程序通过DeviceControl给驱动程序发送命令,产生相应的irp。如果应用程序多次调用DeviceControl,那么将产生多个irp,假设这些irp都不能够立刻返回,驱动程序把它们都设置为pending。这样就产生一个irp队列,不防设队列中有3各这样的irp,先后顺序为irp1、irp2、irp3。问题如下:
1.这个队列由操作系统管理还是驱动程序管理? 2.如果我在驱动程序的设备类中(我用ds开发的驱动程序)分别定义三个KIrp类型的成员函数m_irp1、m_irp2、m_irp3对应于irp1、irp2、irp3。某一时刻iip2对应事件发生,驱动程序通过m_irp2操作irp2来完成它。完成后,irp2是不是已经从irp队列中去掉了呢?即现在的irp队列是不是已经变成irp1、irp3了呢? |
|
最新喜欢:Xman |
沙发#
发布于:2003-02-28 21:14
1,既可以用操作系统队列来管理,也可用驱动程序队列来管理,通常由驱动程序分别针对读和写创建两个队列来管理。
2,IRP排队通常不会发生,仅当在多CPU的机器上才会发生,对于一个CPU的情况,永远不会发生IRP排队的情况,即使DeviceControl是异步的。 3,驱动程序的模型是针对多CPU,跨不同寻址方式CPU的,即您设计的驱动程序既适用于单CPU也适用于多CPU,既适用于x86,也适用于Alpha。 4,对于IRP队列,如果发生IRP排队,当您在IRP最终处理函数m_irp*中使用IoComplete()时,irp就从队列中去掉了(对于驱动程序排队的情况,是通过驱动程序的一个链表来实现的)。 |
|
板凳#
发布于:2003-02-28 23:26
1.既然单CPU时IRP不会排队,而我在驱动程序中又没有使用队列来管理IRP,那么这三个IRP(都已设为PENDING)操作系统不是使用队列又是如何管理的呢?
2.我设计的驱动程序中,应用程序只是通过DeviceIoControl发出了一次请求,驱动程序把它设为pending,并时device类的一个成员m_irp指向该irp。当某一事件触发后,驱动程序通过m_irp使用IoComplete()完成了该irp。应用程序收到数据后退出,可是我发现我的机器却不能正常的关机和重启了。既然这个irp已经完成了,应该不会又什么问题了,但实时说明它并没有真正的完成。问题可能出在哪里了呢? |
|
地板#
发布于:2003-03-01 02:49
每个线程都可以发出IRP,这些IRP就会进入队列。如果你的驱动不能处理多线程或及时返回,后面的IRP就会等待,和CPU的多少无关。
|
|
地下室#
发布于:2003-03-10 12:09
zab兄:
应该还是代码上的问题,关于驱动模型,几本翻译过来的书上写得很明白,虽然对于单CPU不存在排队问题(即使使用了多个线程,但一个线程的IRP没有执行完,另外一个线程是不会运行的,尽管DeviceIoControl()是异步的,只有当多个CPU分别运行多个线程时,才有可能出现访问设备的竞争可能,所以IRP要排队;如果是同步IRP,即使对于多CPU也不会发生竞争,则不用考虑排队问题),但是驱动模型就是那样规定的,要求跨平台(对于不同的CPU要进行地址转换,还要针对不同个数的CPU)所以要排队。如果有问题还是在代码上,不排队可以立即执行IRP访问设备直接返回没有问题,如果排队,在返回时还要执行让下一个IRP出队列的操作。 |
|