Re: Idle线程和DPC的关系
Windows内核调试
Idle线程和DPC的关系
wrong
2011-01-10, 10:10 上午
看了张老师的博文,调试笔记:系统挂在DPC(上),
http://advdbg.org/blogs/advdbg_system/articles/2867.aspx,里面有这样一段,
kd> !pcr
CurrentThread: 80551d20
NextThread: 89b512e8
IdleThread: 80551d20
DpcQueue:
0x80552380 0x804ff5b8 [Normal] nt!KiTimerExpiration
0x8abcfed4 0xba7843e8 [Normal] ACPI!ACPIInterruptServiceRoutineDPC
0x8a6560cc 0xba50fdf0 [Normal] NDIS!ndisMDpcX
0x8a899eec 0xbaa28650 [Normal] i8042prt!I8042KeyboardIsrDpc
0x8a899e90 0xbaa2b0ef [Normal] i8042prt!I8xKeyboardSysButtonEventDpc
0x8a899dd0 0xbaa2a163 [Normal] i8042prt!I8042ErrorLogDpc
0xb87ffa4c 0xb87e8020 [Normal] SynTP
0xb87ffa24 0xb87e7f60 [Normal] SynTP
有点疑惑的是,当前线程是idle线程,一般我对idle线程的理解是系统没有事情做的时候,就跑idle,为什么现在DPC不空,当前线程还是idle呢?而且从栈kv的历史来看,idle线程还变成了工作线程,正在执行DPC里面的任务。
kd> kvn
# ChildEBP RetAddr Args to Child
00 80548f98 baa2a7fa 000000e2 00000000 00000000 nt!KeBugCheckEx+0x1b (FPO: [5,0,0])
01 80548fb4 baa2a032 00899d40 01ffffc6 00000000 i8042prt!I8xProcessCrashDump+0x237 (FPO: [3,0,0])
02 80548ffc 80540add 89d6cd98 8a899c88 00010009 i8042prt!I8042KeyboardInterruptService+0x21c (FPO: [Non-Fpo])
03 80548ffc 806d0d50 89d6cd98 8a899c88 00010009 nt!KiInterruptDispatch+0x3d (FPO: [0,2] TrapFrame @ 80549020)
04 805490a4 bac3d183 00000046 8a84c028 882e97c8 hal!HalpPmTimerStallExecProc+0x60 (FPO: [1,5,0])
05 805490c4 b8cb8b50 bafde064 882e981c b8cb8ad6 usbehci!EHCI_RH_PortResetComplete+0x61 (FPO: [2,2,4])
06 805490e4 804ff550 882e97f8 4d547961 33b06716 USBPORT!USBPORT_AsyncTimerDpc+0x7a (FPO: [4,1,4])
07 80549200 804ff667 80551f80 80551d20 ffdff000 nt!KiTimerListExpire+0x122 (FPO: [0,62,0])
08 8054922c 8054111d 80552380 00000000 007af63f nt!KiTimerExpiration+0xaf (FPO: [4,6,0])
09 80549250 80541096 00000000 0000000e 00000000 nt!KiRetireDpcList+0x46 (FPO: [0,0,0])
0a 80549254 00000000 0000000e 00000000 00000000 nt!KiIdleLoop+0x26 (FPO: [0,0,0])
有没有理解的人解释一下?
Re: Idle线程和DPC的关系
边超
2011-01-29, 18:06 下午
Idle 和 DPC 没有任何的关系。
Re: Idle线程和DPC的关系
王宇
2011-01-29, 18:51 下午
Thomson 同学应该和边超同学是一个部门的 哈
Re: Idle线程和DPC的关系
wrong
2011-02-16, 17:04 下午
为什么现在DPC不空,当前线程还是idle呢?
Re: Idle线程和DPC的关系
Thomson
2011-02-16, 20:28 下午
@王宇,位置也很近
DPC一般不需要run在特定进程里面,所以,DPC出现并不需要把非Idle进程调度回来. 如果DPC queue了system work item, 结束后可能就需要System process了.
Re: Idle线程和DPC的关系
wrong
2011-02-16, 20:49 下午
看下当前的栈,也就是idle线程的栈
kd> kvn
# ChildEBP RetAddr Args to Child
00 80548f98 baa2a7fa 000000e2 00000000 00000000 nt!KeBugCheckEx+0x1b (FPO: [5,0,0])
01 80548fb4 baa2a032 00899d40 01ffffc6 00000000 i8042prt!I8xProcessCrashDump+0x237 (FPO: [3,0,0])
02 80548ffc 80540add 89d6cd98 8a899c88 00010009 i8042prt!I8042KeyboardInterruptService+0x21c (FPO: [Non-Fpo])
03 80548ffc 806d0d50 89d6cd98 8a899c88 00010009 nt!KiInterruptDispatch+0x3d (FPO: [0,2] TrapFrame @ 80549020)
04 805490a4 bac3d183 00000046 8a84c028 882e97c8 hal!HalpPmTimerStallExecProc+0x60 (FPO: [1,5,0])
05 805490c4 b8cb8b50 bafde064 882e981c b8cb8ad6 usbehci!EHCI_RH_PortResetComplete+0x61 (FPO: [2,2,4])
06 805490e4 804ff550 882e97f8 4d547961 33b06716 USBPORT!USBPORT_AsyncTimerDpc+0x7a (FPO: [4,1,4])
07 80549200 804ff667 80551f80 80551d20 ffdff000 nt!KiTimerListExpire+0x122 (FPO: [0,62,0])
08 8054922c 8054111d 80552380 00000000 007af63f nt!KiTimerExpiration+0xaf (FPO: [4,6,0])
09 80549250 80541096 00000000 0000000e 00000000 nt!KiRetireDpcList+0x46 (FPO: [0,0,0])
0a 80549254 00000000 0000000e 00000000 00000000 nt!KiIdleLoop+0x26 (FPO: [0,0,0])
是不是可以这样理解,DPC可以抢先任意线程执行,也就是说无论当前线程是哪一个,DPC都需要被抢先执行,并且使用当前线程的栈?此时用kv看到的就是相应的call stack。只不过在这个例子中,当前线程碰巧是idle。