study NK.bin format
The information from WINCE500/PRIVATE/WINCEOS/COREOS/NK/TOOLS/ROMIMAGE/VIEWBIN
1. 初始識別字組
檔案開頭的7個位元組是固定的識別字組("B000FF/x0A", 0x42, 0x30, 0x30, 0x30, 0x46, 0x46, 0x0A)
2. 映射檔案在記億體中對應的起始位址
在這個檔案可以看到,對應到 0x801A0000,這個值是用 Config.bib 在Memory Section 裡面設定的。當makeimg時,會呼叫 Fmerge.exe 去合併所有用到的 Binary Image Builder Files (.BIB)檔案,最後產生一個 CE.BIB,之後會在呼叫Romimage.exe(Rom image Builder Tool),依照CE.BIB裡面的設定,去定址所有檔案與在安排在記憶體中的位址
3. 映射檔案長度
這個檔案長度值是 0x20D34C8
4. 資料錄(Record)
接下來是 Data Record , 在WinCE 5.0 的 ViewBin 中,可以看出定義最大不會超過 2048 個,每個Record 有 3個 DWORD的資料紀錄,依序代表資料起始位址(Start address of Record)、資料長度(Length of Record)、檢查碼(Chksum of Record),資料起始位址與檢查欄位同時為零時,則代表起始位址。基本上是一個 List 結構的資料錄
在下圖用了紅色框,框出Record的起始、長度、檢查碼,緊跟的白色框,則是該Record的實際資料內容。
用 Pseudo code 表示可以視為
struct {
DWORD StartAddr;
DWORD Length;
DWORD ChkSum;
BYTE* pDATA;
} Record;
Record LRec[2048];
LRec[0].StartAdd = 0x801A0000;
LRec[0].Length = 0x00000004;
LRec[0].ChkSum = 0x000001EB;
LRec[0].pData = { 0xFE, 0x03, 0x00, 0xEA };
LRec[1].StartAddr = 0x801A0040;
LRec[1].Length = 0x00000008;
LRec[1].ChkSum = 0x000001FB;
LRec[1].pData = { 0x45, 0x43, 0x45, 0x43, 0x40, 0x02, 0x27, 0x82 };
5. 資料內容紀錄 (Table Of Context Record)
當檔案中的資料錄全部找出來後,首先需要找出那個是 TOC 資料錄,首先從頭開始在一次找尋資料錄,首先找出資料錄長度為 8的,然後比較識別字元,這個識別字元定義在 WINCE500/PUBLIC/COMMON/OAK/INC/romldr.h (在 WinCE 5.0中,這個識別字元 ROM_SIGNATURE 內容為 0x43454345(它使用 DWORD型態,所以在PC上的檔案位址排列會變成 0x45434543,恰恰等於目前觀察檔案的 Record 1。Record 1 剩下的資料,就是 TOC的位址 0x82270240。
接下來繼續找資料錄大小為 ROMHDR大小的,這個ROMHDR 一樣定義在 romldr.h中,在WinCE 5.0中定義是 84 (0x54) ,恰好 Record 282 大小為 0x54,而起始值為 0x82270240(註: 在ViewBin 中可以看到,也許有可能會發生找錯資料錄的情況,ViewBin 中針對這種情況有雙重確認機制)。
6. 讀取 ROMHDR (ROM Header Record)
假設找到正確的 ROMHDR 後,開始分析ROMHDR的內容
ROMHDR.dllfirst -> 在Slot 0 (Current Process 空間中)的DLL的起始位址
ROMHDS.dlllast -> 在 Slot 0 的結束位址
DLL 在 Slot 0的空間位址映射,是為了當 DLL 被系統載入時,所有的 Process 可以共享DLL的程式碼與資料的一種設計,在早期算是一種折衷設計,這是為了減少 context switch與記憶體的消耗,算是一種必要之惡,也因此原本在執行時其中的程式空間的 32MB 會被扣除這塊 DLL所佔用的空間。但這幾年嵌入式系統的CPU與記憶體的能力也是大幅的提昇,許多嵌入式系統的驅動程式,與相關應用需求,讓嵌入式系統必須18般武藝樣樣俱全。為了能讓WinCE 放進更多DLL,在WinCE 4.0 ~ WinCE 5.x 中,Microsoft 提出了另一個方法 XIP DLLs,Slot 1 成為 XIP Dlls 的空間。
本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/shuiii/archive/2008/02/27/2125138.aspx