Tracking ACPI/ASL Using WinDbg
( a$ F4 z% F- {: ?7 k- H n! t* @
# t7 ?% [; c0 I4 I4 h" l! R3 F2 { n1. Preface
9 V' p( l' J8 M- L; a7 k
3 b8 N( R9 P$ f6 x- Z' L iACPI是BIOS和OS之间沟通的主要手段,所以有些系统相关的问题,都跟ACPI asl code有很大的关系,如果能够直Debug ACPI asl code那将会对解决这类问题提供很好的帮助。这篇文章的目的就是讲解如何使用WinDbg实现ACPI/ASL code源码级别的调试。
& A( \4 Q( W; J {0 e" }9 K+ C }7 ?) Z0 w% F( J
2. Configuration of Debugger & Debuggee! x& k4 X4 o/ |# j
' h: a4 _2 S u h; t& QDebug ACPI 最好是双机调试,一台主机Debugger和一台目标机器Debuggee。WinDbg支援COM,1394,USB2.0三种不同的连接方式。它们的配置方法都大同小异,我使用的1394,所以我将介绍1394的配置方式。: Y m3 K6 N% |; A. P
a)设置Debuggee为调试模式
5 `) p& {8 {$ x+ U# n启动Debuggee进入OS,点击开始菜单选择运行,然后输入msconfig然后选择BOOT.INIèAdvanced Optionsè/DEBUG剩下的具体方式如下图1所示,其中/CHANEL选择可以随便指定,但是要和Debugger端设置的要一致。# D+ s8 z& N% v: [: U* f7 X
3 j$ ^. ^# l q+ ^! `, i' N+ u5 \- P3 l& C- r
图1* T% ?3 `) l5 G4 ?6 P! d4 L8 t7 T0 h9 G
0 O i1 g7 h4 k" L' f1 r$ kb)安装设置WinDbg
! ?, B% w& X' \4 f( ]8 F/ r; V# _+ Y A' k: h
WinDbg是微软提供的免费的Debug工具(微软还是不错的J),它非常强大,可以调试各种程序包括ACPI,Driver,AP而且它甚至可以用于Windows OS Kernel Debug,据说微软自己也使用该程式辅助开发他们的OS, WinDbg在微软网站上有免费下载。如果你在别的机器上已经安装好了WinDbg,那么可以直接copy过来就能使用了。* n* \9 l6 F a1 r) f5 k
1 h8 k; y0 a. k5 g& d
c)安装Symbol File: A7 ~+ X# x/ b1 N
' q' u* f8 l5 T! y
什么是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! o! I! u& _' q
) F z$ O4 m( L/ g. k! dd)安装Checked Acpi.sys9 q/ \; j" t0 A4 d }% \; d2 b
- o8 Z" w" h+ L0 A( o
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。9 b* O T8 v( [7 O) K) w
0 N" j2 P$ j% {! I
e)Start Kernel Debug
5 P2 {) G' @- w0 A/ u打开WinDbg选择FileèKernel Debugè1394(channel 1)èOK
; l! l0 m5 B# H4 K1 a9 i4 g/ j如下图2所示:
% o; o8 I- a8 x& C' `+ V! Y
5 k9 B; {) @( s9 k6 e( l3 e
: y6 z+ V. V4 v# f5 ]- o. M5 M2 F2 K: o$ j, \5 C- Y
5 p$ o& Y7 |. P
图2
1 a; q$ ^9 x( Z1 t4 J* e m接下来的动作就是Ctrl+Break,断下Debuggee的OS,然后就会出现如下图3所示的界面,这时就可以开始下断点,跟踪
程式,查看程式的上下文,查看寄存器的值等等。想干嘛,随你的便J!
' u) {" p7 x4 C' c; A
图3; X/ J! j7 Y% z
$ D3 F) g V; ]
7 {: v$ L6 ^7 j! |5 u9 u4 n3.Let’s Begin Fighting It
2 ?/ ^/ W6 ^+ [8 q1 ?; r* p0 V2 g: {5 C3 j/ N
空谈误国,实战兴邦。罗嗦了这么多废话,现在要开始行动了。首先我们要先输入!amli debugger 启动amli调试器,第一次可能会失败,报下述错误:AMLI_DBGERR: failed to get debugger flag address。这个错误的原因可能是:6 a: g* ?: E' D/ j- ?9 T/ s' m4 Z
1.Checked Acpi.sys和Acpi.pdb文件和debuggee版本不符导致的。9 f9 V! H4 b" g# u
2.WinDbg没有load Acpi符号文件,只要.reload即可。下面我将给出几个小的sample,演示如何debug asl code。4 g0 o* K0 Y) }* J z7 E9 u3 h" B
1 V: P# p3 B1 ]4 Ma)Dump Acpi namespace device objects$ N, b* S) G9 D
( d- h7 {- Y' d5 d$ ^
输入!amli dns /s \_sb.pci0.sbrg.ec 在我的调试环境下将会出现下述内如图4所示,\_sb.pci0.sbrg.ec这是Acpi device+ @1 G! J* H* y. F
Object 路径,每个bios的实现可能不同,这里是我的debuggee下EC这个device的路径。嘿嘿…怎么样,EC的秘密一览无余了吧。9 M4 d5 @ I6 w. g2 V
9 w b" Y& k3 d5 G& Z! c
2 F$ {1 F |0 `% y! B V; i
, c, T' H1 N" h# |9 L2 M' t0 p- ^- [+ m图4
3 `( Y$ P' D! F0 A' ib)Set breakpoints in Acpi method
O5 G$ X2 |" \* d9 B
8 a' @+ l, W8 K1 i% |输入!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有如下描述:
4 }) e5 n; _- W/ L7 P* y
/ M( n1 k7 H3 J# w
3 P6 V* k; z4 g# ], `
& T7 X; C8 }$ s* X. z- d3 K7 V图5
, I4 v; v6 r: {. N也就是说一旦有device插拔动作该method就会被call,那么我们拔掉battery试试看会怎么样呢?下图6给出了答案,我们的断点被hit了。1 G. {9 T7 Q" m# d. W! s) O) s
$ B7 p. O$ ]$ g+ x9 C7 [ / Q# u$ V( z) v* b3 J# n% N
8 c U$ m3 E5 \: k/ V3 v' {2 u1 ?
图6, \/ j2 j7 o, d( P/ W' Y
被断下以后我们可以在WinDbg查看各种信息,例如使用r检查上下文信息,ln列出breakpoints最近的method,p单步查看各个参数的值等等,help yourself!J# }7 O) _, ^& I
7 b6 q" e& Q( @/ \- ]& r7 Bc)Tracking processes of S3/4/5/ H" T9 Q7 e( V/ [) t+ w
# ^+ X1 z/ e. V+ N' K8 m- {我一直不清楚当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那就如法炮制。/ v2 i, G9 E0 [
: M: j/ S5 e: a9 J
" P U, C5 V9 @$ B
; q7 R8 x( G; f
+ d: w( n: K; b图7$ M" F# j8 d0 J% ? X& g1 S& T( a
REFF:7 ^& s# H |2 v- K3 V5 S1 l* O
1 b& ~9 E9 d9 A" k5 @! R1.如何跟踪ACPI代码5 t2 f j) G( W+ U9 q
2.如何使用WinDbg跟踪调试ASL/ACPI4 `7 a8 l0 `# P
$ O+ y+ P/ ]1 w. G4 F1 [. |+ MPeter |