找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 19316|回复: 0

[原创]Tracking ACPI/ASL Using WinDbg

[复制链接]
发表于 2009-5-14 16:01:19 | 显示全部楼层 |阅读模式
Tracking ACPI/ASL Using WinDbg
; Q% }( u" }% s8 V
: ]9 \  ?4 L0 U' O, X4 b/ l" g: O
1. Preface  Y5 U5 u2 J3 U1 o! {9 }

, ]% Y2 i- P6 ^: MACPI
BIOSOS之间沟通的主要手段,所以有些系统相关的问题,都跟ACPI asl code有很大的关系,如果能够直Debug ACPI asl code那将会对解决这类问题提供很好的帮助。这篇文章的目的就是讲解如何使用WinDbg实现ACPI/ASL code源码级别的调试。

: ?" ~0 r; ]; |% i. v) w1 O- N0 r2 a2 p$ p$ R) e% }
2. Configuration of Debugger & Debuggee: F# K( J5 _' y! v$ J9 r

) B9 w- {4 G  W1 y% T* K) RDebug ACPI
最好是双机调试,一台主机Debugger和一台目标机器DebuggeeWinDbg支援COM1394USB2.0三种不同的连接方式。它们的配置方法都大同小异,我使用的1394,所以我将介绍1394的配置方式。
1 `; j- x- J* D( {6 b% M6 p
a)设置Debuggee为调试模式* V5 I: r% h* O
启动Debuggee进入OS,点击开始菜单选择运行,然后输入msconfig然后选择BOOT.INIèAdvanced Optionsè/DEBUG剩下的具体方式如下图1所示,其中/CHANEL选择可以随便指定,但是要和Debugger端设置的要一致。
! k1 d. w" r" p2 ?/ v% \/ T! p1 P
, T* u( S& W5 Q7 l+ h: Y9 @

2 Z; \" M: j# P2 p7 z/ ^' L2 V1* W6 Q1 H& C* j1 G( |
: r, w0 u) r5 J, d$ U% d) @
b)安装设置WinDbg  m5 W- y3 n/ Z1 P+ G
; {" b! B: J; h3 }
WinDbg是微软提供的免费的Debug工具(微软还是不错的J,它非常强大,可以调试各种程序包括ACPIDriverAP而且它甚至可以用于Windows OS Kernel Debug,据说微软自己也使用该程式辅助开发他们的OS, WinDbg在微软网站上有免费下载。如果你在别的机器上已经安装好了WinDbg,那么可以直接copy过来就能使用了。+ F2 h8 H# L$ @; K* @, W; E6 j' D1 Y! ]
: h9 Y* r+ D& ?( B& |2 H
c)安装Symbol File
# c* t% _& t8 e  S  |, q7 R- C0 q- \) {! C$ \3 X- ~
什么是symbol文件呢?Symbol文件包含了被调试程序的变量名称,函数名,入口地址以及代码行号等信息。通常以pdb为扩展名。为了能调试debuggeedebugger端使用的Symbol文件一定要和目标机上安装的操作系统的版本要一致。Symbol文件对于WinDbg来说是至关重要的,如果找不到正确的Symbol文件,调试功能就没法使用。安装完Symbol以后Ctrl + S设置WinDbg Symbol路径例如SRV*C:\Symbols*C:\WINNT\Symbols*http://msdl.microsoft.com/download/symbols。最好把微软的Symbols 服务器也写上这样比较保险。WindowsSymbol文件可以在微软网站上免费下载
, B7 C9 o1 ~) r# `8 L& N0 i/ e# I7 c2 k/ m) q+ b
d)安装Checked Acpi.sys
+ z2 G2 \0 J! i5 z7 ?0 d
$ Y. S( i! W- z) l" w5 P- {+ rBIOS中的ASL code通过asl.exe这个程序转化为aml文件,进入OS以后,OS通过两个inboxdriver Acpi.sys Smbios.sys解释和执行aml code。而且微软还提供了一个调试工具专门用于调试aml code,它就是Microsoft AMLI Debugger。这个Debugger需要两部分配合才能工作,一部分内建于WinDbg,另一部分则需要Checked Acpi.sys。所以如果要调试ACPI asl code,就必须要安装checked Acpi.sysSymbol文件一样Checked Acpi.sys一定要和目标机安装的操作系统版本要一致。替换debuggeesystem32\drivers下的 Acpi.sys,一定要进入安全模式,如果不仅安全模式你会很惨哦J+ n' ^; L! }  q5 p. i$ j! L: D
$ j; e4 {- C' B4 G: e0 A
e)Start Kernel Debug ' M3 ?( Q% b0 a8 Z$ K
打开WinDbg选择FileèKernel Debugè1394(channel 1)èOK: L& X" l1 c& d+ Z  I5 l- H
如下图2所示:
1 y- `+ h: ]9 t( k7 k/ E2 a2 n) M. ]

3 _4 z6 k) R3 c* Q7 A
$ E) }/ R! M* `$ g1 X7 [9 M. n8 t, j( ~* I: H" i
2

* Q7 d+ F8 l" K5 L$ L- l- @+ \接下来的动作就是Ctrl+Break,断下DebuggeeOS,然后就会出现如下图3所示的界面,这时就可以开始下断点,跟踪
程式,查看程式的上下文,查看寄存器的值等等。想干嘛,随你的便J!

/ d" ~! M3 J+ A8 Y* o) b9 U
3$ ~' ?5 ?( J/ c2 [
) g" {7 e# ~" n' x$ C. P% H

) _1 R) i2 O, H0 R, o, J# K' o) i7 a* X3.Let’s Begin Fighting It
  D3 T+ Y7 d& H% I+ C: ?2 B
, k( f5 o$ ^+ l3 w1 g& Y* }) ]
空谈误国,实战兴邦。罗嗦了这么多废话,现在要开始行动了。首先我们要先输入!amli debugger 启动amli调试器,第一次可能会失败,报下述错误:AMLI_DBGERR: failed to get debugger flag address。这个错误的原因可能是:

7 B+ U: f! x* i) @4 z' |1.Checked Acpi.sysAcpi.pdb文件和debuggee版本不符导致的。
4 @6 q+ `' b0 ~  a2 q' y2.WinDbg没有load Acpi符号文件,只要.reload即可。下面我将给出几个小的sample,演示如何debug asl code
9 T: o: O. d* G  U1 r  |
% M# I* Y( q: G! pa)Dump Acpi namespace device objects
/ G, v: d* Z/ O% _' d8 C0 h# @8 l2 m  ^( X. Y+ ~
输入!amli dns /s \_sb.pci0.sbrg.ec 在我的调试环境下将会出现下述内如图4所示,\_sb.pci0.sbrg.ec这是Acpi device
8 y5 {. J' G' q$ l. j% o. ^4 aObject 路径,每个bios的实现可能不同,这里是我的debuggeeEC这个device的路径。嘿嘿怎么样,EC的秘密一览无余了吧。
$ ]- ^% Y+ e: b0 c. p
% q* K) d0 e  \& F* Q. h. O  u: }( T

! ?& h6 S9 {# v/ g6 n9 ]
4

6 d2 u% w+ [( n$ Q# Q: |# E6 S) Ub)Set breakpoints in Acpi method
2 ]/ L/ C- I5 q5 f+ X6 K' T2 ~1 u, e$ v; @4 T' U
输入!amli debugger ègo,然后一旦aml被解释WinDbg就会被断下,这时我们再输入!amli bp\_sb.pci0.sbrg.ec.bat1. _staègo这时我们就在battery _sta这个method下了个断点,一旦该methodcall,那么我们就会hit the breakpoint。那么该方法什么时候会被call呢?Acpi spec有如下描述:
: I9 Z' F6 H) R  l& B. }* B1 ]* I9 i$ O5 Q( C9 D8 j5 t
8 C: t4 Y  l; k  m; U0 m- i0 h

/ b1 G7 I8 z7 R# F7 w2 L
5
& _, j& J0 y9 V) _- t, V2 v
也就是说一旦有device插拔动作该method就会被call,那么我们拔掉battery试试看会怎么样呢?下图6给出了答案,我们的断点被hit了。5 e% m" |; ?$ D
: f" N2 ?) {8 z% E8 D8 D5 b! a$ Z# L
8 U5 [0 g+ L$ _3 k

' l5 D# ~- o: S  Q/ V
6

4 V% p4 Q& ^* _+ `" y3 @被断下以后我们可以在WinDbg查看各种信息,例如使用r检查上下文信息,ln列出breakpoints最近的methodp单步查看各个参数的值等等,help yourselfJ: K- w6 Q  Q5 O" P0 u* i
4 d% I* R# ]  t1 q, |5 n
c)Tracking processes of S3/4/55 k, X" n# @; x5 f1 n' J

+ l# e+ u3 R! r2 Y8 r( z: i我一直不清楚当osS3/4/5的时候流程是怎样?会执行哪些 asl code而且我们又时不时的会碰到与之相关的问题,烦不胜烦。怎么办呢?Let’s scratch it。输入!amli debugger ègo,下来输入 set verboseon èset traceonègo,然后我们选择让debuggee 关机进入S5WinDbg将会出现下图7类似的输出。这些就是下S5 Acpi asl code的完整process。我们发现OS先会去获得一些AC,BAT,LID等设备的信息,然后会call\_PTS(0x5) method 0x5就表示S5S5追过了,S3/S4那就如法炮制。1 o1 o) t9 ]; d3 A- ^! n4 z
: h  o6 a0 D3 L9 N
* r3 y1 _% B- d# {) @  g
3 Z/ T# j+ o- F& G, X9 o, {2 F& x

3 D. r: Z! _- b) b7
: S, H- S4 o  X* |* c, ]
REFF:7 s3 U" H0 p! [/ G9 Q" A
$ A: j  v/ d! @: o0 X9 @* B
1.如何跟踪ACPI代码
# j3 c, `2 J6 F( U8 q+ V8 L: u2 W7 N2.如何使用WinDbg跟踪调试ASL/ACPI( ~" q" `; ^/ D; z% `3 L1 i0 C: a

+ r: T; |) z0 K4 O/ _: gPeter

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入计匠网

×
您需要登录后才可以回帖 登录 | 加入计匠网

本版积分规则

Archiver|手机版|小黑屋|计匠网

GMT+8, 2026-6-4 19:02 , Processed in 2.564163 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表