Tracking ACPI/ASL Using WinDbg 7 N( u+ L' `- N9 a7 _! b
( l3 Q9 g$ H2 K
1. Preface
2 ?- H6 ]7 f/ `
) b$ T! ^ c, c3 D: M' t8 q9 dACPI是BIOS和OS之间沟通的主要手段,所以有些系统相关的问题,都跟ACPI asl code有很大的关系,如果能够直Debug ACPI asl code那将会对解决这类问题提供很好的帮助。这篇文章的目的就是讲解如何使用WinDbg实现ACPI/ASL code源码级别的调试。. m1 t+ G3 i0 T' _* G4 s3 {" F" O1 W
2 K% ]7 t' C, \# h9 n" {, j A2. Configuration of Debugger & Debuggee: D4 S3 q4 j( c: {/ ^
1 H! x( r" e5 T: J% x6 o# I
Debug ACPI 最好是双机调试,一台主机Debugger和一台目标机器Debuggee。WinDbg支援COM,1394,USB2.0三种不同的连接方式。它们的配置方法都大同小异,我使用的1394,所以我将介绍1394的配置方式。
) i6 {7 G( M2 q0 Z* t/ Ua)设置Debuggee为调试模式
2 D; F( `& h6 Q2 e; K7 r8 l启动Debuggee进入OS,点击开始菜单选择运行,然后输入msconfig然后选择BOOT.INIèAdvanced Optionsè/DEBUG剩下的具体方式如下图1所示,其中/CHANEL选择可以随便指定,但是要和Debugger端设置的要一致。
4 O. `1 w% ~2 O8 c# ]/ J( E" x I5 N" g# }0 f& _4 S z& g* v$ v7 X
+ U$ M+ `" j( ]$ j1 t, V$ h/ N i, u图1
; W2 c/ T! ~% U, ]# G2 W O
$ R+ h6 l b5 y ]% [; E$ _" vb)安装设置WinDbg
4 R% z- K4 U5 y/ z. z; Q- l5 y) K y2 d2 W' U! q3 F! r
WinDbg是微软提供的免费的Debug工具(微软还是不错的J),它非常强大,可以调试各种程序包括ACPI,Driver,AP而且它甚至可以用于Windows OS Kernel Debug,据说微软自己也使用该程式辅助开发他们的OS, WinDbg在微软网站上有免费下载。如果你在别的机器上已经安装好了WinDbg,那么可以直接copy过来就能使用了。" \; | B! }0 X) n" f0 i& _
+ ?$ _7 Y1 A0 N2 E' U5 C' I
c)安装Symbol File( n" M- Z% ~0 R- ], G6 j
x& z' b/ k$ n) B6 T
什么是symbol文件呢?Symbol文件包含了被调试程序的变量名称,函数名,入口地址以及代码行号等信息。通常以pdb为扩展名。为了能调试debuggee,debugger端使用的Symbol文件一定要和目标机上安装的操作系统的版本要一致。Symbol文件对于WinDbg来说是至关重要的,如果找不到正确的Symbol文件,调试功能就没法使用。安装完Symbol以后Ctrl + S设置WinDbg Symbol路径例如SRV*C:\Symbols*C:\WINNT\Symbols*http://msdl.microsoft.com/download/symbols。最好把微软的Symbols 服务器也写上这样比较保险。Windows的Symbol文件可以在微软网站上免费下载。; g! z. W1 H5 u
* d1 w8 k8 z1 G3 E) N% kd)安装Checked Acpi.sys
$ m& T$ s0 U' s! t. s
, T0 X. V% {( g0 RBIOS中的ASL code通过asl.exe这个程序转化为aml文件,进入OS以后,OS通过两个inbox的driver Acpi.sys Smbios.sys解释和执行aml code。而且微软还提供了一个调试工具专门用于调试aml code,它就是Microsoft AMLI Debugger。这个Debugger需要两部分配合才能工作,一部分内建于WinDbg,另一部分则需要Checked Acpi.sys。所以如果要调试ACPI asl code,就必须要安装checked Acpi.sys和Symbol文件一样Checked Acpi.sys一定要和目标机安装的操作系统版本要一致。替换debuggee的system32\drivers下的 Acpi.sys,一定要进入安全模式,如果不仅安全模式你会很惨哦J。
) P n0 C, t$ E2 E* L
$ g* Q+ s, g; F/ h! r Ze)Start Kernel Debug 0 J; n0 ~: k5 m# F$ |
打开WinDbg选择FileèKernel Debugè1394(channel 1)èOK
1 ^5 |' Z) _8 Q5 b$ C如下图2所示:' C" N' ?# e! z' F1 [1 w' L
. c! ^8 }+ q9 F* A- v
2 @+ G9 J) T' u: j0 d8 F; S" A# v2 ~% Z/ m
" o0 q9 ~7 e5 M2 X
图22 `: S0 z/ o- p
接下来的动作就是Ctrl+Break,断下Debuggee的OS,然后就会出现如下图3所示的界面,这时就可以开始下断点,跟踪
程式,查看程式的上下文,查看寄存器的值等等。想干嘛,随你的便J!
/ R; J- u/ q k7 ~, q5 x
图3
, e9 v; ^$ o! T5 W
$ j/ `. p% j# ]/ G! A# o% h3 {
3 `9 h6 ^- {* r' W1 Z3.Let’s Begin Fighting It1 ?! Y/ p5 h* J. t, w. I
) G% M# V! c! n7 n; q
空谈误国,实战兴邦。罗嗦了这么多废话,现在要开始行动了。首先我们要先输入!amli debugger 启动amli调试器,第一次可能会失败,报下述错误:AMLI_DBGERR: failed to get debugger flag address。这个错误的原因可能是:( I$ L3 Q/ S7 \" [8 a
1.Checked Acpi.sys和Acpi.pdb文件和debuggee版本不符导致的。0 i3 K1 r2 d0 |' p- f4 f1 U2 X5 V) w
2.WinDbg没有load Acpi符号文件,只要.reload即可。下面我将给出几个小的sample,演示如何debug asl code。
9 x: s1 |8 c0 @' b: {
9 }+ H" P: g; Q( S4 j& {/ ia)Dump Acpi namespace device objects
9 I- D! y5 k7 l
9 F; _ Y, E0 I! ]: T/ a输入!amli dns /s \_sb.pci0.sbrg.ec 在我的调试环境下将会出现下述内如图4所示,\_sb.pci0.sbrg.ec这是Acpi device
3 x+ p3 G8 ?. m$ gObject 路径,每个bios的实现可能不同,这里是我的debuggee下EC这个device的路径。嘿嘿…怎么样,EC的秘密一览无余了吧。 Z6 z4 c8 u5 B# {
T9 N1 q6 y5 u- n b& W
O% h. M' h2 [+ E
0 f! i/ ?' l* |: S7 m; X图4) z8 V0 Z+ |) o8 f- Q, \
b)Set breakpoints in Acpi method
7 e: U, ?- Y* P [2 F# S* n$ _3 f1 x) Y7 U8 S% z
输入!amli debugger ègo,然后一旦aml被解释WinDbg就会被断下,这时我们再输入!amli bp\_sb.pci0.sbrg.ec.bat1. _staègo这时我们就在battery _sta这个method下了个断点,一旦该method被call,那么我们就会hit the breakpoint。那么该方法什么时候会被call呢?Acpi spec有如下描述:
# }* `1 {5 E7 ]/ w1 I0 {+ O2 ?
- F! w8 I; s" `% R5 X; y6 N* |3 D1 R$ G t Q' U: @6 A: v5 v" [
, }3 k4 _! U) g2 i4 A7 w: B
图59 @- G8 J" p6 }2 ~0 c, ~
也就是说一旦有device插拔动作该method就会被call,那么我们拔掉battery试试看会怎么样呢?下图6给出了答案,我们的断点被hit了。
0 U3 m. c& \8 {/ [1 N
3 m7 b7 X- b% C7 \% L
0 b! m( X1 N, d5 F4 ?, x) Z- C8 g, y- i5 a& ], V- f
图68 _4 [! z- O/ t+ ?
被断下以后我们可以在WinDbg查看各种信息,例如使用r检查上下文信息,ln列出breakpoints最近的method,p单步查看各个参数的值等等,help yourself!J
9 Q4 [! `% X- i( P: R- B
" C! P- R6 U* K4 b2 }; Yc)Tracking processes of S3/4/5 Z1 w% m8 R9 O9 Y# D, @" o
7 I- L2 @7 K7 Q, f; }" I. o- g% H我一直不清楚当os下S3/4/5的时候流程是怎样?会执行哪些 asl code而且我们又时不时的会碰到与之相关的问题,烦不胜烦。怎么办呢?Let’s scratch it。输入!amli debugger ègo,下来输入 set verboseon èset traceonègo,然后我们选择让debuggee 关机进入S5,WinDbg将会出现下图7类似的输出。这些就是下S5 Acpi asl code的完整process。我们发现OS先会去获得一些AC,BAT,LID等设备的信息,然后会call\_PTS(0x5) method 0x5就表示S5。S5追过了,S3/S4那就如法炮制。
, S9 i, A2 D* y. D! {$ v
. ~* M6 d$ L5 W/ d) G, ^- c6 o1 V& H& L# M4 i
' ?) C, u h0 q3 ^- l: \
: y0 v3 j+ P ~( f* t p
图7
2 N; J) i& B8 l( f0 w) S/ wREFF:( N$ @; h* ?4 N3 X
6 W8 `' p# q$ N& ]
1.如何跟踪ACPI代码# y! u2 ^+ k& M3 l" } ]- c
2.如何使用WinDbg跟踪调试ASL/ACPI
: J, U: I% N0 k5 U i7 T " Y! Q5 F$ ^9 ?2 f! D! p
Peter |