阅读:1483回复:4
几个一直没有弄懂的问题
1. 是不是在DISPATCH_LEVEL上不会发生线程切换? 如某个线程提升自己到DISPATCH_LEVEL,定时器回调和socket回调函数是否被阻塞(它们都是DIPATCH_LEVEL)?
2. 如果Win32程序开几个线程操作驱动程序,当某个Win32线程在驱动里提升到DISPATCH_LEVEL,其他Win32线程能否进入驱动? 3. 2中如果可以进入,如何互斥. KeWaitForSingleEvent()的时间参数为0时,是否失去实际意义? |
|
沙发#
发布于:2003-12-19 10:41
在dispatch level,要么是自己运行完了,要么是被其它更高的irql如硬件中断打断了。
2、其它Win32线程就没有机会运行,在单CPU下。 |
|
板凳#
发布于:2003-12-19 12:30
谢谢arthurtu.
我还有一个问题: 一个 tdi socket线程,本身是PASSIVE_LEVEL,它和下层tcp驱动通信后,有没有可能自己的IRQL被提升到DISPATCH_LEVEL. 我下了本站的那个tdi tcp的例子,发现有时奇怪的出现IRQL_NOT_LESS_OR_EQUE 的蓝屏.那个例子到处都是 ASSERT( KeGetCurrentIrql() == PASSIVE_LEVEL );的断言,搞得我心惊胆战的 |
|
地板#
发布于:2003-12-19 14:15
一般提升irql是为了访问共享资源的时候防止冲突,会回复到以前的irql的
|
|
地下室#
发布于:2003-12-19 21:11
IRQL_NOT_LESS_OR_EQUE
这个信息并不一定是由于IRQL造成的,比如你在DISPATCH_LEVEL访问分页内存,甚至由于程序的原因造成空指针访问时,都有可以引发IRQL_NOT_LESS_OR_EQUE。 |
|
|