对于运行在 IRQL 等于或者大于dpc dispatch leve 的code 有两个规则必须遵守:
1) 不能等待任何一个object。 因为这个操作会触发系统的scheduler去选择另外一个thread执行,但是系统的scheduler也是在dpc dispatch level运行,所以此时scheduler根本不会被执行。
2) 只能访问非分页 nonpaged 内存。 这是第一条规则的副作用。当访问分页paged内存是,有可能触发页错误 page fault,此时内存管理器 memory manager就会调用磁盘访问disk I/O试图从磁盘读入数据,这就需要等待文件系统驱动程序,这个“等待”操作同样需要scheduler去进行线程切换,这就违反了第一条规则。
windows的系统服务system service是如何从user mode 转入 kernel mode的:
1) 对于32位的x86 系统,在Pentium II 以前,通过软中断 int 2E指令; 在Pentium II 以及 Pentium II以后,是通过专门的指令 sysenter。
2) 对于64位系统,windows使用 syscall指令。