WINCE应用BINFS
********************************LoongEmbedded********************************
作者:LoongEmbedded(kandi)
時間:2012.03.02
類別:WINCE系統開發
********************************LoongEmbedded********************************
?
1.??? BINFS概述
BINFS(Binary ROM Image File System)是可以讀取由Romimage.exe生成的.bin文件的二進制ROM鏡像文件系統。.bin文件格式以具體的section來組織數據,每section有一個section頭,此部分包含這section的開始地址、長度和檢驗碼,見下圖:
?
圖1
Romimage.exe把邏輯section,比如一個應用程序的text或是.data區域的數據寫到.bin文件中。
?
為了能在塊驅動(block driver)的上層加載BINFS,我們必須在storage profile注冊表項下面加入(enter)塊驅動相應的注冊表鍵,如下所示,下面的示例注冊表信息表示我們可以增加自己塊驅動的storage profile來指定BINFS為默認的文件系統。
; 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.??? 如何應用(implemnet)BINFS
我們可以應用BINFS在NAND或NOR閃存上來讀取.bin文件。BINFS為最終的用戶(end user)解析每個區域(比如xipkernel,nk.bin).bin文件的記錄(record),為了使用BINFS,我們必須在bootloader中增加multi-bin區域技術,初始之外,還需要對config.bib文件進行必要的修改,從而使BINFS可以正確讀取我們的運行時鏡像文件。
?
為了應用BINFS,必須做下面的處理:
2.1? 在bootloader中增加對BINFS的支持
?
如果一個bootloader包含對BINFS的支持,那么bootloader能夠分區、格式化和寫數據到存儲介質中。Bootloader使用Bootpart庫(bootpart.lib)來向閃存寫數據和創建分區,在同一個儲存設備中需要創建BINFS和其他文件格式(比如是FAT)的分區。Bootloader使用Bootpart庫中的BP_OpenPartition()函數來創建BINFS分區和擴展分區。因為一旦Bootpart庫對閃存進行了分區,那么OS就不能修改MBR(master boot record),所以OS需要這個擴展分區來創建一個或多個數據分區。
?
Bootpart庫能夠創建一個保存引導參數(boot parameter)的引導分區,閃存的塊包含MBR扇區(sector)、BINFS存儲區域、引導參數分區(根據需要來決定,可選)和擴展分區,如下圖:
?
圖2
BIFS和引導參數分區是只讀,所以不能被格式化或刪除。
?
對于bootloader,Bootpart使FMD(flash media driver)的代碼比較抽象,這樣使得bootloader創建一個分區和指定分區中的數據偏移量就可以進行讀或寫了,另外Bootpart還可以對閃存進行低層格式化(low-level format)。
?
2.2? 修改config.bib的MEMORY部分來支持BINFS
為了應用BINFS,我們必須安裝下面的步驟來config.bib下面的內容:
⑴???? 加擴展區域(這里是指NK.bin,也即除了最小內核xipkernel.bin之外的其他OS部分)并且設置其類型為NANDIMAGE,這樣可以防止把擴展區域的地址空間分配為RAM,config.bib中的示例配置如下圖所示:
?
圖3
鏡像內核xipkernel為RAMIMAGE,見圖3,xipkernel區域是為支持BINFS能夠讀取存儲器上BINFS分區數據所需要的最小內核。因為這個內核必須存在于(reside in)RAM中和它是RAMIMAGE類型,所以包含在典型的情況下,xipkernel區域包含內核所需要的文件,而且xipkernel區域(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驅動被設備管理器加載,那么還需要增加device.dll、devmgr.dll、regenum.dll、busenum.dll和pm.dll到xipkernel中。
⑷如內核支持KITL,那么也需要把kitl.dll包含進來。
⑸如要支持debug,需要增加hd.dll、osaxst0.dll和osaxst0.dll到xipkernel。
⑹把其他剩下部分(remaining items)包含到擴展區域(nk.bin)。
?
2.3? 修改config.bib的CONFIG部分來支持BINFS
config.bib中CONFIG部分必須指定RAM_AUTOSIZE=OFF和ROM_AUTOSIZE=OFF,XIPSCHAIN的值表示chain區域(chain.bin)的起始地址,這個值必須要和MEMORY部分指定的值一致,我們的BSP包中config.bib這部分內容如下:
?
圖4
?
2.4? 修改common.bib文件
如果我們的OS支持用戶模式驅動(User Mode Drivers),要修改common.bib文件中驅動模塊為非頁對齊的(non-pageable)。WINCE6.0支持設備驅動運行在用戶模式下,可是,如果導出PowerUp或PowerDown函數的用戶模式驅動和驅動代碼要求頁對齊(demand-paged), BINFS分區中有這種類型的驅動,或是這種類型驅動在.bib文件的FILE部分,或是這種驅動保存在外部存儲器中(external storage),這些情況都會發生頁缺陷出錯(a page fault error may occur)。
?
為了在BINFS中支持用戶模式驅動,我們必須修改common.bib文件中這些模塊的屬性,內容如下:
⑴獲取需要跟新模塊的列表。
使用 findstr /m “PowerDown” *.map查找導出PowerUp和PowerDown函數的驅動,如下圖:
圖5
⑵打開common.bib文件。
⑶通過上面命令找到的驅動,然后相應在common.bib文件中添加M標識以表示此模塊是非頁對齊的(non-pageable),如下所示:
coredll.dll $(_FLATRELEASEDIR)\coredll.dll XIPKERNEL SHM
⑷保存common.bib文件。
?
另外在common.reg中需要增加下面的內容
[HKEY_LOCAL_MACHINE\System\StorageManager\PartitionTable]
?? "20"="BOOT"
?? "21"="BINFS"
?
總結
以上是生活随笔為你收集整理的WINCE应用BINFS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WINCE6.0支持Multiple X
- 下一篇: WINCE6.0 chain.bin和x