小華的部落格: Debug.com 查看記憶體資料的方式

搜尋此網誌

網頁

星期一, 11月 12, 2007

Debug.com 查看記憶體資料的方式

ㄧ般我們都知道Debug.com 可以寫一些組合語言程式、除錯以及查看一些資料,但是要如何用呢?

這邊就簡單描述幾個基本的Debug 用法,用來查看一些BIOS留在記憶體中的一些資訊。

ㄧ開始我先介紹一下指令的用法以及我們要搜尋的內容是哪些:
1) 在執行Debug.com 後會出現"-" 的提示訊息,意思是說"換你了"
所以我們可以在提示訊息後面開始鍵入我們要的指令來達到一些目的
例如:
指令 S :搜尋記憶體內的內容,語法是 S <起始位址> <範圍> <搜尋的內容>
-S E000:0 ffff '1234' <--搜尋E0000h~Effffh 內的記憶體,找'1234' 指令D : 傾印記憶體內容,語法 D <起始位址> <結束位址,可略>
-D E000:0 <--查看E0000h內的記憶體內容 -D E000:0 100 <--查看E0000h~E0100h的記憶體內容 2)而這篇文章的範例中我們要找的是DMI Table 跟ACPI Table 的Entrypoint a.在搜尋DMI Table時我們要先找到SMBIOS的關鍵字 '_SM_' 所在位置,然後在經由這個位址找到實際DMI Table擺放的位址。 b.在搜尋ACPI Table的Entrypoint時,只要在E0000h~FFFFFh中搜尋關鍵字就可以找到了。 上面所提到的關鍵字都是標準的SMBIOS/ACPI Spec中所提到的,所以BIOS會依照這些Spec去建立一些資訊,並把他們擺放在1MB以下的記憶體中,也因此我們可以利用這些關鍵字去找到BIOS到底在這些Structure中填入了什麼樣的資料。 以下就是實際範例: 1.首先先點選"開始"-->"執行" 並且鍵入"cmd" 後按下"確定"按鍵:


2.依照下圖鍵入相關指令你就可以查看DMI Table Info:

上圖可以看出在記憶體F000:6D20 的地方有關鍵字'_SM_',然後使用D 指令去看這個記憶體的內容,再依照Spec中提到的偏移位址找到DMI Table擺放位址

接著ㄧ樣使用D指令去看DMI Table的內容,其中00 代表Type 0,18代表Type 0的長度...etc,其他就對照著Spec看就可以了。


3.依照下圖鍵入相關指令你就可以查看ACPI Table 的 EntryPoint:
上圖可以看到搜尋E0000h~Effffh找不到關鍵字'RSD PTR',所以接著搜尋F0000h~FFFFFh。

在找到關鍵字的位址後,ㄧ樣使用D指令去查看記憶體內的內容,在畫面右邊你可以看到"RSD PTR",他對應的記憶體內容就是 52 53 44 20 50 54 52,其他的部份你就可以查看ACPI Spec然後看其他欄位到底代表什麼意思。

[結論]

這篇文章最主要目的是簡介Debug.com 如何去查看BIOS所留下來的內容,有助於了解BIOS撰寫時你寫了什麼樣的程式碼,留下了什麼資料在哪一塊記憶體中。

※上面所提到的記憶體位址會依照不同BIOS而有所不同,所以你在你的電腦內看到的記憶體位址也會與本文中的範例不同。

4 則留言:

匿名 提到...

版主你好:
請問你,我該如何使用debug32 下access 超過1MB的定址空間嗎,例如0xDFF80000,麻煩妳了,謝謝。

匿名 提到...

前輩 您好:
我是bios的初學者想請教您~我利用EFI_SMBIOS_PROTOCOL去Updatestring 我的smbios的Type1 內的system version,那如何驗證說我是否有利用這段code去變更我ROM裡面的數據,還是其實我只有變更Memory內的數據,以至於我能夠讀到我所更改過後的value?

匿名 提到...

請問Win7之後的系統要如何使用呢?

匿名 提到...

win 7還win8後似乎內建已經沒有debug 了
可以透過dos環境下去執行