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

[原创]Tracking ACPI/ASL Using WinDbg

[复制链接]
发表于 2009-5-14 16:01:19 | 显示全部楼层 |阅读模式
Tracking ACPI/ASL Using WinDbg
7 N( u+ L' `- N9 a7 _! b
( l3 Q9 g$ H2 K
1. Preface
2 ?- H6 ]7 f/ `
) b$ T! ^  c, c3 D: M' t8 q9 dACPI
BIOSOS之间沟通的主要手段,所以有些系统相关的问题,都跟ACPI asl code有很大的关系,如果能够直Debug ACPI asl code那将会对解决这类问题提供很好的帮助。这篇文章的目的就是讲解如何使用WinDbg实现ACPI/ASL code源码级别的调试。
. m1 t+ G3 i0 T' _* G4 s3 {" F" O1 W

2 K% ]7 t' C, \# h9 n" {, j  A2. Configuration of Debugger & Debuggee: D4 S3 q4 j( c: {/ ^
1 H! x( r" e5 T: J% x6 o# I
Debug ACPI
最好是双机调试,一台主机Debugger和一台目标机器DebuggeeWinDbg支援COM1394USB2.0三种不同的连接方式。它们的配置方法都大同小异,我使用的1394,所以我将介绍1394的配置方式。

) i6 {7 G( M2 q0 Z* t/ Ua)设置Debuggee为调试模式
2 D; F( `& h6 Q2 e; K7 r8 l启动Debuggee进入OS,点击开始菜单选择运行,然后输入msconfig然后选择BOOT.INIèAdvanced Optionsè/DEBUG剩下的具体方式如下图1所示,其中/CHANEL选择可以随便指定,但是要和Debugger端设置的要一致。
4 O. `1 w% ~2 O8 c# ]/ J( E" x  I5 N" g# }0 f& _4 S  z& g* v$ v7 X

+ U$ M+ `" j( ]$ j1 t, V$ h/ N  i, u1
; W2 c/ T! ~% U, ]# G2 W  O
$ R+ h6 l  b5 y  ]% [; E$ _" vb)安装设置WinDbg
4 R% z- K4 U5 y/ z. z; Q- l5 y) K  y2 d2 W' U! q3 F! r
WinDbg是微软提供的免费的Debug工具(微软还是不错的J,它非常强大,可以调试各种程序包括ACPIDriverAP而且它甚至可以用于Windows OS Kernel Debug,据说微软自己也使用该程式辅助开发他们的OS, WinDbg在微软网站上有免费下载。如果你在别的机器上已经安装好了WinDbg,那么可以直接copy过来就能使用了。" \; |  B! }0 X) n" f0 i& _
+ ?$ _7 Y1 A0 N2 E' U5 C' I
c)安装Symbol File( n" M- Z% ~0 R- ], G6 j
  x& z' b/ k$ n) B6 T
什么是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文件可以在微软网站上免费下载; g! z. W1 H5 u

* d1 w8 k8 z1 G3 E) N% kd)安装Checked Acpi.sys
$ m& T$ s0 U' s! t. s
, T0 X. V% {( g0 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
) P  n0 C, t$ E2 E* L

$ g* Q+ s, g; F/ h! r  Ze)Start Kernel Debug 0 J; n0 ~: k5 m# F$ |
打开WinDbg选择FileèKernel Debugè1394(channel 1)èOK
1 ^5 |' Z) _8 Q5 b$ C如下图2所示:' C" N' ?# e! z' F1 [1 w' L

. c! ^8 }+ q9 F* A- v

2 @+ G9 J) T' u: j0 d8 F; S" A# v2 ~% Z/ m
" o0 q9 ~7 e5 M2 X
2
2 `: S0 z/ o- p
接下来的动作就是Ctrl+Break,断下DebuggeeOS,然后就会出现如下图3所示的界面,这时就可以开始下断点,跟踪
程式,查看程式的上下文,查看寄存器的值等等。想干嘛,随你的便J!

/ R; J- u/ q  k7 ~, q5 x
3
, e9 v; ^$ o! T5 W
$ j/ `. p% j# ]/ G! A# o% h3 {
3 `9 h6 ^- {* r' W1 Z3.Let’s Begin Fighting It1 ?! Y/ p5 h* J. t, w. I
) G% M# V! c! n7 n; q
空谈误国,实战兴邦。罗嗦了这么多废话,现在要开始行动了。首先我们要先输入!amli debugger 启动amli调试器,第一次可能会失败,报下述错误:AMLI_DBGERR: failed to get debugger flag address。这个错误的原因可能是:
( I$ L3 Q/ S7 \" [8 a
1.Checked Acpi.sysAcpi.pdb文件和debuggee版本不符导致的。0 i3 K1 r2 d0 |' p- f4 f1 U2 X5 V) w
2.WinDbg没有load Acpi符号文件,只要.reload即可。下面我将给出几个小的sample,演示如何debug asl code
9 x: s1 |8 c0 @' b: {
9 }+ H" P: g; Q( S4 j& {/ ia)Dump Acpi namespace device objects
9 I- D! y5 k7 l
9 F; _  Y, E0 I! ]: T/ a输入!amli dns /s \_sb.pci0.sbrg.ec 在我的调试环境下将会出现下述内如图4所示,\_sb.pci0.sbrg.ec这是Acpi device
3 x+ p3 G8 ?. m$ gObject 路径,每个bios的实现可能不同,这里是我的debuggeeEC这个device的路径。嘿嘿怎么样,EC的秘密一览无余了吧。  Z6 z4 c8 u5 B# {
  T9 N1 q6 y5 u- n  b& W

  O% h. M' h2 [+ E

0 f! i/ ?' l* |: S7 m; X
4
) z8 V0 Z+ |) o8 f- Q, \
b)Set breakpoints in Acpi method
7 e: U, ?- Y* P  [2 F# S* n$ _3 f1 x) Y7 U8 S% z
输入!amli debugger ègo,然后一旦aml被解释WinDbg就会被断下,这时我们再输入!amli bp\_sb.pci0.sbrg.ec.bat1. _staègo这时我们就在battery _sta这个method下了个断点,一旦该methodcall,那么我们就会hit the breakpoint。那么该方法什么时候会被call呢?Acpi spec有如下描述:
# }* `1 {5 E7 ]/ w1 I0 {+ O2 ?
- F! w8 I; s" `% R5 X; y6 N* |3 D1 R$ G  t  Q' U: @6 A: v5 v" [
, }3 k4 _! U) g2 i4 A7 w: B
5
9 @- G8 J" p6 }2 ~0 c, ~
也就是说一旦有device插拔动作该method就会被call,那么我们拔掉battery试试看会怎么样呢?下图6给出了答案,我们的断点被hit了。
0 U3 m. c& \8 {/ [1 N

3 m7 b7 X- b% C7 \% L

0 b! m( X1 N, d5 F4 ?, x) Z- C8 g, y- i5 a& ], V- f
6
8 _4 [! z- O/ t+ ?
被断下以后我们可以在WinDbg查看各种信息,例如使用r检查上下文信息,ln列出breakpoints最近的methodp单步查看各个参数的值等等,help yourselfJ
9 Q4 [! `% X- i( P: R- B
" C! P- R6 U* K4 b2 }; Yc)Tracking processes of S3/4/5  Z1 w% m8 R9 O9 Y# D, @" o

7 I- L2 @7 K7 Q, f; }" I. o- g% H我一直不清楚当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那就如法炮制。
, S9 i, A2 D* y. D! {$ v
. ~* M6 d$ L5 W/ d) G
, ^- c6 o1 V& H& L# M4 i
' ?) C, u  h0 q3 ^- l: \
: y0 v3 j+ P  ~( f* t  p
7

2 N; J) i& B8 l( f0 w) S/ wREFF:( N$ @; h* ?4 N3 X
6 W8 `' p# q$ N& ]
1.如何跟踪ACPI代码# y! u2 ^+ k& M3 l" }  ]- c
2.如何使用WinDbg跟踪调试ASL/ACPI
: J, U: I% N0 k5 U  i7 T " Y! Q5 F$ ^9 ?2 f! D! p
Peter

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2025-6-13 07:28 , Processed in 0.053726 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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