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)

 

image 

 

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

 

image 

 

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的實際資料內容。

 

image 

 

用 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  中針對這種情況有雙重確認機制)。

 

image 

 

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 的空間。

 

image 


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/shuiii/archive/2008/02/27/2125138.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值