|
Tracking ACPI/ASL Using WinDbg / x* J$ F" B8 @1 z0 M! }/ W8 X6 |
- s7 B% d( l D. O. B8 f
1. Preface
+ q. H- I/ M* V7 `' _+ @: i" y) d4 V0 ~: w; G8 r( w9 r( ?
ACPI是BIOS和OS之间沟通的主要手段,所以有些系统相关的问题,都跟ACPI asl code有很大的关系,如果能够直Debug ACPI asl code那将会对解决这类问题提供很好的帮助。这篇文章的目的就是讲解如何使用WinDbg实现ACPI/ASL code源码级别的调试。; s# r% A. L( H* `7 J( K3 c, O6 A
4 R9 Q4 `* d. c) v) \: [' b2. Configuration of Debugger & Debuggee
+ u; Y/ U! t% j$ x# M, D
) {. d! C' s* X' }& KDebug ACPI 最好是双机调试,一台主机Debugger和一台目标机器Debuggee。WinDbg支援COM,1394,USB2.0三种不同的连接方式。它们的配置方法都大同小异,我使用的1394,所以我将介绍1394的配置方式。. V+ I, ` ?: F" t3 C7 p" p
a)设置Debuggee为调试模式( O4 X* W( |; P9 R" a P A
启动Debuggee进入OS,点击开始菜单选择运行,然后输入msconfig然后选择BOOT.INIèAdvanced Optionsè/DEBUG剩下的具体方式如下图1所示,其中/CHANEL选择可以随便指定,但是要和Debugger端设置的要一致。/ c D) I; j7 d
) H' L5 U3 h0 q
: T3 R$ R$ }2 t. C4 L图1
+ l! K& Q7 l) ^0 v: W6 C
) {0 s6 X: b* _b)安装设置WinDbg
1 k2 q- M- {& u8 H* n, x+ Z* }2 u5 u' E9 z. p2 ?
WinDbg是微软提供的免费的Debug工具(微软还是不错的J),它非常强大,可以调试各种程序包括ACPI,Driver,AP而且它甚至可以用于Windows OS Kernel Debug,据说微软自己也使用该程式辅助开发他们的OS, WinDbg在微软网站上有免费下载。如果你在别的机器上已经安装好了WinDbg,那么可以直接copy过来就能使用了。
. U" Z* ~. L! f1 R- z
P% c6 m$ O) m. Yc)安装Symbol File; B9 d* o& n) b9 b; `' B3 T& t
$ \' W# N4 ~% e9 U什么是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文件可以在微软网站上免费下载。
! J+ \ N7 t% Q$ O+ I% C6 b
" b/ o: s+ P- p2 Nd)安装Checked Acpi.sys
" i6 u4 q5 y# }3 @
# t k) ^( H( O( B" s9 bBIOS中的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。, g: ^4 L1 p+ H& {' `) j8 {! y
2 Y1 H$ b' Q# D2 B3 Y2 [
e)Start Kernel Debug
0 E; G. e3 E5 B$ U7 _打开WinDbg选择FileèKernel Debugè1394(channel 1)èOK* ]' P1 G: U9 A) p4 _+ O9 Q" I
如下图2所示:0 E+ q4 R" w. _$ `; A
+ ~3 A6 f2 x# w" n2 M0 a" \" ]( l- X
* o$ r9 o: H8 J" |& d( Q+ g- v1 A; w1 f' N1 [" n* O. N7 p
- ~" F7 h9 e) @
图2
& I7 ~4 `5 i8 \$ ^1 b+ y" U接下来的动作就是Ctrl+Break,断下Debuggee的OS,然后就会出现如下图3所示的界面,这时就可以开始下断点,跟踪
程式,查看程式的上下文,查看寄存器的值等等。想干嘛,随你的便J! ) H5 u% k f3 d1 _
图3
+ u- q6 K& n+ m7 V2 x) B( p2 ^3 a9 Y
0 l: V4 g+ d1 s9 R4 Z+ l* s/ I
3.Let’s Begin Fighting It# b. E; i* \6 Y' q2 ~3 G* c2 u
# L' j! r( Y7 ] G! {' w2 Q/ Q. k
空谈误国,实战兴邦。罗嗦了这么多废话,现在要开始行动了。首先我们要先输入!amli debugger 启动amli调试器,第一次可能会失败,报下述错误:AMLI_DBGERR: failed to get debugger flag address。这个错误的原因可能是:& w# J9 E' e' o* o7 h
1.Checked Acpi.sys和Acpi.pdb文件和debuggee版本不符导致的。
: ~( M9 u7 Q0 u. r" G7 A2.WinDbg没有load Acpi符号文件,只要.reload即可。下面我将给出几个小的sample,演示如何debug asl code。
( Q/ b7 O9 A3 h5 U' k3 j& T0 x! K0 i- o. @, O0 B$ E; y; x
a)Dump Acpi namespace device objects+ ?) F0 _% M6 R# _$ B/ k
" _' z- W4 y8 R9 f% `0 N, m0 u# s输入!amli dns /s \_sb.pci0.sbrg.ec 在我的调试环境下将会出现下述内如图4所示,\_sb.pci0.sbrg.ec这是Acpi device3 E, _- Z" b* x. ^
Object 路径,每个bios的实现可能不同,这里是我的debuggee下EC这个device的路径。嘿嘿…怎么样,EC的秘密一览无余了吧。
5 A& A% Z+ L5 Q
/ t1 G9 M/ u; J! J- b6 Q* A: ?4 c5 a5 u+ J! I/ m. U7 B a3 L7 S0 [
0 F5 b- i- Y( w* f% U7 J2 p5 ^
图4- o+ s& O. j9 P) t
b)Set breakpoints in Acpi method
9 }( }$ u+ ?( f$ m* `( ^5 ~! p4 p" L2 f) u4 r5 ?7 _
输入!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有如下描述:! Q7 z# t* Z$ F
- H/ E& V# l+ Q/ Y" {- k2 [0 C: q8 h( G# z) @9 }( I2 d6 N% h( x( k# I+ L
1 @# o; ?+ S ^* H+ K
图5! p$ F! N' s+ E) w5 |9 `
也就是说一旦有device插拔动作该method就会被call,那么我们拔掉battery试试看会怎么样呢?下图6给出了答案,我们的断点被hit了。0 j* o, Z5 o$ s% x
' {# b! g3 e) I. c$ Z: [
; `9 j, o# e) O
' d6 g! l; v% R7 K% i2 O图6
- W9 h) N/ q! g: x D( L3 i+ h* e F被断下以后我们可以在WinDbg查看各种信息,例如使用r检查上下文信息,ln列出breakpoints最近的method,p单步查看各个参数的值等等,help yourself!J, j) ^ v; j6 d) L
* {# E+ U" }2 J0 Zc)Tracking processes of S3/4/5
" ?; C8 X$ F( d
* \; o2 O* t9 f: O; 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那就如法炮制。2 x! F! X' U$ |4 ~2 @& @
5 m: y; h0 {7 q N" L9 N
8 e; |1 |' W4 M7 O
! P( D3 S6 N0 \( l. D
9 ?! h" N6 y0 X2 {图7
: q/ T- t8 r1 T: y6 PREFF:
) G) R$ `# ^% t; y# h
. |& S' d" x5 F. \1 Q1.如何跟踪ACPI代码
k/ K8 g0 v6 M" h- p$ Y/ |3 v2.如何使用WinDbg跟踪调试ASL/ACPI
6 T8 R1 P1 t2 q8 C8 U9 M7 U" H7 ~, O
" b6 c$ A: _ {+ z1 o3 E0 pPeter |