WINCE6.0 chain.bin和xipkernel.bin解析
********************************LoongEmbedded********************************
作者:LoongEmbedded(kandi)
時間:2012.03.08
類別:WINCE系統開發
********************************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文件,內容如下:
+XIPKERNEL.bin
NK.bin
chain.bin
表示要把這些bin文件下載到NAND FLASH中,依次下載XIPKERNEL.bin、NK.bin和chain.bin,這個下載的順序是在config.bib文件中指定的,見此文件的相關部分:
?
圖2
⑵chain.bin文件
在\WINCE600\PRIVATE\WINCEOS\COREOS\NK\TOOLS\ROMIMAGE\remdme.txt下有描述bin文件的結構體定義:
Formats:
? struct BinFile{
??? BYTE signature[7];???? // = { 'B', '0', '0', '0', 'F', 'F', '\a' }
??? DWORD?? ImageStart? //此bin文件在DRAM中的起始地址(虛擬地址)
??? DWORD?? ImageLength //此bin文件的長度,以字節為單位
??? Record? ImageRecords[ImageLength] //存放此鏡像文件二進制數據的記錄
? };
?
? struct Record{
??? DWORD address;//此記錄的起始地址
??? DWORD length;//此記錄的長度,以字節為單位
??? DWORD chksum;//此記錄所有的數據的檢驗碼
? };
下面先通過viewbin –r nk.bin >chain_rec.txt來從大局上了解chain文件的主要信息:
?
圖3
接下面用UltraEdit打開chain.bin文件來看其中的詳細信息:
?
圖4
為了進一步幫助理解bin文件的格式和內容,通過viewbin –d nk.bin >chain_data.txt來看其中對應的一部分內容:
?
圖5
上圖中涉及到一些重要的結構體,在\WINCE600\PUBLIC\COMMON\OAK\INC\Romldr.h中定義,如下:
?
圖6
結合這些結構體的定義,我們再來通過viewbin –d nk.bin >chain_data.txt看其中的內容可以進一步理解chain.bin文件的格式和內容,下圖是我把中間大部分為0的數據去掉之后的內容:
?
圖7
由上面可知chain.bin文件實際的數據大小為0x528=1320個字節,但我們通過chain.bin的屬性看到其大小為1363個字節
圖8
1363這個值就是chain.bin實際有效的數據+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]的結束符標志=1320+7+4+4+4+4+4+4+4+4+4=1320+7+9*4=1363個字節。
?
由上面這些貓描述可知chain.bin文件的格式及內容如下:
?
圖9
由上圖介紹可知chain.bin文件的內容包含XIP chain(鏈)中有幾個XIP區域(也即bin文件),每個bin被裝載在RAM中的起始地址,bin文件的大小等信息,可參考圖6的結構體描述,另外,在\WINCE600\PRIVATE\WINCEOS\COREOS\NK\TOOLS\ROMIMAGE\remdme.txt中有下面的描述,有助于深入理解:
?
圖10
1.2?? xipkernel.bin文件
TOC是對于.bib文件的MODULES來說的,每個MODULES下的部分,比如dll或是exe都對應一個TOC入口,相應的結構體為TOCentry,在Romldr.h中定義;對于bib文件下的FILES部分下的文件,如wince.nls和boot.hv均對應一個文件,相應的結構體為FILESentry,也在Romldr.h中定義。
先看\WINCE600\PRIVATE\WINCEOS\COREOS\NK\TOOLS\ROMIMAGE\remdme.txt中bin文件格式的相關描述:
?
圖11
下面我們來看xipkernel.bin被解壓到內存中的布局和xipkernel.bin文件內容在flash中的存儲布局:
?
圖12
由上圖上半部分可知record[0]和record[1]的數據在內存中的地址并不是連續的,而且可以看出它們之間有0x80100040-(0x80100000+4)=0x36個字節的間距,其他record之間可能有也可能沒有間距,但不會重疊。由上圖下半部分,可以總結如下:
圖13
那這里record[3:n]的數據都是些什么內容呢?由圖12可知pTOC = 0x80347864,那我們就來看此地址開始的內存處保存的內容(結合圖11可知這就是ROMHDR結構體的內容),ROMHDR結構體在Romldr.h中定義,下面就把它的定義貼出來:
?
圖14
接著結合xipkernel.bin中這部分的內容:
?
圖15
結合圖14和圖15的內容,我們來詳細學習ROMHDR結構體的成員變量的含義:
Dllfirst:
dllfirst=0x4001C001,表示分配給操作系統鏡像xipkernel.bin的動態鏈接庫使用的ROM DLL虛擬地址區間的起始地址,在WINCE6.0中,0x40000000到0x5FFFFFFF這512MB的虛擬內存空間被定為ROM DLL區間,這里此值為0x4001C001。
?
Dlllast:
dlllast=0x400FC027,表示分配給操作系統鏡像xipkernel.bin的動態鏈接庫使用的ROM DLL虛擬地址區間的結束地址,也就是說為此鏡像文件分配的ROM DLL虛擬內存大小為0x400FC027-0x4001C001=0x000E0026,還不到1MB的空間
?
physfirst:
physfirst=0x80100000,表示鏡像文件被裝載到RAM中的起始地址。
?
Physlast:
physlast=0x80410774,表示鏡像文件被裝載到RAM中的結束地址,它等于Image Start+ length,見下圖:
?
圖16
Nummods:
Nummods=0x0000001E,表示鏡像文件中包含的模塊個數,也就是好.bib文件中MODULES部分包含的模塊個數,這也就是TOC entry的數量,那么很顯然每個模塊都需要用一個TOCentry結構體來描述模塊(比如nk.exe或是coredll.dll)的相關信息了。
?
ulRAMStart:
ulRAMStart=0x80500000,表示RAM程序內存的起始地址,這塊區域不包括被系統保留部分的,也不包括被用于對象存儲的空間,用于操作系統及應用程序在運行過程中動態分配以存放系統及程序運行數據的RAM空間,為了更好理解此結構體,見config.bib通用RAM區域的設置:
?
圖17
?
ulRAMFree:
ulRAMFree=0x80579000,表示RAM的程序內存空閑空間的起始地址,指的是可以動態分配給程序運行時使用的空間,根據我的理解,在ulRAMStart 到ulRAMFree這個區域主要用于存放xipkernel.bin全局變量重定位時搬移的數據。
?
ulRAMEnd:
ulRAMEnd=0x866600000,表示RAM程序內存的結束地址。
?
ulCopyEntries:
ulCopyEntries=0x00000003,表示全局變量重定位時需要搬移的條目數。
?
ulCopyOffset:
ulCopyOffset=0x802F4BF4,表示全局變量重定位時搬移條目的偏移地址。
?
ulProfileLen:
ulProfileLen=0x00000000,表示用于profile調試功能的入口信息的長度。
?
ulProfileOffset:
ulProfileOffset=0x00000000,表示用于profile調試功能的入口信息的偏移地址。
?
Numfiles:
Numfiles=0x00000002,,表示此鏡像文件中包含的文件數量,這部分在bib文件的FILES部分指定。
?
ulKernelFlags:
ulKernelFlags=0x00000000,由config.bib中的ROMFLAGS配置的值指定,指定內核可選的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,指定分配給文件系統做存儲空間的RAM占整個除去RESERVED和RAMIMAGE指定的空間之外的RAM空間的百分比。這個百分比是這樣計算的:第一個1MB內存保留了128(0x80)個4KB大小的頁用于文件系統的存儲,第而個1MB內存保留了128(0x80)個4KB大小的頁用于文件系統的存儲,第三個1MB內存保留了128(0x80)個4KB大小的頁用于文件系統的存儲,第四個1MB內存保留了128(0x80)個4KB大小的頁用于文件系統的存儲。這樣分配給文件系統的RAM內存空間占用的百分比=(128+128+128+128)*4*4KB/4MB=50%。
?
ulDrivglobStart:
ulDrivglobStart=0x00000000,表示設備驅動程序所用全局變量的起始存儲地址。
?
ulDrivglobLen:
ulDrivglobLen=0x00000000,表示設備驅動程序所用全局變量占用內存的字節數。
?
usCPUType:
usCPUType=0x01C2,表示鏡像文件運行所在的CPU類型。
?
usMiscFlags:
usMiscFlags=0x0002,鏡像文件的混合標記(Miscellaneous flag)選項。
?
pExtensions:
pExtensions=0x80101790,指向存放ROMHDR擴展數據的內存區域,此區域對應于結構體ROMPID,如下圖所示:
?
圖18
ulTrackingStart:
ulTrackingStart=0x00000000,Tracking調試功能所用內存區域的起始地址。
?
ulTrackingLen:
ulTrackingLen=0x00000000,Tracking調試功能所用內存區域的長度。
?
Xipkernel.bin的內容還涉及很多結構體及知識點,下部分學習eboot下載并加載xipkernel.bin,nk.bin文件的時候再深入了。
?
總結
以上是生活随笔為你收集整理的WINCE6.0 chain.bin和xipkernel.bin解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WINCE应用BINFS
- 下一篇: 基于WINCE6.0下载multiple