小華的部落格: 2007/10/28 - 2007/11/4

搜尋此網誌

網頁

星期四, 11月 01, 2007

可以反組譯的 Debug 工具簡介~~~

ㄧ般Debug BIOS程式碼的時候會透過幾個反組譯工具或是Debug Tools來輔助,這邊大概就簡略說明一下我比較習慣的工具(可以反組譯程式碼及修改的工具):

1. BIOS Vendor 提供的Debug Tools
ㄧ般OEM/ODM BIOS工程師比較主要的Debug Tools,他的連線介面方式像目前最火紅的 USB2.0 cable 連線方式或是以前的1394 cable...etc.ㄧ般這種工具需要搭配BIOS Vendor的BIOS 程式碼來達成,也就是你會去使用某個"switch"來開關BIOS Code, 簡單的說就是當Switch = ON時,BIOS 的Build Tools在Compiler 你的BIOS Code時,會把Debug Tools需要用到的BIOS 程式碼拉進來一起Compiler,於是會影響到你的BIOS ROM Size的問題,因此ㄧ般我們會把ㄧ些不必要的程式碼先註解掉,以免當Debug code拉進來一起Compiler的時候造成BIOS Size爆掉(不夠用),至於"Switch"的設定則依照不同BIOS廠商就會有不同的開關方式,而建立的BIOS ROM 就是一個 Debug version,接著需要將這個BIOS燒入到主機板內,然後透過BIOS Vendor提供的Debug 軟體來做除錯的動作。

而這種架構下的Debug 方式稱為 Client(要被除錯的那塊主機板或系統) 與 Server(安裝了Debug 軟體的系統,一般就是你的工作機) 的關係,其原理簡單說就是 Client 會透過連線(USB/1394) 把ㄧ些資訊傳給Server上面的Debug 軟體,接著你就可以去做一些除錯的動作。

各家BIOS廠商的除錯工具都不同,但是方式大同小異,因此工具的學習只是基本的知識,重點還是在你對於整個系統架構的了解程度才能夠有效的針對問題解決。

2. Windows 附帶的Debug.com 以及Debug32.com
ㄧ般用來查看一些BIOS code留在系統記憶體的ㄧ些資訊(E0000~FFFFFh),這些資訊就像是DMI/PnP BIOS Struct / PCI IRQ Routing Table ...etc 或是查看一些OpROM 甚至是手動載入某個OpROM 到記憶體中並追蹤他或是修改ROM的時候可以用,其應用就看個人經驗而有不同的發揮,不過一般修改ROM還會搭配HEX Editor 直接修改機器碼就可了。

3. IDA Pro + Softice + Win32DASM + OllyDbg
這幾個工具都是針對Windows的一些問題去追蹤或是反組譯某些bin file或是破解程式時在使用,其應用範圍也是看個人經驗而有所不同,這邊只是簡單說明我個人習慣的一些工具。

4. Other
除了上面說的這些工具之外當然還會透過一些應用程式來幫忙,像是RU.EXE/SE.EXE/ACPIView.exe...etc,因為這些工具不能反組譯程式碼,所以我就不多加討論。

在這篇文章中,最主要是能將 BIOS 工作性質做一些基本說明,對於有心進入這個行業的朋友們了解,一個BIOS工程師基本上會做哪些事情以及你需要了解哪些工具,而上述的工具都是我個人習慣使用的工具,當然其他人也可能會跟我不一樣,因此希望能藉由這篇文章讓有興趣的朋友能有個方向。

星期三, 10月 31, 2007

SlickEdit® 2007's Tags






對於SlickEdit® 2007 如何建立一個專案檔我這邊就不說明了,這邊只強調如何建立Tags (標籤)。在ㄧ般我建立一個Workspace後,我會在裡面建立專案(Project)接著選取你的資料匣;而這個資料匣就是你的Source code的目錄,例如P 廠商Assembly的Corebase目錄或是I 廠商UEFI的Codebase目錄。

建立的時候因為你的目錄內可能會有很多種不同的檔案類型(*.asm ; *.c ;*.inc ...) 所以你在Add Tree的時候必須把你的檔案類型都加進去,不然預設值只會找C++的檔案格式的檔案,所以建立Tags的時候會找不到你要的檔案內的定義。如同上圖中所示,你把你要的通通都加進去。

在點選【OK】後,你會看到下圖所示的畫面,他會開始去建立Tags ....














對於建立好的專案檔中,你看到的畫面ㄧ般都是分類成Source file / Header files...等(下圖左邊),如果你想要用目錄型態顯示,就使用下面我說的方式,在專案瀏覽的地方按滑鼠右鍵,會跳出ㄧ個選單(下圖右邊),然後選擇Directory View 來顯示就可以了:







最後,你開啟你要編輯的檔案,把滑鼠移動到關鍵字中,接著按滑鼠右鍵,在跳出來的選單中選擇Go to definition 或是Go to Reference ,這樣子就可以做到很便捷的Trace Code 的方式。

不過,我忘記預設的SlickEdit中到底有沒有這兩個選項,因為如同我之前文章說的,這個工具功能強大不過要自己手動增加功能,因此我在下面的圖中有說明如何去設定他,在下圖中你可以選擇Edit Menu,然後你會看到ㄧ個設定畫面; 接著設定一些你要的功能,至於哪些指令可以做哪些功能就請你自己參考他的Help 文件檔的說明,因為我也是從那邊看,然後去設定這些功能的。

附帶一提,這個工具還可以自己擴充 "巨集Macro",我記得這個工具的目錄內有一個資料匣,裡面放了很多巨集,你可以修改它來擴充你的編輯器功能,像是點Tab 兩下就關閉你開啟的檔案...etc,利用Google應該也可以找到ㄧ些範例。


星期日, 10月 28, 2007

ACPI Table 基本知識

ACPI Table基本知識(BIOS觀點):

1.包在BIOS ROM中 的 ASL Code 就是ACPI Table,而ACPI Table有分成不同類型的Table(RSDT/FADT/DSDT...etc.)。

2.像是我們比較常使用的DSDT Table就是放了一些event code,簡單說就是當某個H/W event 發生後,系統OS會去依照描述在這個DSDT Table中的ASL Code去執行,而這些Acpi Table包在BIOS ROM中的形式是AML Code (類似機器碼)。

3.BIOS在開機過程中會把包在BIOS ROM中的Acpi Table 載入到RAM 中,然後留下一些資訊給OS來找到他們,最簡單的例子就是RSDP Table會放在1M以下的某個位址(一般都是在E0000h~FFFFFh),然後OS就可以透過搜尋"Signature"(某個標記字)的方式來找到其他的Acpi Table entry point。

[勘誤] 應該是RSDP Structure 不是 RSDP Table ,打錯了 >.< ,感謝糾正! 這個Struct內的RSD PTR欄位會指向RSDT Table ,而如何找這個Struct的方式就是在1M以下的地方找"RSD PTR",有興趣的自己用Debug.com 找看看吧 ^^。 4. OS 需要有一個 AML 翻譯器去翻譯這些AML Code,然後執行他們。 5. 每個Platform 的Host Controller 的暫存器位址會不同,所以BIOS需要透過ACPI Table來告知OS這些暫存器的位址,這樣子做的好處是OS不需要知道你是在什麼Platform,因為他只單純看BIOS所提供的H/W 資訊。 6. ACPI Table還可以用來當作OS 啟動金鑰,例如SLIC Table就是一個例子,OS透過檢查包在BIOS ROM中的ACPI Table的內容來決定是不是一個台OEM 電腦。 其他詳細介紹請參閱ACPI Spec 3.0b 以及微軟網站介紹,下圖為參考微軟文件說明:

SCI v.s SMI 基本概念

這邊大概描述一下這兩種東西的不同處(BIOS 觀點):

SMM is entered via the SMI (system management interrupt).
SMI - System Managment interrupt
SCI - System Control interrupt

由上面字義的解釋可以得知幾件事情:
1. SMI pin 觸發後會使CPU 進入SMM Mode,而BIOS會把某些程式碼放在SMM 所在位置(SMRAM)
所以簡單說就是SMI pin 觸發後,CPU會去執行BIOS中的某個程式碼,至於是哪段程式碼,就要看BIOS註冊了哪個Functon。

SMI pin--> CPU SMM Mode --> BIOS routine

2. SCI pin 觸發後是系統OS 接手後面的事情。 所以SCI觸發後,CPU會去執行某個放在中斷描述表中的程式(IDT),一般都是指向某個驅動程式(ACPI.sys )。
所以簡單說就是當SCI pin 觸發後,ACPI driver會通知相關的驅動程式(ACPI EC Driver),然後跟EC BIOS取得一個代碼,而這個代碼就是ASL Code中的Qxx Number ,接著OS 會去執行某一段ASL Code ,一般都是Method(Qxx)。至於Method(Qxx) 內要做什麼事情就要看一些BIOS Features Spec的定義。

SCI pin --> OS Acpi Driver --> ASL Code (Q event) --> ? (看BIOS Spec需求)

結論:
IA32架構中,EC Chipset會連接 2 pins(SCI/SMI)到I/O Control Host ,接著當EC 去拉這兩根pin的電位的時候(Low/High active) 南橋會告知CPU 處理後續動作(進入SMM Mode執行某段BIOS Code或是執行OS內的ACPI Driver),接著後續的動作就如同你們在BIOS 程式碼中看到的部份。

至於詳細設定資料請參考ACPI Spec、ICH Spec與IA32 Spec SMM Mode章節所描述,這部份是屬於經驗累積,江湖一點訣點破就不值錢 ^^b。

另外,為何要用SCI/SMI 則是在IA32 系統發展史中有說明,如果有興趣的人可以從APM/ACPI 歷史開始看。