为了缩小启动时间和内存占用的问题,我需要让WINCE支持
多BIN档。由于本人知识水平有限,支持多BIN遇到了自己不能单独解决问题和困惑,实在没有办法,想请大家帮我分析一下问题,谢谢!
好了,我现在把我的问题以及对问题的一些个人看法做一些描述,我知道WINCE如果需要支持多BIN文件需要把Image分成两大部分:xipkernel和nk,其中xipkernel主要包括CE比较核心又需要加载的程序和DLL文件(相当于LINUX的kernel产生的Image吧),nk中包括剩余的程序,DLL文件,以及其他的文件(相当于LINUX的文件系统吧)。当然还有一个chain,他只是一个中间的连接文件,没有什么太多的内容。为了实现掉电保存注册表数据的问题,CE系统应该还需要支持HIVE。通过网上的一些资料我对WINCE做了以下工作。
1.在PB中将HIVEbased Registers添加到WorkSpaces中
2.注释掉default.fdf
3.修改config.bin
MEMORY
pdwXIPLoc 00000000 803FF000 FIXUPVAR
XIPKERNEL 80200000 001FF000 RAMIMAGE
CHAIN 803FF000 00001000 RESERVED
NK 80400000 01E00000 NANDIMAGE
RAM 82200000 07C00000 RAM
FLASH 92000000 00100000 RESERVED
CONFIG
AUTOSIZE=ON
COMPRESSION=ON
DLLADDR_AUTOSIZE=ON
KERNELFIXUPS=ON
PROFILE=OFF
RAM_AUTOSIZE=OFF
ROMFLAGS=0
ROM_AUTOSIZE=OFF
XIPSCHAIN=803FF000
4.添加以下文件到platform.bib
MODULES
; Name Path Memory Type
; -------------- --------------------------------------------- -----------
nk.exe D:/WINCE500/PBWorkspaces/SMDK2440/RelDir/SMDK2440_ARMV4I_Release/kern.exe XIPKERNEL SH
coredll.dll D:/WINCE500/PBWorkspaces/SMDK2440/RelDir/SMDK2440_ARMV4I_Release/coredll.dll XIPKERNEL SH
filesys.exe D:/WINCE500/PBWorkspaces/SMDK2440/RelDir/SMDK2440_ARMV4I_Release/filesys.exe XIPKERNEL SH
fatfsd.dll D:/WINCE500/PBWorkspaces/SMDK2440/RelDir/SMDK2440_ARMV4I_Release/fatfsd.dll XIPKERNEL SH
diskcache.dll D:/WINCE500/PBWorkspaces/SMDK2440/RelDir/SMDK2440_ARMV4I_Release/diskcache.dll XIPKERNEL SH
fatutil.dll D:/WINCE500/PBWorkspaces/SMDK2440/RelDir/SMDK2440_ARMV4I_Release/fatutil.dll XIPKERNEL SH
binfs.dll D:/WINCE500/PBWorkspaces/SMDK2440/RelDir/SMDK2440_ARMV4I_Release/binfs.dll XIPKERNEL SH
fsdmgr.dll D:/WINCE500/PBWorkspaces/SMDK2440/RelDir/SMDK2440_ARMV4I_Release/fsdmgr.dll XIPKERNEL SH
mspart.dll D:/WINCE500/PBWorkspaces/SMDK2440/RelDir/SMDK2440_ARMV4I_Release/mspart.dll XIPKERNEL SH
ceddk.dll D:/WINCE500/PBWorkspaces/SMDK2440/RelDir/SMDK2440_ARMV4I_Release/ceddk.dll XIPKERNEL SH
smflash.dll D:/WINCE500/PBWorkspaces/SMDK2440/RelDir/SMDK2440_ARMV4I_Release/smflash.dll XIPKERNEL SH
FILES
boot.hv D:/WINCE500/PBWorkspaces/SMDK2440/RelDir/SMDK2440_ARMV4I_Release/boot.hv XIPKERNEL SH
default.hv D:/WINCE500/PBWorkspaces/SMDK2440/RelDir/SMDK2440_ARMV4I_Release/default.hv XIPKERNEL SH
user.hv D:/WINCE500/PBWorkspaces/SMDK2440/RelDir/SMDK2440_ARMV4I_Release/user.hv XIPKERNEL SH
5.添加以下文件到platform.reg
; HIVE BOOT SECTION
; Add BinFS to partition table
[HKEY_LOCAL_MACHINE/System/StorageManager/PartitionTable]
"21"="BINFS"
[HKEY_LOCAL_MACHINE/System/StorageManager/BINFS]
"Folder"="BINFS"
"FriendlyName"="Bin FileSystem"
"Dll"="binfs.dll"
; MountFlags:
; 0x10 specifies that this file system is to be mounted as an external
; ROM filesystem shadowing the /windows directory
; 0x1 specifies that the mountpoint /BINFS is to be hidden
;
"MountFlags"=dword:10
"BootPhase"=dword:0
; END HIVE BOOT SECTION
6.sysgen
此操作完成后会在Release目录下产生一下几个文件:
boot.hv, default.hv, user.hv
xipkernel.bin, chain.bin, nk.bin, xip.bin
7.将xip.bin烧写到机器,启动打印以下信息后系统没有反应Windows CE Kernel for ARM (Thumb Enabled) Built on Jun 24 2004 at 18:25:00
ProcessorType=0920 Revision=0
sp_abt=ffff5000 sp_irq=ffff2800 sp_undef=ffffc800 OEMAddressTable = 8020633c
DCache: 8 sets, 64 ways, 32 line size, 16384 size
ICache: 8 sets, 64 ways, 32 line size, 16384 size
OALIntrInit,g_pPortRegs->GPFDAT=0x3d
OALIntrInit: g_pPortRegs->GPGDAT=0x6617
BSPIntrInit sunny mark
BSPIntrInit GPGCON=0x100
BSPIntrInit GPFCON=0xaaa2
BSPIntrInit EXTINT0=0x22222222
BSPIntrInit EXTINT1=0x22222222
OALIntrEnableIrqs irp=14,cout=1
OALIntrEnableIrqs irp=14
我需要请教的问题描述如下:
我的硬件是s3c2440,64M SDRAM, 64M Flash,板子是公司在Samsung基础上重新设计的
按我的理解我的FLASH存储映射关系如下
///////////////////////////////////////////////////////////
0 block stepldr.bin(nboot) 这部分相当于启动NorFlash
///////////////////////////////////////////////////////////
1 block toc
///////////////////////////////////////////////////////////
2-9 block eboot.bin (bootloader的主要代码)
//////////////////////////////////////////////////////////
(10-137) xipkernel.bin
10-2058 block xip.bin (138) chain.bin
(139-2058) nk.bin
注:此部分不考虑坏块的问题,我想应该是这样的映射关系
//////////////////////////////////////////////////////////
系统的工作原理应该是这样的:
把(10-138)块的内容copy到内存80200000-80400000,然后跳到startup的入口上启动WINCE系统,我现在不能理解的是WINCE怎么知道nk.bin是binfs文件系统,而且位置是在(139-2058)这个位置上呢?我知道LINUX可以通过CmdLine来传递挂载根文件系统的类型,Flash的开始地址和大小,但我不知道WINCE有没有类似的传法,如果有的话,它是如何实现的?