|
Tracking ACPI/ASL Using WinDbg
3 Y% M0 N: m5 E4 N $ P+ H% Y$ u& U
1. Preface5 b5 P7 q5 g* U( T; b6 p
* c3 d& r/ _0 [3 v. l3 x6 _ACPI是BIOS和OS之间沟通的主要手段,所以有些系统相关的问题,都跟ACPI asl code有很大的关系,如果能够直Debug ACPI asl code那将会对解决这类问题提供很好的帮助。这篇文章的目的就是讲解如何使用WinDbg实现ACPI/ASL code源码级别的调试。9 y2 `; M! N% H! g. k& h% t
. ?4 }* g2 q; a, @9 U+ X
2. Configuration of Debugger & Debuggee0 C8 ]; z) m7 X, E7 j
, D6 x7 y# M0 b8 q2 X, M; K7 ^( PDebug ACPI 最好是双机调试,一台主机Debugger和一台目标机器Debuggee。WinDbg支援COM,1394,USB2.0三种不同的连接方式。它们的配置方法都大同小异,我使用的1394,所以我将介绍1394的配置方式。. S0 d( l# G: L# l& e: Z
a)设置Debuggee为调试模式2 q* q( M' y/ K; Y2 ~ g' e
启动Debuggee进入OS,点击开始菜单选择运行,然后输入msconfig然后选择BOOT.INIèAdvanced Optionsè/DEBUG剩下的具体方式如下图1所示,其中/CHANEL选择可以随便指定,但是要和Debugger端设置的要一致。
* W- Y0 ?* ?5 l5 y2 N
9 E; t+ `' T6 [9 [) f1 J0 k, I2 f/ d) t( V: b- P4 _! A
图1
# _+ @" o: U2 d/ W
8 Y U5 W% R# Y) G/ }b)安装设置WinDbg
/ L; \* T, W' Q" D: X4 `8 o
& r4 Y E1 m) J$ q1 M% M8 I7 \WinDbg是微软提供的免费的Debug工具(微软还是不错的J),它非常强大,可以调试各种程序包括ACPI,Driver,AP而且它甚至可以用于Windows OS Kernel Debug,据说微软自己也使用该程式辅助开发他们的OS, WinDbg在微软网站上有免费下载。如果你在别的机器上已经安装好了WinDbg,那么可以直接copy过来就能使用了。3 \) j$ ]7 d- L) q
, `! y$ v' G0 u0 ~2 E& K8 lc)安装Symbol File: Q" t; v' z; O7 v" n$ l& `
( S; I# Z, ]' j9 N, \
什么是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文件可以在微软网站上免费下载。1 z; W: L: F* m5 D% m
4 B, _ `" v$ v. a: D/ pd)安装Checked Acpi.sys
0 M: {* ], m n6 K6 G/ S3 F& J! a3 L. N& Y
BIOS中的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。" q& ~7 b6 I: s9 q! g9 k( g
) [( X8 D& R0 E6 P' P8 c
e)Start Kernel Debug 8 j- I/ B0 B1 h- U* B
打开WinDbg选择FileèKernel Debugè1394(channel 1)èOK
+ r, u7 D* D- `, F如下图2所示:. d( P F2 b. U9 [
: E- U" K/ w0 j4 c! Z: i6 {9 g7 E
) S$ R, {% Y( O& q, X3 _
3 P: b g7 S6 H, o3 x. Z% z/ L# O$ C
图2
" D5 r) r. ^" s6 K* o3 {) Q3 D+ ~接下来的动作就是Ctrl+Break,断下Debuggee的OS,然后就会出现如下图3所示的界面,这时就可以开始下断点,跟踪
程式,查看程式的上下文,查看寄存器的值等等。想干嘛,随你的便J!
; t; \& `+ U& G$ e. l: ?9 O
图3$ r7 q! z# G5 ^3 @
/ r, e9 t1 i% Z/ T
2 S" i: ]) {% V3.Let’s Begin Fighting It" I5 j1 K" p7 P H0 M9 Z
9 ]# z* g0 w1 _5 Z
空谈误国,实战兴邦。罗嗦了这么多废话,现在要开始行动了。首先我们要先输入!amli debugger 启动amli调试器,第一次可能会失败,报下述错误:AMLI_DBGERR: failed to get debugger flag address。这个错误的原因可能是:" w) Z. R/ V( e+ i$ Z/ A
1.Checked Acpi.sys和Acpi.pdb文件和debuggee版本不符导致的。
4 |) k6 h) D( A9 M7 d& u$ r9 @2.WinDbg没有load Acpi符号文件,只要.reload即可。下面我将给出几个小的sample,演示如何debug asl code。
9 {0 N. [3 T. u6 i: ]7 e* v+ \4 ^
1 q( K1 A- ~; ~- T( e3 Na)Dump Acpi namespace device objects
2 M" z+ R3 M. r1 w( W: k+ u
0 e- s8 K' k( L输入!amli dns /s \_sb.pci0.sbrg.ec 在我的调试环境下将会出现下述内如图4所示,\_sb.pci0.sbrg.ec这是Acpi device
$ N% Y0 h. \' Q3 A$ `% A$ c5 |Object 路径,每个bios的实现可能不同,这里是我的debuggee下EC这个device的路径。嘿嘿…怎么样,EC的秘密一览无余了吧。% m, U }6 Q% u7 P* G
* F# o2 y* c2 Q2 X' _
* @* \1 | S. f+ B' [( C8 K" W& d! i6 h7 C8 y1 _0 `! ~) |
图4
9 `# q0 W# q! j6 D xb)Set breakpoints in Acpi method
0 n* p# E/ y+ Y0 Y* _. U; b; L* R! k$ ]
输入!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有如下描述:9 R; T9 g3 t2 I: W! _, ~( Z+ C
. @7 M9 B# x& E# r( ]- G% s R" U
0 h" h9 K" F6 g0 H9 Q/ W4 {3 D图5
6 g4 c/ `1 X+ N0 A9 |也就是说一旦有device插拔动作该method就会被call,那么我们拔掉battery试试看会怎么样呢?下图6给出了答案,我们的断点被hit了。 j$ V. q, @1 D; F# q& c
6 A- G( c e/ Z( w2 p5 s1 H* G
; r$ r$ T! T- ]8 K
" Y4 ?" V) ^7 b# o1 T+ _
图6
6 s6 t8 M( W l5 O! i* | r# [被断下以后我们可以在WinDbg查看各种信息,例如使用r检查上下文信息,ln列出breakpoints最近的method,p单步查看各个参数的值等等,help yourself!J
' ^- K8 t- @ B7 _9 w, M# {: W4 z* c5 `; e& A# l7 c+ ?
c)Tracking processes of S3/4/5
, {! j, U' L8 M. M# a; w# p# H6 e1 X' k+ N1 q3 Q
我一直不清楚当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那就如法炮制。
( `9 \! n% I6 g- w+ g; ~" U9 Q, `3 ]/ {! S @* P0 m0 G( d
% q3 j: M" Y. e# }4 U" k8 e
6 E$ h& A/ {& }( Y
6 g f1 P4 R Q2 [0 j
图76 J- }" ~. Q3 L7 j# K6 ]* v
REFF:
- |3 i" l9 w9 ~3 \6 P! d# x1 z& {% h5 `/ l6 Y$ V# ~# O
1.如何跟踪ACPI代码- v5 D/ C" N+ d( ^
2.如何使用WinDbg跟踪调试ASL/ACPI6 K3 K w$ M. R$ l, N# U
* G9 ?4 J" S# G# q
Peter |