Tracking ACPI/ASL Using WinDbg

 http://blog.csdn.net/hgf1011/archive/2009/02/12/3881848.aspx

 

Tracking ACPI/ASL Using WinDbg

 

1. Preface

 

      ACPIBIOSOS之間溝通的主要手段,所以有些系統相關的問題,都跟ACPI asl code有很大的關係,如果能夠直Debug ACPI asl code那將會對解決這類問題提供很好的幫助。這篇文章的目的就是講解如何使用WinDbg實現ACPI/ASL code源碼級別的調試。  

 

2. Configuration of Debugger & Debuggee

 

     Debug ACPI 最好是雙機調試,一臺主機Debugger和一臺目標機器DebuggeeWinDbg支援COM1394USB2.0三種不同的連接方式。它們的配置方法都大同小異,我使用的1394,所以我將介紹1394的配置方式。

a)    設置Debuggee爲調試模式

啓動Debuggee進入OS,點擊開始菜單選擇運行,然後輸入msconfig然後選擇BOOT.INIèAdvanced Optionsè/DEBUG剩下的具體方式如下圖1所示,其中/CHANEL選擇可以隨便指定,但是要和Debugger端設置的要一致。

 

                                                           

 

1

b)    安裝設置WinDbg

WinDbg是微軟提供的免費的Debug工具(微軟還是不錯的J,它非常強大,可以調試各種程序包括ACPIDriverAP而且它甚至可以用於Windows OS Kernel Debug,據說微軟自己也使用 該程式輔助開發他們的OS, WinDbg在微軟網站上有免費下載。如果你在別的機器上已經安裝好了WinDbg,那麼可以直接copy過來就能使用了。

c)    安裝Symbol File

什麼是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文件可以在微軟網站上免費下載

d)    安裝Checked Acpi.sys

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      

e)    Start Kernel Debug

打開WinDbg選擇FileèKernel Debugè1394(channel 1)èOK

如下圖2所示:

 

                                                          2

接下來的動作就是Ctrl+Break,斷下DebuggeeOS,然後就會出現如下圖3所示的界面,這時就可以開始下斷點,跟蹤程式,查看程式的上下文,查看寄存器的值等等。想幹嘛,隨你的便J!

 

                                  

           3

 

3.    Let’s Begin Fighting It

 

       空談誤國,實戰興邦。羅嗦了這麼多廢話,現在要開始行動了。首先我們要先輸入!amli debugger 啓動amli調試器,第一次可能會失敗,報下述錯誤:AMLI_DBGERR: failed to get debugger flag address。這個錯誤的原因可能是:

1.     Checked Acpi.sysAcpi.pdb文件和debuggee版本不符導致的。

2.  WinDbg沒有load Acpi符號文件,只要.reload即可。

下面我將給出幾個小的sample,演示如何debug asl code

a)    Dump Acpi namespace device objects

輸入!amli dns /s /_sb.pci0.sbrg.ec 在我的調試環境下將會出現下述內如圖4所示,/_sb.pci0.sbrg.ec這是Acpi device Object 路徑,每個bios的實現可能不同,這裏是我的debuggeeEC這個device的路徑。嘿嘿怎麼樣,EC的祕密一覽無餘了吧。

                                                     4

b)    Set breakpoints in Acpi method

輸入!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

也就是說一旦有device插拔動作該method就會被call,那麼我們拔掉battery試試看會怎麼樣呢?下圖6給出了答案,我們的斷點被hit了。

 

     

 

                                                6

被斷下以後我們可以在WinDbg查看各種信息,例如使用r檢查上下文信息,ln列出breakpoints最近的methodp單步查看各個參數的值等等,help yourselfJ

 

c)    Tracking processes of S3/4/5

我一直不清楚當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那就如法炮製。

            

              7

REFF:

1.     如何跟蹤ACPI代碼

2.     如何使用WinDbg跟蹤調試ASL/ACPI?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章