Tracking ACPI/ASL Using WinDbg ( e, ]' ^! S2 a
2 }. s2 l b2 O1. Preface9 l* |/ z$ @4 w5 y
: ~# }" L; C8 s3 b% |" LACPI是BIOS和OS之间沟通的主要手段,所以有些系统相关的问题,都跟ACPI asl code有很大的关系,如果能够直Debug ACPI asl code那将会对解决这类问题提供很好的帮助。这篇文章的目的就是讲解如何使用WinDbg实现ACPI/ASL code源码级别的调试。
# K& t( P ?3 q& U' r& A7 y8 ^! j* p
$ w0 s- T/ l( }9 O" e2. Configuration of Debugger & Debuggee5 \# h9 H) p8 l2 `2 u4 K
, j2 W7 Q# r$ V j" ~1 p/ HDebug ACPI 最好是双机调试,一台主机Debugger和一台目标机器Debuggee。WinDbg支援COM,1394,USB2.0三种不同的连接方式。它们的配置方法都大同小异,我使用的1394,所以我将介绍1394的配置方式。
1 l) e4 W Q k: M- Y# Ba)设置Debuggee为调试模式
! _+ E$ Y! c* h+ W! k f+ w- L启动Debuggee进入OS,点击开始菜单选择运行,然后输入msconfig然后选择BOOT.INIèAdvanced Optionsè/DEBUG剩下的具体方式如下图1所示,其中/CHANEL选择可以随便指定,但是要和Debugger端设置的要一致。
! M7 _3 c3 W/ S# u" w" y: F: |8 o% K" |4 v' M% L7 y4 V) O
0 U, b5 F3 L& }图1* M. b! u# a1 @( E* g2 P
: j% z( r% T) \8 q
b)安装设置WinDbg) a" A: x, M# w; a
/ z, R2 T' {3 PWinDbg是微软提供的免费的Debug工具(微软还是不错的J),它非常强大,可以调试各种程序包括ACPI,Driver,AP而且它甚至可以用于Windows OS Kernel Debug,据说微软自己也使用该程式辅助开发他们的OS, WinDbg在微软网站上有免费下载。如果你在别的机器上已经安装好了WinDbg,那么可以直接copy过来就能使用了。, }" p' i* _5 p5 f4 B3 e$ _
L2 Z. H! Q3 k4 I, Qc)安装Symbol File, I4 N/ q) P, U, f8 M5 m6 U
& |8 d: U' w9 f, [什么是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文件可以在微软网站上免费下载。9 h% [+ W+ q. k4 a9 k5 j( V
% E; d1 f. @5 ?+ E% ~d)安装Checked Acpi.sys U4 J1 O8 R' Q! H
5 i( E' y8 O! ^* L p7 N, Q# hBIOS中的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。
2 ?" c% E- q) b7 e1 U, X, @$ U9 s6 K% h% M% X
e)Start Kernel Debug
/ c& w/ R, o, I8 A) D8 v9 _. H打开WinDbg选择FileèKernel Debugè1394(channel 1)èOK
& O0 W1 g0 h4 Y( [* v& ^如下图2所示:6 n9 T, v4 L0 l; O
t2 h: W. g5 J" z; B7 z. c$ l, [& r8 A4 z
( t4 ~+ E8 t% n0 n- E Q6 Y: G N2 X7 v3 D9 ^
图2) E8 B. G3 |- \' T! o
接下来的动作就是Ctrl+Break,断下Debuggee的OS,然后就会出现如下图3所示的界面,这时就可以开始下断点,跟踪 程式,查看程式的上下文,查看寄存器的值等等。想干嘛,随你的便J!
9 X# e4 m9 o$ b
图3: E9 N8 x5 B8 M: x8 i7 x
2 Q5 _3 F" W% F7 n* |2 o, K
3 c1 m0 Y9 x7 f2 p8 M, T' L# ]3.Let’s Begin Fighting It& y6 [* m/ {7 o; O- v+ C( P
% x/ a# v" h- i: A$ g. h( t空谈误国,实战兴邦。罗嗦了这么多废话,现在要开始行动了。首先我们要先输入!amli debugger 启动amli调试器,第一次可能会失败,报下述错误:AMLI_DBGERR: failed to get debugger flag address。这个错误的原因可能是:( v* f: T7 k$ |
1.Checked Acpi.sys和Acpi.pdb文件和debuggee版本不符导致的。7 m& c# o3 ?: E% Q
2.WinDbg没有load Acpi符号文件,只要.reload即可。下面我将给出几个小的sample,演示如何debug asl code。4 R* v. Y( ]! o7 Z. h
! R# o+ \4 z1 U- L0 u( M
a)Dump Acpi namespace device objects
" e: D5 `7 H2 |1 H F: _4 j9 u; q* ^, T. {! j( Q
输入!amli dns /s \_sb.pci0.sbrg.ec 在我的调试环境下将会出现下述内如图4所示,\_sb.pci0.sbrg.ec这是Acpi device
o4 W+ D) h1 U u. i4 wObject 路径,每个bios的实现可能不同,这里是我的debuggee下EC这个device的路径。嘿嘿…怎么样,EC的秘密一览无余了吧。/ n) E" V4 L9 g& \
: n$ _' y* Y$ K) z6 s3 d7 \; x o: }% D& h5 U8 y
9 |9 D# I. A+ M图4
2 }9 X3 O$ R) v' c9 u+ y' kb)Set breakpoints in Acpi method
2 ^" P; g5 V/ K% e) `6 ^: ?( K% ^; `" s0 J& q& Q
输入!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有如下描述:( ~5 c& f T2 a, N, m
$ Q! j+ b$ V& v1 Y* h; e, Z# y5 z- N9 t& r q5 B( w
0 l/ \; v6 P6 J$ p图5
* ~) a! Y. r% O# d' f( T" A6 k也就是说一旦有device插拔动作该method就会被call,那么我们拔掉battery试试看会怎么样呢?下图6给出了答案,我们的断点被hit了。
}8 W# ~9 W3 g6 \& g) r4 z, c2 _. @9 b. m4 i3 g
m+ H- K+ S6 B( O6 j7 }' |! Z& D O6 B; K# u$ f$ C
图6
! M ?. e7 r! r9 _- G+ }9 n9 G被断下以后我们可以在WinDbg查看各种信息,例如使用r检查上下文信息,ln列出breakpoints最近的method,p单步查看各个参数的值等等,help yourself!J" H3 k! s, y( d4 p9 t0 f) ~7 D
! g% `( h/ M' \/ u+ c8 b: g9 Hc)Tracking processes of S3/4/5
! m- q5 \5 F& I6 ~, ~" T" {& z
+ E+ g3 L/ z( u- I- H5 d. P7 }我一直不清楚当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那就如法炮制。. h* {. c4 y' r% F
% F$ ^: O( `# J3 N; ]' ^8 s& D. B6 ]5 Q! {- M- V' w
. m1 U% Q& R+ W- d/ |2 l7 [4 n& D& H; C) z& d5 m( f1 w' L7 W: T0 o& }
图74 [+ W* n9 p2 x) R
REFF:* P- j* D6 _+ @; J
9 b n3 G* v+ \
1.如何跟踪ACPI代码
. [- ^0 m: `1 t# ~: g2.如何使用WinDbg跟踪调试ASL/ACPI
4 X- w s5 x+ v! A 6 E/ U7 ]7 v- G! b2 n
Peter |