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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

WINCE6.0 chain.bin和xipkernel.bin解析

發(fā)布時間:2025/4/16 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WINCE6.0 chain.bin和xipkernel.bin解析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

********************************LoongEmbedded********************************

作者:LoongEmbedded(kandi)

時間:2012.03.08

類別:WINCE系統(tǒng)開發(fā)

********************************LoongEmbedded********************************

?

1. Multiple XIP模式的文件說明

Multiple XIP模式下生成的文件有chain.bin、chain.lst、NK.bin、xip.bin和xipkernel.bin,如下圖所示:

圖1

1.1?? chain.lst和chain.bin文件

⑴chain.lst文件

chain.lst文件定義了要把哪些bin文件下載到flash上,以及這些bin文件的下載順序,我們用UltraEdit打開chain.lst文件,內(nèi)容如下:

+XIPKERNEL.bin

NK.bin

chain.bin

表示要把這些bin文件下載到NAND FLASH中,依次下載XIPKERNEL.bin、NK.bin和chain.bin,這個下載的順序是在config.bib文件中指定的,見此文件的相關(guān)部分:

?

圖2

⑵chain.bin文件

在\WINCE600\PRIVATE\WINCEOS\COREOS\NK\TOOLS\ROMIMAGE\remdme.txt下有描述bin文件的結(jié)構(gòu)體定義:

Formats:

? struct BinFile{

??? BYTE signature[7];???? // = { 'B', '0', '0', '0', 'F', 'F', '\a' }

??? DWORD?? ImageStart? //此bin文件在DRAM中的起始地址(虛擬地址)

??? DWORD?? ImageLength //此bin文件的長度,以字節(jié)為單位

??? Record? ImageRecords[ImageLength] //存放此鏡像文件二進制數(shù)據(jù)的記錄

? };

?

? struct Record{

??? DWORD address;//此記錄的起始地址

??? DWORD length;//此記錄的長度,以字節(jié)為單位

??? DWORD chksum;//此記錄所有的數(shù)據(jù)的檢驗碼

? };

下面先通過viewbin –r nk.bin >chain_rec.txt來從大局上了解chain文件的主要信息:

?

圖3

接下面用UltraEdit打開chain.bin文件來看其中的詳細信息:

?

圖4

為了進一步幫助理解bin文件的格式和內(nèi)容,通過viewbin –d nk.bin >chain_data.txt來看其中對應(yīng)的一部分內(nèi)容:

?

圖5

上圖中涉及到一些重要的結(jié)構(gòu)體,在\WINCE600\PUBLIC\COMMON\OAK\INC\Romldr.h中定義,如下:

?

圖6

結(jié)合這些結(jié)構(gòu)體的定義,我們再來通過viewbin –d nk.bin >chain_data.txt看其中的內(nèi)容可以進一步理解chain.bin文件的格式和內(nèi)容,下圖是我把中間大部分為0的數(shù)據(jù)去掉之后的內(nèi)容:

?

圖7

由上面可知chain.bin文件實際的數(shù)據(jù)大小為0x528=1320個字節(jié),但我們通過chain.bin的屬性看到其大小為1363個字節(jié)

圖8

1363這個值就是chain.bin實際有效的數(shù)據(jù)+maginc number+Image Start+length+record[0]. Start+ record[0]. Length+ record[0]. Chksum+ record[1]. Start+ record[1]. Length + record[1]. Chksum+ record[1]的結(jié)束符標志=1320+7+4+4+4+4+4+4+4+4+4=1320+7+9*4=1363個字節(jié)。

?

由上面這些貓描述可知chain.bin文件的格式及內(nèi)容如下:

?

圖9

由上圖介紹可知chain.bin文件的內(nèi)容包含XIP chain(鏈)中有幾個XIP區(qū)域(也即bin文件),每個bin被裝載在RAM中的起始地址,bin文件的大小等信息,可參考圖6的結(jié)構(gòu)體描述,另外,在\WINCE600\PRIVATE\WINCEOS\COREOS\NK\TOOLS\ROMIMAGE\remdme.txt中有下面的描述,有助于深入理解:

?

圖10

1.2?? xipkernel.bin文件

TOC是對于.bib文件的MODULES來說的,每個MODULES下的部分,比如dll或是exe都對應(yīng)一個TOC入口,相應(yīng)的結(jié)構(gòu)體為TOCentry,在Romldr.h中定義;對于bib文件下的FILES部分下的文件,如wince.nls和boot.hv均對應(yīng)一個文件,相應(yīng)的結(jié)構(gòu)體為FILESentry,也在Romldr.h中定義。

先看\WINCE600\PRIVATE\WINCEOS\COREOS\NK\TOOLS\ROMIMAGE\remdme.txt中bin文件格式的相關(guān)描述:

?

圖11

下面我們來看xipkernel.bin被解壓到內(nèi)存中的布局和xipkernel.bin文件內(nèi)容在flash中的存儲布局:

?

圖12

由上圖上半部分可知record[0]和record[1]的數(shù)據(jù)在內(nèi)存中的地址并不是連續(xù)的,而且可以看出它們之間有0x80100040-(0x80100000+4)=0x36個字節(jié)的間距,其他record之間可能有也可能沒有間距,但不會重疊。由上圖下半部分,可以總結(jié)如下:

圖13

那這里record[3:n]的數(shù)據(jù)都是些什么內(nèi)容呢?由圖12可知pTOC = 0x80347864,那我們就來看此地址開始的內(nèi)存處保存的內(nèi)容(結(jié)合圖11可知這就是ROMHDR結(jié)構(gòu)體的內(nèi)容),ROMHDR結(jié)構(gòu)體在Romldr.h中定義,下面就把它的定義貼出來:

?

圖14

接著結(jié)合xipkernel.bin中這部分的內(nèi)容:

?

圖15

結(jié)合圖14和圖15的內(nèi)容,我們來詳細學習ROMHDR結(jié)構(gòu)體的成員變量的含義:

Dllfirst:

dllfirst=0x4001C001,表示分配給操作系統(tǒng)鏡像xipkernel.bin的動態(tài)鏈接庫使用的ROM DLL虛擬地址區(qū)間的起始地址,在WINCE6.0中,0x40000000到0x5FFFFFFF這512MB的虛擬內(nèi)存空間被定為ROM DLL區(qū)間,這里此值為0x4001C001。

?

Dlllast:

dlllast=0x400FC027,表示分配給操作系統(tǒng)鏡像xipkernel.bin的動態(tài)鏈接庫使用的ROM DLL虛擬地址區(qū)間的結(jié)束地址,也就是說為此鏡像文件分配的ROM DLL虛擬內(nèi)存大小為0x400FC027-0x4001C001=0x000E0026,還不到1MB的空間

?

physfirst:

physfirst=0x80100000,表示鏡像文件被裝載到RAM中的起始地址。

?

Physlast:

physlast=0x80410774,表示鏡像文件被裝載到RAM中的結(jié)束地址,它等于Image Start+ length,見下圖:

?

圖16

Nummods:

Nummods=0x0000001E,表示鏡像文件中包含的模塊個數(shù),也就是好.bib文件中MODULES部分包含的模塊個數(shù),這也就是TOC entry的數(shù)量,那么很顯然每個模塊都需要用一個TOCentry結(jié)構(gòu)體來描述模塊(比如nk.exe或是coredll.dll)的相關(guān)信息了。

?

ulRAMStart:

ulRAMStart=0x80500000,表示RAM程序內(nèi)存的起始地址,這塊區(qū)域不包括被系統(tǒng)保留部分的,也不包括被用于對象存儲的空間,用于操作系統(tǒng)及應(yīng)用程序在運行過程中動態(tài)分配以存放系統(tǒng)及程序運行數(shù)據(jù)的RAM空間,為了更好理解此結(jié)構(gòu)體,見config.bib通用RAM區(qū)域的設(shè)置:

?

圖17

?

ulRAMFree:

ulRAMFree=0x80579000,表示RAM的程序內(nèi)存空閑空間的起始地址,指的是可以動態(tài)分配給程序運行時使用的空間,根據(jù)我的理解,在ulRAMStart 到ulRAMFree這個區(qū)域主要用于存放xipkernel.bin全局變量重定位時搬移的數(shù)據(jù)。

?

ulRAMEnd:

ulRAMEnd=0x866600000,表示RAM程序內(nèi)存的結(jié)束地址。

?

ulCopyEntries:

ulCopyEntries=0x00000003,表示全局變量重定位時需要搬移的條目數(shù)。

?

ulCopyOffset:

ulCopyOffset=0x802F4BF4,表示全局變量重定位時搬移條目的偏移地址。

?

ulProfileLen:

ulProfileLen=0x00000000,表示用于profile調(diào)試功能的入口信息的長度。

?

ulProfileOffset:

ulProfileOffset=0x00000000,表示用于profile調(diào)試功能的入口信息的偏移地址。

?

Numfiles:

Numfiles=0x00000002,,表示此鏡像文件中包含的文件數(shù)量,這部分在bib文件的FILES部分指定。

?

ulKernelFlags:

ulKernelFlags=0x00000000,由config.bib中的ROMFLAGS配置的值指定,指定內(nèi)核可選的Flag的位掩碼(bitmask),它的值可以是下面這些值的組合:

Flag ????? Description

0x00000001??? Demand paging is disabled.

0x00000002??? Disable full-kernel mode.

0x00000010??? Trust only modules from the ROM MODULES section.

0x00000020??? Use this flag to stop flushing soft TLB (x86 only).

0x00000040??? Honor the /base linker setting for DLLs.

?

ulFSRamPercent:

ulFSRamPercent=0x80808080,由config.bib中的FSRAMPERCENT的值來指定,但如果沒有config.bib中沒有指定FSRAMPERCENT的值,那就默認為0x80808080,指定分配給文件系統(tǒng)做存儲空間的RAM占整個除去RESERVED和RAMIMAGE指定的空間之外的RAM空間的百分比。這個百分比是這樣計算的:第一個1MB內(nèi)存保留了128(0x80)個4KB大小的頁用于文件系統(tǒng)的存儲,第而個1MB內(nèi)存保留了128(0x80)個4KB大小的頁用于文件系統(tǒng)的存儲,第三個1MB內(nèi)存保留了128(0x80)個4KB大小的頁用于文件系統(tǒng)的存儲,第四個1MB內(nèi)存保留了128(0x80)個4KB大小的頁用于文件系統(tǒng)的存儲。這樣分配給文件系統(tǒng)的RAM內(nèi)存空間占用的百分比=(128+128+128+128)*4*4KB/4MB=50%。

?

ulDrivglobStart:

ulDrivglobStart=0x00000000,表示設(shè)備驅(qū)動程序所用全局變量的起始存儲地址。

?

ulDrivglobLen:

ulDrivglobLen=0x00000000,表示設(shè)備驅(qū)動程序所用全局變量占用內(nèi)存的字節(jié)數(shù)。

?

usCPUType:

usCPUType=0x01C2,表示鏡像文件運行所在的CPU類型。

?

usMiscFlags:

usMiscFlags=0x0002,鏡像文件的混合標記(Miscellaneous flag)選項。

?

pExtensions:

pExtensions=0x80101790,指向存放ROMHDR擴展數(shù)據(jù)的內(nèi)存區(qū)域,此區(qū)域?qū)?yīng)于結(jié)構(gòu)體ROMPID,如下圖所示:

?

圖18

ulTrackingStart:

ulTrackingStart=0x00000000,Tracking調(diào)試功能所用內(nèi)存區(qū)域的起始地址。

?

ulTrackingLen:

ulTrackingLen=0x00000000,Tracking調(diào)試功能所用內(nèi)存區(qū)域的長度。

?

Xipkernel.bin的內(nèi)容還涉及很多結(jié)構(gòu)體及知識點,下部分學習eboot下載并加載xipkernel.bin,nk.bin文件的時候再深入了。

?

總結(jié)

以上是生活随笔為你收集整理的WINCE6.0 chain.bin和xipkernel.bin解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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