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

[原创]Tracking ACPI/ASL Using WinDbg

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

/ Y. V# r9 [: ~& E1. Preface7 ]. f6 N: ?6 a4 [% @  S9 q
3 W6 d( }: i9 H8 Z+ i
ACPI
BIOSOS之间沟通的主要手段,所以有些系统相关的问题,都跟ACPI asl code有很大的关系,如果能够直Debug ACPI asl code那将会对解决这类问题提供很好的帮助。这篇文章的目的就是讲解如何使用WinDbg实现ACPI/ASL code源码级别的调试。

; H! f/ e- i5 |' E: c6 Y
) b% q! W/ W5 O  M2. Configuration of Debugger & Debuggee/ t8 b4 A+ o- q4 a4 S' n
" J' ?5 N' c9 h- b1 F
Debug ACPI
最好是双机调试,一台主机Debugger和一台目标机器DebuggeeWinDbg支援COM1394USB2.0三种不同的连接方式。它们的配置方法都大同小异,我使用的1394,所以我将介绍1394的配置方式。

3 B* d7 {& P/ o, l6 [a)设置Debuggee为调试模式" ~0 j) Z0 ]' P4 r5 V& z) e
启动Debuggee进入OS,点击开始菜单选择运行,然后输入msconfig然后选择BOOT.INIèAdvanced Optionsè/DEBUG剩下的具体方式如下图1所示,其中/CHANEL选择可以随便指定,但是要和Debugger端设置的要一致。# O. v" P9 R! \

7 ^" G9 v* h( H5 k; k

1 U: u: {6 n8 M1 f14 u1 U; b, J" C3 ^  z2 u

- y; D7 \) B/ R# \2 {1 @b)安装设置WinDbg; _1 i6 k$ X1 o0 @6 `+ P8 y* X

. }* L) s3 l! r# j! [$ ~( AWinDbg是微软提供的免费的Debug工具(微软还是不错的J,它非常强大,可以调试各种程序包括ACPIDriverAP而且它甚至可以用于Windows OS Kernel Debug,据说微软自己也使用该程式辅助开发他们的OS, WinDbg在微软网站上有免费下载。如果你在别的机器上已经安装好了WinDbg,那么可以直接copy过来就能使用了。- J  I' x9 q8 U" m3 C! }1 X

& `4 t! x3 @3 J0 i$ o5 \c)安装Symbol File
) _% q3 v! y' S8 {! _1 d
$ o/ Y( {5 }4 B: D" S, d; e什么是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文件可以在微软网站上免费下载
5 E8 a( m2 _$ G. P9 M7 A# z2 I1 G. n" p! j4 @5 M
d)安装Checked Acpi.sys
' i  W: l2 ?, K, _3 U0 R: X5 H' d" i3 F4 n
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,一定要进入安全模式,如果不仅安全模式你会很惨哦J
+ B  O# X0 y+ e; L: o

$ ?: @, _% j/ p, J' y8 Je)Start Kernel Debug
$ F' j% ^8 Z8 G0 D& R7 B打开WinDbg选择FileèKernel Debugè1394(channel 1)èOK6 @/ D8 b, R5 g: d
如下图2所示:
7 K) _) {0 ?5 H8 t9 {' E* {8 j
+ \3 e7 ~/ Q2 L, ]  x, E7 F

8 v: C8 L$ \  v
: J1 _3 o3 S. @8 t  b/ ~$ q# A1 w% B1 y% j
2

- ~/ n& E: X4 b- j: p接下来的动作就是Ctrl+Break,断下DebuggeeOS,然后就会出现如下图3所示的界面,这时就可以开始下断点,跟踪
程式,查看程式的上下文,查看寄存器的值等等。想干嘛,随你的便J!

& J; j, I5 K5 g8 e
3+ u- r; Q1 H* g4 }+ q) z1 O
3 ~- K: p6 X/ T6 I! u
) ^2 ]! o+ K2 M% S1 w. D3 d; E
3.Let’s Begin Fighting It3 S+ b. L6 S$ C5 ?1 R! ^2 b% v
5 C$ B! Z% [& p1 H# ~2 L
空谈误国,实战兴邦。罗嗦了这么多废话,现在要开始行动了。首先我们要先输入!amli debugger 启动amli调试器,第一次可能会失败,报下述错误:AMLI_DBGERR: failed to get debugger flag address。这个错误的原因可能是:

$ V. B' U8 L! H2 `  A1.Checked Acpi.sysAcpi.pdb文件和debuggee版本不符导致的。
4 M' Y! }0 a6 q8 B4 i1 G! l5 G$ s5 C9 u6 y2.WinDbg没有load Acpi符号文件,只要.reload即可。下面我将给出几个小的sample,演示如何debug asl code) H5 g# {- y  Y, y
1 }, e, }( Z: `" `
a)Dump Acpi namespace device objects
5 C) K9 S! B% ?4 {, c  B8 n8 B2 n/ ]9 k9 }! Y2 ~: ]6 H4 j7 c" _
输入!amli dns /s \_sb.pci0.sbrg.ec 在我的调试环境下将会出现下述内如图4所示,\_sb.pci0.sbrg.ec这是Acpi device% z& ^+ S9 \0 u' o& w, N
Object 路径,每个bios的实现可能不同,这里是我的debuggeeEC这个device的路径。嘿嘿怎么样,EC的秘密一览无余了吧。" v5 _7 y# v! R1 E0 z

& K! l" E* F, A) b0 m* ?8 Z/ ^9 f) E! ?

3 |$ U4 R1 F4 p. S3 d
4
# N5 n' i4 l' p" b$ Q  V
b)Set breakpoints in Acpi method
' k& ~" ~+ q6 [$ _8 [; D  ^, I) h7 T
输入!amli debugger ègo,然后一旦aml被解释WinDbg就会被断下,这时我们再输入!amli bp\_sb.pci0.sbrg.ec.bat1. _staègo这时我们就在battery _sta这个method下了个断点,一旦该methodcall,那么我们就会hit the breakpoint。那么该方法什么时候会被call呢?Acpi spec有如下描述:' v  F6 _4 z: ~$ B9 p
" B9 h8 o! N- P  \. |3 V& u
$ V0 d6 E1 `8 f6 \6 d- Y
/ i0 w5 R4 h, T1 p- e
5
; z9 T) T+ J2 \2 z1 c) c
也就是说一旦有device插拔动作该method就会被call,那么我们拔掉battery试试看会怎么样呢?下图6给出了答案,我们的断点被hit了。
. a# O& U8 `  r: L

3 |2 p/ V$ |: R' {6 d' \% H

# X. q/ B0 x& S7 ?: H+ _
% X! K0 G3 f( U3 r4 B* m- _
6

' y4 N. a( w$ Z7 u5 a- g# @被断下以后我们可以在WinDbg查看各种信息,例如使用r检查上下文信息,ln列出breakpoints最近的methodp单步查看各个参数的值等等,help yourselfJ3 {5 @- t1 Y0 M3 `

9 [0 J' `; B, ^c)Tracking processes of S3/4/53 o2 T4 l# p; D

% [9 s  y  W" a/ x* O/ M. x0 z我一直不清楚当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那就如法炮制。
3 @- m+ t4 @3 M# A6 y% {/ V" k) H! ~4 O
. Q  @* n4 b7 y, Q1 }
9 y8 g4 U" g, a
4 n5 T$ i3 b% N
7

4 R# r) r2 V- ~3 BREFF:
5 e0 u# L. O) Y  A- H

4 p) M4 h7 T  d" z1.如何跟踪ACPI代码% G5 g/ |: A9 E/ Z# q4 p
2.如何使用WinDbg跟踪调试ASL/ACPI+ I0 a4 Z: ~" l/ s6 V7 r

. \7 F) s( K4 ZPeter

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2025-4-2 11:19 , Processed in 0.076202 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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