Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

Windows内核调试

帖子发起人: wrong   发起时间: 2011-01-10 10:10 上午   回复: 5

Print Search
帖子排序:    
   2011-01-10, 10:10 上午
rong_bo 离线,最后访问时间: 2011/9/5 12:57:46 wrong

发帖数前10位
注册: 2011-01-07
发 贴: 66
Idle线程和DPC的关系
Reply Quote
看了张老师的博文,调试笔记:系统挂在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])


有没有理解的人解释一下?
IP 地址: 已记录   报告
   2011-01-29, 18:06 下午
raulbc 离线,最后访问时间: 2011/1/29 10:05:15 边超

无等级
注册: 2011-01-29
发 贴: 1
Re: Idle线程和DPC的关系
Reply Quote
Idle 和 DPC 没有任何的关系。
IP 地址: 已记录   报告
   2011-01-29, 18:51 下午
WANGyu 离线,最后访问时间: 2012/9/10 3:34:00 王宇

发帖数前10位
男
注册: 2007-05-08
发 贴: 306
Re: Idle线程和DPC的关系
Reply Quote
Thomson 同学应该和边超同学是一个部门的 哈
IP 地址: 已记录   报告
   2011-02-16, 17:04 下午
rong_bo 离线,最后访问时间: 2011/9/5 12:57:46 wrong

发帖数前10位
注册: 2011-01-07
发 贴: 66
Re: Idle线程和DPC的关系
Reply Quote
为什么现在DPC不空,当前线程还是idle呢?
IP 地址: 已记录   报告
   2011-02-16, 20:28 下午
Thomson 离线,最后访问时间: 2013/3/31 11:42:42 Thomson

发帖数前10位
注册: 2008-07-03
发 贴: 211
Wink [;)] Re: Idle线程和DPC的关系
Reply Quote
@王宇,位置也很近

DPC一般不需要run在特定进程里面,所以,DPC出现并不需要把非Idle进程调度回来. 如果DPC queue了system work item, 结束后可能就需要System process了.
IP 地址: 已记录   报告
   2011-02-16, 20:49 下午
rong_bo 离线,最后访问时间: 2011/9/5 12:57:46 wrong

发帖数前10位
注册: 2011-01-07
发 贴: 66
Re: Idle线程和DPC的关系
Reply Quote
看下当前的栈,也就是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。
IP 地址: 已记录   报告
高端调试 » 软件调试 » Windows内核调试 » Idle线程和DPC的关系

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.