WinCE5.0 SMDK2410 BSP在GEC2410开发板上的移植(11)-BINFS在Nand上的实现(Multi-Bin的实现)
之前我們都是把整個系統鏡像復制到RAM中運行,這樣啟動時間較慢,也占用內存.使用Multi-Bin的模式,將需要復制到RAM的組件和可存放在存儲設備(如Nand)中的組件分開,系統啟動時只需要將CE核心組件復制到內存中運行,然后需要的組件從Nand中讀取即可.之前我們已經在eboot中添加了操作BINFS分區的支持.然后就可以進行系統鏡像的定制了.
如何實現可以參考PB幫助How to Implement BinFS一節.
1.修改config.bib進行地址設置
?XIPKERNEL? 80001000???? 00400000??? RAMIMAGE
?CHAIN???????? 80401000???? 00001000??? RESERVED
?NK???????????? ? 80402000?????02BFF000??? NANDIMAGE
?RAM??????????? 8C200000?? ? 01E00000??? RAM
?FLASH??????? ?92000000?????00100000????RESERVED
XIPKERNEL就是我們的RAMIMAGE,即最小內核,里面存放了啟動時必須復制到內存的文件,這里設置4MB大小,可以根據編譯出來的XIPKERNEL.bin大小進行調整,MS幫助里用的是NK最為RAMIMAGE,由于RAMIMAGE里的文件較少,為了減少工作量,把common.bib中的少部分文件修改屬性(NK->XIPKERNEL)即可.
NK為NANDIMAGE,其他文件就存放在這個區域
CHAIN保持了bin文件的信息
關于RAM的設置,使用Multi-Bin可以增加更多的內存,實際上80402000~82000000范圍的內存也可以作為內存來使用,但是由于兩片SDRAM的地址不連續,在oemaddrtab_cfg.inc中可以看到:
??????? DCD???? 0x80000000, 0x32000000, 32????? ; 32 MB DRAM BANK 6
??????? DCD???? 0x82000000, 0x08000000, 32????? ; 32 MB SROM(SRAM/ROM) BANK 1
??????? DCD???? 0x84000000, 0x10000000, 32????? ; nGCS2: PCMCIA/PCCARD
??????? DCD???? 0x86000000, 0x18000000, 32????? ; 32 MB SROM(SRAM/ROM) BANK 3
??????? DCD???? 0x88000000, 0x20000000, 32????? ; 32 MB SROM(SRAM/ROM) BANK 4
??????? DCD???? 0x8A000000, 0x28000000, 32????? ; 32 MB SROM(SRAM/ROM) BANK 5
??????? DCD???? 0x8C000000, 0x30000000, 32????? ; 32 MB DRAM BANK 6
而這里只能設置一片連續的RAM(8C200000起始的一段),關于如何將地址不連續的兩段內存同時能被CE使用,我們將在下一節進行研究.
以下為配置信息,注意XIPSCHAIN應該為CHAIN的起始地址
CONFIG
?AUTOSIZE=ON
?COMPRESSION=ON
?DLLADDR_AUTOSIZE=ON
?KERNELFIXUPS=ON
?PROFILE=OFF
?RAM_AUTOSIZE=OFF
?ROMFLAGS=0
?ROM_AUTOSIZE=OFF
?ROMSIZE=03000000
?ROMSTART=80001000
?ROMWIDTH=32
?XIPSCHAIN=80401000
2.修改common.bib
接下來就是文件分配了,XIPKERNEL包括的主要是nk.exe,filesys.exe,還有和binfs存儲相關的dll,binfs.dll,mspart.dll等,經過反復測試,需要包括的文件具體如下(可能會有不需要的文件),:
?? nk.exe????????? $(_FLATRELEASEDIR)/kern.exe???????????????? XIPKERNEL? SHXL
?? kd.dll????????? $(_FLATRELEASEDIR)/kd.dll?????????????????? XIPKERNEL? SHK
?? hd.dll????????? $(_FLATRELEASEDIR)/hd.dll?????????????????? XIPKERNEL? SHK
?? osaxst0.dll???? $(_FLATRELEASEDIR)/osaxst0.dll????????????? XIPKERNEL? SHK
?? osaxst1.dll???? $(_FLATRELEASEDIR)/osaxst1.dll????????????? XIPKERNEL? SHK
?? coredll.dll???? $(_FLATRELEASEDIR)/coredll.dll????????????? XIPKERNEL? SHXL
?? filesys.exe???? $(_FLATRELEASEDIR)/filesys.exe????????????? XIPKERNEL? SHM
?? device.exe????? $(_FLATRELEASEDIR)/device.exe?????????????? XIPKERNEL? SHM
?? devmgr.dll????? $(_FLATRELEASEDIR)/devmgr.dll?????????????? XIPKERNEL? SHM
?? regenum.dll???? $(_FLATRELEASEDIR)/regenum.dll????????????? XIPKERNEL? SH
?? busenum.dll???? $(_FLATRELEASEDIR)/busenum.dll????????????? XIPKERNEL? SH
?? pm.dll?????? $(_FLATRELEASEDIR)/pm.dll?????????????????????? XIPKERNEL? SHM
?? fatfsd.dll?????? $(_FLATRELEASEDIR)/fatfsd.dll??????????????? XIPKERNEL? SH
?? diskcache.dll??? $(_FLATRELEASEDIR)/diskcache.dll???????????? XIPKERNEL? SH
?? fatutil.dll???? $(_FLATRELEASEDIR)/fatutil.dll????????????? XIPKERNEL? SH
?? fsdmgr.dll????? $(_FLATRELEASEDIR)/fsdmgr.dll?????????????? XIPKERNEL? SH
?? binfs.dll???? $(_FLATRELEASEDIR)/binfs.dll????????????? ??? XIPKERNEL? SH
?? mspart.dll???? $(_FLATRELEASEDIR)/mspart.dll??????????????? XIPKERNEL? SH
?? ceddk.dll?????? $(_FLATRELEASEDIR)/ceddk.dll??????????????? XIPKERNEL? SH
?? wince.nls?????? $(_FLATRELEASEDIR)/wince.nls??????????????? XIPKERNEL? SHU
?? default.fdf???? $(_FLATRELEASEDIR)/default.fdf????????????? XIPKERNEL? SH
?? boot.hv???????? $(_FLATRELEASEDIR)/boot.hv????????????????? XIPKERNEL? SH
但是將這段設置放到common.bib下會報重復定義的錯誤(Warning: Found duplicate entry 'nk.exe')因為這些文件之前都定義在NK上,這樣新的設置有可能被忽略掉了,因此我將這些文件的NK屬性直接修改為XIPKERNEL(先備份好common.bib,位于/PUBLIC/COMMON/OAK/FILES/common.bib)
如:
IF IMGSIGN
IF IMGPROFILER
?? nk.exe????????? $(_FLATRELEASEDIR)/kernkitlprof.exe???????? XIPKERNEL? SHXL
ENDIF IMGPROFILER
IF IMGPROFILER !
IF IMGNOKITL
?? nk.exe????????? $(_FLATRELEASEDIR)/kern.exe???????????????? XIPKERNEL? SHXL
ENDIF IMGNOKITL
IF IMGNOKITL !
?? nk.exe????????? $(_FLATRELEASEDIR)/kernkitl.exe???????????? XIPKERNEL? SHXL
ENDIF IMGNOKITL !
ENDIF IMGPROFILER !
ENDIF IMGSIGN
3.注冊表設置
[HKEY_LOCAL_MACHINE/init/BootVars]
?? "SystemHive"="Documents and Settings//system.hv"
?? "ProfileDir"="Documents and Settings"
?? "Flags"=dword:3 ;equals to "Start DevMgr"=dword:1
?? "RegistryFlags"=dword:1 ;auto flush system.hv
; END HIVE BOOT SECTION
; @CESYSGEN ENDIF FILESYS_FSREGHIVE
; HIVE BOOT SECTION
; @CESYSGEN IF CE_MODULES_SDNPCID
?
; Default values for binfs.? These can be overridden per profile
[HKEY_LOCAL_MACHINE/System/StorageManager/BinFS]
??? "FriendlyName"="BIN Filesystem"
??? "Dll"="binfs.dll"
??? "Paging"=dword:1
?"Folder"="BINFS"?
[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/MSFlash]
??????? "Profile"="MSFlash"
??????? "IClass"=multi_sz:"{A4E7EDDA-E575-4252-9D6B-4195D48BB865}"
??????? "Order"=dword:0
??????? "FriendlyName"="MSFLASH Driver"
??????? "Dll"="smflash.dll"
??????? "Prefix"="DSK"
??????? "Ioctl"=dword:4?????
??"Flags"=dword:1000??
??"BootPhase"=dword:0
[HKEY_LOCAL_MACHINE/System/StorageManager/AutoLoad/MSFlash]
??? "DriverPath"="Drivers//BuiltIn//MSFlash"
??? ; LoadFlags 0x01 == load synchronously
??? "LoadFlags"=dword:1
??? "Order"=dword:0
??? "BootPhase"=dword:0
; @CESYSGEN ENDIF CE_MODULES_SDNPCID
; END HIVE BOOT SECTION
; HIVE BOOT SECTION
; @CESYSGEN IF CE_MODULES_SDNPCID
[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/MSFlash]
??? "DefaultFileSystem"="BINFS"
??? "PartitionDriver"="mspart.dll"
??? "MountAsROM"=dword:1
??? "MountHidden"=dword:1? ;hide BINFS folder
??? "Folder"="Flash? Disk"
??? "Name"="FLASH Disk Block Device"
?"AutoMount"=dword:1?
??? "AutoPart"=dword:1??
??? "BootPhase"=dword:0
??? "Flags"=dword:1000?
??? "AutoFormat"=dword:1
; Keep FATFS from trying to shadow /Windows
[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/MSFlash/FATFS]
??? "MountAsROM"=dword:0
?"MountHidden"=dword:0??;display Flash Dish folder
??? "MountAsBootable"=dword:1
??? "Flags"=dword:00000014??? ;FATFS_FORCE_WRITETHROUGH | FATFS_DISABLE_AUTOSCAN
??? "EnableWriteBack"=dword:1
??? "CheckForFormat"=dword:1?
; @CESYSGEN ENDIF CE_MODULES_SDNPCID
; END HIVE BOOT SECTION
最終編譯出來的xip.bin為9.55MB(沒有中文支持),里面包含了XIPKERNEL.bin(1.34MB),NK.bin(8.2MB),chain.bin,通過PB將xip.bin燒寫到BINFS分區中.設置eboot啟動讀BINFS分區鏡像大小(2MB),這樣啟動速度明顯加快,可以看到BINFS文件夾(MountHidden設為0).
至此,Multi-Bin已基本實現,還剩將兩段地址不連續的內存都注冊給CE使用,這樣內存就能大大增加了.
總結
以上是生活随笔為你收集整理的WinCE5.0 SMDK2410 BSP在GEC2410开发板上的移植(11)-BINFS在Nand上的实现(Multi-Bin的实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 刘亦菲早期短发造型曝光引网友围观:“神仙
- 下一篇: 取消一个请求(Cancel)