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

[原创]Tracking ACPI/ASL Using WinDbg

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

2 }. s2 l  b2 O1. Preface9 l* |/ z$ @4 w5 y

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

# K& t( P  ?3 q& U' r& A7 y8 ^! j* p
$ w0 s- T/ l( }9 O" e2. Configuration of Debugger & Debuggee5 \# h9 H) p8 l2 `2 u4 K

, j2 W7 Q# r$ V  j" ~1 p/ HDebug ACPI
最好是双机调试,一台主机Debugger和一台目标机器DebuggeeWinDbg支援COM1394USB2.0三种不同的连接方式。它们的配置方法都大同小异,我使用的1394,所以我将介绍1394的配置方式。

1 l) e4 W  Q  k: M- Y# Ba)设置Debuggee为调试模式
! _+ E$ Y! c* h+ W! k  f+ w- L启动Debuggee进入OS,点击开始菜单选择运行,然后输入msconfig然后选择BOOT.INIèAdvanced Optionsè/DEBUG剩下的具体方式如下图1所示,其中/CHANEL选择可以随便指定,但是要和Debugger端设置的要一致。
! M7 _3 c3 W/ S# u" w" y: F: |8 o% K" |4 v' M% L7 y4 V) O

0 U, b5 F3 L& }1* M. b! u# a1 @( E* g2 P
: j% z( r% T) \8 q
b)安装设置WinDbg) a" A: x, M# w; a

/ z, R2 T' {3 PWinDbg是微软提供的免费的Debug工具(微软还是不错的J,它非常强大,可以调试各种程序包括ACPIDriverAP而且它甚至可以用于Windows OS Kernel Debug,据说微软自己也使用该程式辅助开发他们的OS, WinDbg在微软网站上有免费下载。如果你在别的机器上已经安装好了WinDbg,那么可以直接copy过来就能使用了。, }" p' i* _5 p5 f4 B3 e$ _

  L2 Z. H! Q3 k4 I, Qc)安装Symbol File, I4 N/ q) P, U, f8 M5 m6 U

& |8 d: U' w9 f, [什么是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文件可以在微软网站上免费下载9 h% [+ W+ q. k4 a9 k5 j( V

% E; d1 f. @5 ?+ E% ~d)安装Checked Acpi.sys  U4 J1 O8 R' Q! H

5 i( E' y8 O! ^* L  p7 N, Q# hBIOS中的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
2 ?" c% E- q) b7 e1 U, X, @
$ U9 s6 K% h% M% X
e)Start Kernel Debug
/ c& w/ R, o, I8 A) D8 v9 _. H打开WinDbg选择FileèKernel Debugè1394(channel 1)èOK
& O0 W1 g0 h4 Y( [* v& ^如下图2所示:6 n9 T, v4 L0 l; O

  t2 h: W. g5 J" z; B7 z. c
$ l, [& r8 A4 z

( t4 ~+ E8 t% n0 n- E  Q6 Y: G  N2 X7 v3 D9 ^
2
) E8 B. G3 |- \' T! o
接下来的动作就是Ctrl+Break,断下DebuggeeOS,然后就会出现如下图3所示的界面,这时就可以开始下断点,跟踪
程式,查看程式的上下文,查看寄存器的值等等。想干嘛,随你的便J!

9 X# e4 m9 o$ b
3: E9 N8 x5 B8 M: x8 i7 x
2 Q5 _3 F" W% F7 n* |2 o, K

3 c1 m0 Y9 x7 f2 p8 M, T' L# ]3.Let’s Begin Fighting It& y6 [* m/ {7 o; O- v+ C( P

% x/ a# v" h- i: A$ g. h( t
空谈误国,实战兴邦。罗嗦了这么多废话,现在要开始行动了。首先我们要先输入!amli debugger 启动amli调试器,第一次可能会失败,报下述错误:AMLI_DBGERR: failed to get debugger flag address。这个错误的原因可能是:
( v* f: T7 k$ |
1.Checked Acpi.sysAcpi.pdb文件和debuggee版本不符导致的。7 m& c# o3 ?: E% Q
2.WinDbg没有load Acpi符号文件,只要.reload即可。下面我将给出几个小的sample,演示如何debug asl code4 R* v. Y( ]! o7 Z. h
! R# o+ \4 z1 U- L0 u( M
a)Dump Acpi namespace device objects
" e: D5 `7 H2 |1 H  F: _4 j9 u; q* ^, T. {! j( Q
输入!amli dns /s \_sb.pci0.sbrg.ec 在我的调试环境下将会出现下述内如图4所示,\_sb.pci0.sbrg.ec这是Acpi device
  o4 W+ D) h1 U  u. i4 wObject 路径,每个bios的实现可能不同,这里是我的debuggeeEC这个device的路径。嘿嘿怎么样,EC的秘密一览无余了吧。/ n) E" V4 L9 g& \

: n$ _' y* Y$ K) z6 s3 d7 \; x  o: }% D& h5 U8 y

9 |9 D# I. A+ M
4

2 }9 X3 O$ R) v' c9 u+ y' kb)Set breakpoints in Acpi method
2 ^" P; g5 V/ K% e) `6 ^: ?( K% ^; `" s0 J& q& Q
输入!amli debugger ègo,然后一旦aml被解释WinDbg就会被断下,这时我们再输入!amli bp\_sb.pci0.sbrg.ec.bat1. _staègo这时我们就在battery _sta这个method下了个断点,一旦该methodcall,那么我们就会hit the breakpoint。那么该方法什么时候会被call呢?Acpi spec有如下描述:( ~5 c& f  T2 a, N, m

$ Q! j+ b$ V& v1 Y* h; e, Z# y5 z- N9 t& r  q5 B( w

0 l/ \; v6 P6 J$ p
5

* ~) a! Y. r% O# d' f( T" A6 k也就是说一旦有device插拔动作该method就会被call,那么我们拔掉battery试试看会怎么样呢?下图6给出了答案,我们的断点被hit了。
  }8 W# ~9 W3 g6 \& g) r4 z, c
2 _. @9 b. m4 i3 g

  m+ H- K+ S6 B( O6 j7 }' |! Z& D  O6 B; K# u$ f$ C
6

! M  ?. e7 r! r9 _- G+ }9 n9 G被断下以后我们可以在WinDbg查看各种信息,例如使用r检查上下文信息,ln列出breakpoints最近的methodp单步查看各个参数的值等等,help yourselfJ" H3 k! s, y( d4 p9 t0 f) ~7 D

! g% `( h/ M' \/ u+ c8 b: g9 Hc)Tracking processes of S3/4/5
! m- q5 \5 F& I6 ~, ~" T" {& z
+ E+ g3 L/ z( u- I- H5 d. P7 }我一直不清楚当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那就如法炮制。. h* {. c4 y' r% F

% F$ ^: O( `# J3 N; ]' ^
8 s& D. B6 ]5 Q! {- M- V' w

. m1 U% Q& R+ W- d/ |2 l7 [4 n& D& H; C) z& d5 m( f1 w' L7 W: T0 o& }
7
4 [+ W* n9 p2 x) R
REFF:* P- j* D6 _+ @; J
9 b  n3 G* v+ \
1.如何跟踪ACPI代码
. [- ^0 m: `1 t# ~: g2.如何使用WinDbg跟踪调试ASL/ACPI
4 X- w  s5 x+ v! A 6 E/ U7 ]7 v- G! b2 n
Peter

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2025-6-17 14:04 , Processed in 0.063373 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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