WINCE应用BINFS
********************************LoongEmbedded********************************
作者:LoongEmbedded(kandi)
時(shí)間:2012.03.02
類別:WINCE系統(tǒng)開發(fā)
********************************LoongEmbedded********************************
?
1.??? BINFS概述
BINFS(Binary ROM Image File System)是可以讀取由Romimage.exe生成的.bin文件的二進(jìn)制ROM鏡像文件系統(tǒng)。.bin文件格式以具體的section來(lái)組織數(shù)據(jù),每section有一個(gè)section頭,此部分包含這section的開始地址、長(zhǎng)度和檢驗(yàn)碼,見(jiàn)下圖:
?
圖1
Romimage.exe把邏輯section,比如一個(gè)應(yīng)用程序的text或是.data區(qū)域的數(shù)據(jù)寫到.bin文件中。
?
為了能在塊驅(qū)動(dòng)(block driver)的上層加載BINFS,我們必須在storage profile注冊(cè)表項(xiàng)下面加入(enter)塊驅(qū)動(dòng)相應(yīng)的注冊(cè)表鍵,如下所示,下面的示例注冊(cè)表信息表示我們可以增加自己塊驅(qū)動(dòng)的storage profile來(lái)指定BINFS為默認(rèn)的文件系統(tǒng)。
; Bind BINFS to the block driver
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\SMFlash]
?????? "DefaultFileSystem"="BINFS"
?????? "PartitionDriver"="mspart.dll"
?????? "AutoMount"=dword:1
?????? "AutoPart"=dword:1
?????? "MountFlags"=dword:11
?????? "Folder"="ResidentFlash"
?????? "Name"="Samsung Flash Disk"
?????? "BootPhase"=dword:0
??? ??????
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\SMFlash\BINFS]
??? "MountHidden"=dword:1
"MountAsROM"=dword:1
?
2.??? 如何應(yīng)用(implemnet)BINFS
我們可以應(yīng)用BINFS在NAND或NOR閃存上來(lái)讀取.bin文件。BINFS為最終的用戶(end user)解析每個(gè)區(qū)域(比如xipkernel,nk.bin).bin文件的記錄(record),為了使用BINFS,我們必須在bootloader中增加multi-bin區(qū)域技術(shù),初始之外,還需要對(duì)config.bib文件進(jìn)行必要的修改,從而使BINFS可以正確讀取我們的運(yùn)行時(shí)鏡像文件。
?
為了應(yīng)用BINFS,必須做下面的處理:
2.1? 在bootloader中增加對(duì)BINFS的支持
?
如果一個(gè)bootloader包含對(duì)BINFS的支持,那么bootloader能夠分區(qū)、格式化和寫數(shù)據(jù)到存儲(chǔ)介質(zhì)中。Bootloader使用Bootpart庫(kù)(bootpart.lib)來(lái)向閃存寫數(shù)據(jù)和創(chuàng)建分區(qū),在同一個(gè)儲(chǔ)存設(shè)備中需要?jiǎng)?chuàng)建BINFS和其他文件格式(比如是FAT)的分區(qū)。Bootloader使用Bootpart庫(kù)中的BP_OpenPartition()函數(shù)來(lái)創(chuàng)建BINFS分區(qū)和擴(kuò)展分區(qū)。因?yàn)橐坏〣ootpart庫(kù)對(duì)閃存進(jìn)行了分區(qū),那么OS就不能修改MBR(master boot record),所以O(shè)S需要這個(gè)擴(kuò)展分區(qū)來(lái)創(chuàng)建一個(gè)或多個(gè)數(shù)據(jù)分區(qū)。
?
Bootpart庫(kù)能夠創(chuàng)建一個(gè)保存引導(dǎo)參數(shù)(boot parameter)的引導(dǎo)分區(qū),閃存的塊包含MBR扇區(qū)(sector)、BINFS存儲(chǔ)區(qū)域、引導(dǎo)參數(shù)分區(qū)(根據(jù)需要來(lái)決定,可選)和擴(kuò)展分區(qū),如下圖:
?
圖2
BIFS和引導(dǎo)參數(shù)分區(qū)是只讀,所以不能被格式化或刪除。
?
對(duì)于bootloader,Bootpart使FMD(flash media driver)的代碼比較抽象,這樣使得bootloader創(chuàng)建一個(gè)分區(qū)和指定分區(qū)中的數(shù)據(jù)偏移量就可以進(jìn)行讀或?qū)懥?#xff0c;另外Bootpart還可以對(duì)閃存進(jìn)行低層格式化(low-level format)。
?
2.2? 修改config.bib的MEMORY部分來(lái)支持BINFS
為了應(yīng)用BINFS,我們必須安裝下面的步驟來(lái)config.bib下面的內(nèi)容:
⑴???? 加擴(kuò)展區(qū)域(這里是指NK.bin,也即除了最小內(nèi)核xipkernel.bin之外的其他OS部分)并且設(shè)置其類型為NANDIMAGE,這樣可以防止把擴(kuò)展區(qū)域的地址空間分配為RAM,config.bib中的示例配置如下圖所示:
?
圖3
鏡像內(nèi)核xipkernel為RAMIMAGE,見(jiàn)圖3,xipkernel區(qū)域是為支持BINFS能夠讀取存儲(chǔ)器上BINFS分區(qū)數(shù)據(jù)所需要的最小內(nèi)核。因?yàn)檫@個(gè)內(nèi)核必須存在于(reside in)RAM中和它是RAMIMAGE類型,所以包含在典型的情況下,xipkernel區(qū)域包含內(nèi)核所需要的文件,而且xipkernel區(qū)域(xipkernel.bin)中必須包含下面的模塊:
????? Nk.exe
????? Kernel.dll
????? Coredll.dll
????? K.coredll.dll
????? Oalioctl.dll
????? Filesys.dll
????? Fsdmgr.dll
????? Mspart.dll
????? Romfsd.dll
????? Binfs.dll
????? Default.fdf or boot.hv
????? Fpcrt.dll (ARM-only)
????? Ceddk.dll (if required by your flash driver)
????? Your flash driver
?
⑶如果我們的flash驅(qū)動(dòng)被設(shè)備管理器加載,那么還需要增加device.dll、devmgr.dll、regenum.dll、busenum.dll和pm.dll到xipkernel中。
⑷如內(nèi)核支持KITL,那么也需要把kitl.dll包含進(jìn)來(lái)。
⑸如要支持debug,需要增加hd.dll、osaxst0.dll和osaxst0.dll到xipkernel。
⑹把其他剩下部分(remaining items)包含到擴(kuò)展區(qū)域(nk.bin)。
?
2.3? 修改config.bib的CONFIG部分來(lái)支持BINFS
config.bib中CONFIG部分必須指定RAM_AUTOSIZE=OFF和ROM_AUTOSIZE=OFF,XIPSCHAIN的值表示chain區(qū)域(chain.bin)的起始地址,這個(gè)值必須要和MEMORY部分指定的值一致,我們的BSP包中config.bib這部分內(nèi)容如下:
?
圖4
?
2.4? 修改common.bib文件
如果我們的OS支持用戶模式驅(qū)動(dòng)(User Mode Drivers),要修改common.bib文件中驅(qū)動(dòng)模塊為非頁(yè)對(duì)齊的(non-pageable)。WINCE6.0支持設(shè)備驅(qū)動(dòng)運(yùn)行在用戶模式下,可是,如果導(dǎo)出PowerUp或PowerDown函數(shù)的用戶模式驅(qū)動(dòng)和驅(qū)動(dòng)代碼要求頁(yè)對(duì)齊(demand-paged), BINFS分區(qū)中有這種類型的驅(qū)動(dòng),或是這種類型驅(qū)動(dòng)在.bib文件的FILE部分,或是這種驅(qū)動(dòng)保存在外部存儲(chǔ)器中(external storage),這些情況都會(huì)發(fā)生頁(yè)缺陷出錯(cuò)(a page fault error may occur)。
?
為了在BINFS中支持用戶模式驅(qū)動(dòng),我們必須修改common.bib文件中這些模塊的屬性,內(nèi)容如下:
⑴獲取需要跟新模塊的列表。
使用 findstr /m “PowerDown” *.map查找導(dǎo)出PowerUp和PowerDown函數(shù)的驅(qū)動(dòng),如下圖:
圖5
⑵打開common.bib文件。
⑶通過(guò)上面命令找到的驅(qū)動(dòng),然后相應(yīng)在common.bib文件中添加M標(biāo)識(shí)以表示此模塊是非頁(yè)對(duì)齊的(non-pageable),如下所示:
coredll.dll $(_FLATRELEASEDIR)\coredll.dll XIPKERNEL SHM
⑷保存common.bib文件。
?
另外在common.reg中需要增加下面的內(nèi)容
[HKEY_LOCAL_MACHINE\System\StorageManager\PartitionTable]
?? "20"="BOOT"
?? "21"="BINFS"
?
總結(jié)
以上是生活随笔為你收集整理的WINCE应用BINFS的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: WINCE6.0支持Multiple X
- 下一篇: WINCE6.0 chain.bin和x