Re: windows中断调试方面的问题

Windows内核调试

windows中断调试方面的问题


ggggchen 2007-12-12, 17:23 下午

     我调试一个miniport的driver. 在中断的处理函数中设断点,发现eflag的IF位总是1.  这说明中断处理程序运行的时候,cpu是可以响应先的中断请求的. 我们知道CPU从中断门进入中断时候intel x86,架构cpu是会自动的将IF设为0的. 因此windows的miniport的中断处理程序此时IF设为1,应该是windows内核的底程中断处理函数里面就将IF手动设为了1.这样也可以理解,因为<<windows internals>>里面提到过,windows是通过软件实现中断优先级,所以可以假设在windows中,中断处理程序运行时IF总是1,如果有先中断到来,底程内核代码会去判断现在中断优先级,而决定是否当前的routine能否被打断.这个是我的理解.

     但是我突然想到一个问题,当我们用windbg去调试目标机的时候,可能为了支持windbg调试目标机,目标机的IF才总设为1,不然WINDBG不可以使目标机突然停止什么的.所以从windbg中看到的目标机的IF标志的值,不一定就是真实情况运行时候的.我不知道到底是怎么情况.问高人讲解一下.

 

Re: windows中断调试方面的问题


格蠹老雷 2007-12-15, 22:39 下午
同意第一段的理解。关于第二段,IF位的设置与是否调试没什么关系。第一,观察一下系统的异常和中断处理函数,它们确实是在很“前沿的”处理函数中就执行STI指令设置IF位,以除零异常的KiTrap00函数为例:
kd> u nt!KiTrap00+0x5f
nt!KiTrap00+0x5f:
804dac81 66837d6c1b cmp word ptr [ebp+6Ch],1Bh
804dac86 751d jne nt!KiTrap00+0x83 (804daca5)
804dac88 fb sti
804dac89 55 push ebp
804dac8a e887c61200 call nt!Ki386CheckDivideByZeroTrap (80607316)
804dac8f 8b5d68 mov ebx,dword ptr [ebp+68h]
804dac92 e909feffff jmp nt!KiExceptionExit+0x16f (804daaa0)
804dac97 fb sti
粗略看来,以上存在两天STI指令。仔细分析,这两个指令的执行是与是否在调试没有关系的。
第二,第二段描述的内核调试通信本身是不需要启用IF位的。因为当目标内核中断到调试器时,当前的CPU把IRQL提升到高(HIGH_LEVEL),不做别的事情只是和调试器通信,因此不需要中断来进行数据接收和发送。

Re: windows中断调试方面的问题


ggggchen 2007-12-17, 09:20 上午
谢谢:).非常感谢.

Powered by Community Server Powered by CnForums.Net