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

[原创]Tracking ACPI/ASL Using WinDbg

[复制链接]
发表于 2009-5-14 16:01:19 | 显示全部楼层 |阅读模式
Tracking ACPI/ASL Using WinDbg

( D* `7 P: ?) \5 U6 m* G

. ~5 J# }. L9 H1 x* k/ m( z& g* H1. Preface. T( @/ l  z# }( X1 t7 K

0 w# e( f9 [9 ~; o" HACPI
BIOSOS之间沟通的主要手段,所以有些系统相关的问题,都跟ACPI asl code有很大的关系,如果能够直Debug ACPI asl code那将会对解决这类问题提供很好的帮助。这篇文章的目的就是讲解如何使用WinDbg实现ACPI/ASL code源码级别的调试。

  l5 {$ e' P8 c, G' h/ B3 w$ b# Z, u, ~! B
2. Configuration of Debugger & Debuggee
+ c# N5 f6 V7 [2 r: P' Z
/ _9 Z  {9 I" d! v3 O  k& x
Debug ACPI
最好是双机调试,一台主机Debugger和一台目标机器DebuggeeWinDbg支援COM1394USB2.0三种不同的连接方式。它们的配置方法都大同小异,我使用的1394,所以我将介绍1394的配置方式。
9 m8 p. q2 T2 E7 g& Q1 z0 j
a)设置Debuggee为调试模式
) o/ ^9 s. u; c2 h8 [启动Debuggee进入OS,点击开始菜单选择运行,然后输入msconfig然后选择BOOT.INIèAdvanced Optionsè/DEBUG剩下的具体方式如下图1所示,其中/CHANEL选择可以随便指定,但是要和Debugger端设置的要一致。' J" _- U5 z3 g  h" d. c9 R3 v
8 h  _( s! M* ]* }; O8 P
8 a+ _/ @/ o! v3 j* b+ @% {
1
& i+ J$ n- Z6 m. Y
! T+ k' s& D. Z" C& [6 Sb)安装设置WinDbg: \) X' I2 f1 u3 Q2 h: Y
, k3 s9 Q! N' ]- m4 k: z0 j
WinDbg是微软提供的免费的Debug工具(微软还是不错的J,它非常强大,可以调试各种程序包括ACPIDriverAP而且它甚至可以用于Windows OS Kernel Debug,据说微软自己也使用该程式辅助开发他们的OS, WinDbg在微软网站上有免费下载。如果你在别的机器上已经安装好了WinDbg,那么可以直接copy过来就能使用了。
$ ?9 Z* c( O) ]- e/ P% r: c

3 U5 I: p: X7 n$ H4 C: R6 oc)安装Symbol File
2 J* T0 M4 X& [1 `# i6 j/ f- z' c, |
什么是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文件可以在微软网站上免费下载! i* ^9 d7 k* Y

6 @5 d& \1 [6 z, g$ cd)安装Checked Acpi.sys: I- L' S9 d( f) J5 r: B- A
6 D0 M* T/ v5 Z+ J) y5 X
BIOS中的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,一定要进入安全模式,如果不仅安全模式你会很惨哦J4 Z; K# h& F; f; ]8 F1 p

8 E* Z3 P" ~# x7 R: _. u) c( qe)Start Kernel Debug
/ x) W' u# i: h/ O! A- C! i9 n+ \& J打开WinDbg选择FileèKernel Debugè1394(channel 1)èOK- [- l4 V8 g# k0 p* O) X/ Y! O
如下图2所示:
1 C  M; e" Y( M" u
8 a5 f9 }' A2 G) p% j
+ k/ o: q, N" S5 e0 n: t. }5 T

5 K" k5 _& c- a" _/ B  n
2 N, X- h0 X6 q5 N0 r- |4 X* ?
2
+ A' [$ a$ |" `  t! H
接下来的动作就是Ctrl+Break,断下DebuggeeOS,然后就会出现如下图3所示的界面,这时就可以开始下断点,跟踪
程式,查看程式的上下文,查看寄存器的值等等。想干嘛,随你的便J!
5 |/ J. d8 H  ~
3
1 n- K3 j" `/ a& Y; U6 ]9 `" h4 D
* A6 N' M( ?2 d+ Q, v2 {3 r6 S
3.Let’s Begin Fighting It
- k, Y; \2 a% a: u) V) _) f
( J# u$ @6 \7 V# }' T& h  y9 p
空谈误国,实战兴邦。罗嗦了这么多废话,现在要开始行动了。首先我们要先输入!amli debugger 启动amli调试器,第一次可能会失败,报下述错误:AMLI_DBGERR: failed to get debugger flag address。这个错误的原因可能是:

3 I6 ?0 |8 I# q2 E6 ]1.Checked Acpi.sysAcpi.pdb文件和debuggee版本不符导致的。8 B. E* w) C0 v" `$ X0 r. K
2.WinDbg没有load Acpi符号文件,只要.reload即可。下面我将给出几个小的sample,演示如何debug asl code
. W% [; Q6 |3 N0 ^5 m8 y: m0 p% Q! N
4 b0 e0 B) ~" b  X& p- G/ Na)Dump Acpi namespace device objects
1 `+ J! @  ^' b0 @' R
7 `) P/ F; `9 k8 t2 W2 B输入!amli dns /s \_sb.pci0.sbrg.ec 在我的调试环境下将会出现下述内如图4所示,\_sb.pci0.sbrg.ec这是Acpi device
& V1 H) l$ Z& o6 ]Object 路径,每个bios的实现可能不同,这里是我的debuggeeEC这个device的路径。嘿嘿怎么样,EC的秘密一览无余了吧。, q9 S, |& x5 K0 D4 k; Q
- n; e. X+ d1 c8 v; I
+ ^$ ?$ ~3 E% S' d  n/ G* N

, p& G8 N& Z7 }& Z. J
4

9 Y, l% Z8 D) ]* bb)Set breakpoints in Acpi method
$ |( v4 z! X- l' \: S5 s5 t  f& Y9 a) J
输入!amli debugger ègo,然后一旦aml被解释WinDbg就会被断下,这时我们再输入!amli bp\_sb.pci0.sbrg.ec.bat1. _staègo这时我们就在battery _sta这个method下了个断点,一旦该methodcall,那么我们就会hit the breakpoint。那么该方法什么时候会被call呢?Acpi spec有如下描述:
" d6 k* G1 U8 W2 Q0 J: B; h3 \
2 s/ I8 [) W  x7 o- `
! h8 x. K) X6 X! P; E
* M$ G& _4 c1 n$ L! h0 F3 w& U
5

  O' x# p; W- D也就是说一旦有device插拔动作该method就会被call,那么我们拔掉battery试试看会怎么样呢?下图6给出了答案,我们的断点被hit了。% {9 \- a! N6 j% j, @# ~
6 {+ a9 q- u: Y, z# e+ S/ W0 o8 V

" F3 P4 G$ P3 h- n! p
  b2 X  w$ Q) [$ T) _
6

; X% o% A0 Q  O被断下以后我们可以在WinDbg查看各种信息,例如使用r检查上下文信息,ln列出breakpoints最近的methodp单步查看各个参数的值等等,help yourselfJ
) S! P" C+ c+ U. t% X0 R2 Z% \) f( V
4 s2 n3 n5 Q# p4 Qc)Tracking processes of S3/4/52 F; e4 ~* \, f4 j

/ T* X& `- j  K6 O# m  d我一直不清楚当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那就如法炮制。/ o: r+ O- [* V9 _
" h5 z, _% k) t& n
9 ~; l3 p" ]9 U/ n& d* o2 S
: p7 i* g2 @  u) T, }! T' n
* c, x. N" X( |- [/ ]
7
. O8 k3 s- `. B5 T, |. l
REFF:# ~6 r: M9 k, C

  ]/ J" ]( O. [7 O5 W1.如何跟踪ACPI代码
2 s* r, ?$ u& h1 B7 Q3 D2.如何使用WinDbg跟踪调试ASL/ACPI' g( I# C  s, Z3 R& T4 o
( L- [0 f/ v( k% B, k7 i& h! w- C" J
Peter

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-5-20 14:07 , Processed in 0.021500 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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