日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

解析NK.BIN

發(fā)布時(shí)間:2023/12/10 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 解析NK.BIN 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最近做NBOOT,EBOOT,對(duì)TOC參數(shù)不是很明白,老大說(shuō)得先熟悉一下NK.bin。故找到以下好文,對(duì)NK.bin有了一個(gè)深入的了解。感謝作者。

study NK.bin format

The information from WINCE500\PRIVATE\WINCEOS\COREOS\NK\TOOLS\ROMIMAGE\VIEWBIN

1. 初始識(shí)別字組

檔案開(kāi)頭的7個(gè)位元組是固定的識(shí)別字組("B000FF\x0A", 0x42, 0x30, 0x30, 0x30, 0x46, 0x46, 0x0A)

2. 映射檔案在記億體中對(duì)應(yīng)的起始位址

在這個(gè)檔案可以看到,對(duì)應(yīng)到 0x801A0000,這個(gè)值是用 Config.bib 在Memory Section 裡面設(shè)定的。當(dāng)makeimg時(shí),會(huì)呼叫 Fmerge.exe 去合併所有用到的 Binary Image Builder Files (.BIB)檔案,最後產(chǎn)生一個(gè) CE.BIB,之後會(huì)在呼叫Romimage.exe(Rom image Builder Tool),依照CE.BIB裡面的設(shè)定,去定址所有檔案與在安排在記憶體中的位址

3. 映射檔案長(zhǎng)度

這個(gè)檔案長(zhǎng)度值是 0x20D34C8

4. 資料錄(Record)

??? 接下來(lái)是 Data Record , 在WinCE 5.0 的 ViewBin 中,可以看出定義最大不會(huì)超過(guò) 2048 個(gè),每個(gè)Record 有 3個(gè) DWORD的資料紀(jì)錄,依序代表資料起始位址(Start address of Record)、資料長(zhǎng)度(Length of Record)檢查碼(Chksum of Record),資料起始位址與檢查欄位同時(shí)為零時(shí),則代表起始位址。基本上是一個(gè) List 結(jié)構(gòu)的資料錄

在下圖用了紅色框,框出Record的起始、長(zhǎng)度、檢查碼,緊跟的白色框,則是該Record的實(shí)際資料內(nèi)容。

?

用 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. 資料內(nèi)容紀(jì)錄 (Table Of Context Record)

當(dāng)檔案中的資料錄全部找出來(lái)後,首先需要找出那個(gè)是 TOC 資料錄,首先從頭開(kāi)始在一次找尋資料錄,首先找出資料錄長(zhǎng)度為 8的,然後比較識(shí)別字元,這個(gè)識(shí)別字元定義在 WINCE500\PUBLIC\COMMON\OAK\INC\romldr.h (在 WinCE 5.0中,這個(gè)識(shí)別字元 ROM_SIGNATURE 內(nèi)容為 0x43454345(它使用 DWORD型態(tài),所以在PC上的檔案位址排列會(huì)變成 0x45434543,恰恰等於目前觀察檔案的 Record 1。Record 1 剩下的資料,就是 TOC的位址 0x82270240。

接下來(lái)繼續(xù)找資料錄大小為 ROMHDR大小的,這個(gè)ROMHDR 一樣定義在 romldr.h中,在WinCE 5.0中定義是 84 (0x54) ,恰好 Record 282 大小為 0x54,而起始值為 0x82270240(註: 在ViewBin 中可以看到,也許有可能會(huì)發(fā)生找錯(cuò)資料錄的情況,ViewBin? 中針對(duì)這種情況有雙重確認(rèn)機(jī)制)。

6. 讀取 ROMHDR (ROM Header Record)

假設(shè)找到正確的 ROMHDR 後,開(kāi)始分析ROMHDR的內(nèi)容

ROMHDR.dllfirst? -> 在Slot 0 (Current Process 空間中)的DLL的起始位址

ROMHDS.dlllast?? -> 在 Slot 0 的結(jié)束位址

DLL 在 Slot 0的空間位址映射,是為了當(dāng) DLL 被系統(tǒng)載入時(shí),所有的 Process 可以共享DLL的程式碼與資料的一種設(shè)計(jì),在早期算是一種折衷設(shè)計(jì),這是為了減少 context switch與記憶體的消耗,算是一種必要之惡,也因此原本在執(zhí)行時(shí)其中的程式空間的 32MB 會(huì)被扣除這塊 DLL所佔(zhàn)用的空間。但這幾年嵌入式系統(tǒng)的CPU與記憶體的能力也是大幅的提昇,許多嵌入式系統(tǒng)的驅(qū)動(dòng)程式,與相關(guān)應(yīng)用需求,讓嵌入式系統(tǒng)必須18般武藝樣樣俱全。為了能讓W(xué)inCE 放進(jìn)更多DLL,在WinCE 4.0 ~ WinCE 5.x 中,Microsoft 提出了另一個(gè)方法 XIP DLLs,Slot 1 成為 XIP Dlls 的空間。

?

總結(jié)

以上是生活随笔為你收集整理的解析NK.BIN的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。