最近做NBOOT,EBOOT,对TOC参数不是很明白,老大说得先熟悉一下NK.bin。故找到以下好文,对NK.bin有了一个深入的了解。感谢作者。
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 的空間。