转自:http://blog.21ic.com/user1/5310/archives/2008/53355.html
功夫不负有心人,经过几天的努力,Hive注册表终于可以实现了。当用颤抖的手指点开菜单发现设置可以保存后,心中一阵狂喜。这段时间在网上也参考了不少别人的心得,自己成功了,不敢独享,特来与大家share一下!
好了,废话说完了,下面说正事。先说下我对Hive注册表的浅显理解。
Hive主要功能是实现注册表的掉电保存,它是如何实现的呢?首先把注册表分为两部分:boot.hv第一部分、system.hv和user.hv算第二部分。为什么分开?这个问题问得好!因为我们想永久保存注册表就需要把它存到flash等存储器中,那这些保存的文件如何获得?还是需要的注册表的帮忙的啊!这就是boot.hv的作用,在其中就包含了要获得system.hv和user.hv所需的存储器驱动(如flash驱动)和文件系统驱动(如FAT)等等,并且这些设置一般无需保存。我们所要保存的注册表在system.hv和user.hv中。
还有一点就是我们的注册表改动都是在内存中,如果不及时把它写入所保存的文件中,掉电还是会消失的。有两种方法:一种是调用FlushRegister,另一种就设置一个flag让 WinCE在每次改动注册表后自动Flush。当冷启动后系统会先检查flash等存储器中的hv文件是否和内存中的一致,否则就加载存储器中的注册表设置。
再就是,我的系统镜像文件分为两部分:XIPNK.bin和NK.bin。其中,XIPNK.bin是由bootloader拷到RAM中,然后跳转到其入口点执行,进行一些初始化的工作。然后OS从注册表中读取binfs的相关项,使得flash binfs分区中的NK.bin对OS可用,进而完成系统启动。(注:我开始时是由于device.exe在NK.bin中,可能是与binfs驱动加载顺序的问题吧,系统一直起不来,错误如下:
Data Abort: Thread=8bfc6000 Proc=8a4307b0 'filesys.exe' AKY=00000003 PC=03f9ea48(coredll.dll+0x0002ea48) RA=03f9ea20(coredll.dll+0x0002ea20) BVA=04000000 FSR=00000007
后来,把device.exe加到XIPNK.bin中,加载一下又死了!binfs驱动和FAT驱动都加载完了啊!结果就在我走投无路时猛然发现PB5的帮助文档里的一段话:
Set the MountFlags registry value equal to DWORD:2.
Set this value on the Storage Manager profile of the file system driver for the medium that contains the registry. This indicates that the file system contains the following registry key.
[HKEY_LOCAL_MACHINE"System"StorageManager"Profiles"<ProfileName>"<FileSystemName>]
"MountFlags"=dword:2
结果把MountFlags改过来后问题迎刃而解!这真是……还是学习不够啊!
下面就贴出我platform.reg的设置来(至于如何把Hive注册表添加到自己的系统
就不用说了吧?)。对了,还有我的系统整体情况:2440+WinCE5.0+64M SDRAM+64M NANDflash+PB5.0。
;//////////////////////////////////////////////////////////////////////////////////////
;ALL these entries below will be add to boot.hv when hive register is enabled!
;HIVE BOOT SECTION
[HKEY_LOCAL_MACHINE"init"BootVars]
"SYSTEMHIVE"="Documents and Settings""system.hv"
"PROFILEDIR"="Documents and Settings"
"Flags"=dword:3
"DefaultUser"="default"
"RegistryFlags"=dword:1
;----------------------------------------------------------------------------
IF BSP_SUPPORT_BINFS [HKEY_LOCAL_MACHINE"System"StorageManager"AutoLoad"FlashDrv]
"DriverPath"="Drivers""BlockDevice""FlashDrv"
"LoadFlags"=dword:1
"MountFlags"=dword:11
"BootPhase"=dword:0
[HKEY_LOCAL_MACHINE"Drivers"BlockDevice"FlashDrv]
"Prefix"="DSK"
"Dll"="NFLAT_PS.DLL"
"Order"=dword:0
"Ioctl"=dword:4
"Profile"="FlashDrv"
"FriendlyName"="Samsung Flash Driver"
"MountFlags"=dword:11
"BootPhase"=dword:0
[HKEY_LOCAL_MACHINE"System"StorageManager"Profiles"FlashDrv]
"DefaultFileSystem"="BINFS"
"PartitionDriver"="mspart.dll"
"AutoMount"=dword:1
"AutoPart"=dword:1
"MountFlags"=dword:0
"Folder"="BINFS"
"Name"="Samsung Flash Disk"
"BootPhase"=dword:0
"MountAsROM"=dword:1
"MountHidden"=dword:0
"MountPermanent"=dword:0
ENDIF ;BSP_SUPPORT_BINFS
;----------------------------------------------------------------------------
IF BSP_POCKETSTORE
[HKEY_LOCAL_MACHINE"Drivers"BuiltIn"PocketStore]
"Prefix"="DSK"
"Dll"="SSR_PS.dll"
"Order"=dword:1
"Profile"="PocketStore"
"IClass"=multi_sz:"{A4E7EDDA-E575-4252-9D6B-4195D48BB865}"
"BmlVolumeId"=dword:0 ; BML volume ID = 0
"BmlPartitionId"=dword:8 ; BML parition ID = PARTITION_ID_FILESYSTEM
"Index"=dword:2
"Flags"=dword:1000
[HKEY_LOCAL_MACHINE"System"StorageManager"Profiles"PocketStore]
"DefaultFileSystem"="FATFS"
"PartitionDriver"="mspart.dll"
"AutoMount"=dword:1
"AutoPart"=dword:1
"AutoFormat"=dword:1
"MountAsBootable"=dword:1
"Folder"="PocketStore"
"Name"="NandFlash Driver"
"Ioctl"=dword:4
[HKEY_LOCAL_MACHINE"System"StorageManager"Profiles"PocketStore"FATFS]
"MountFlags"=dword:2
"Flags"=dword:00000014
ENDIF BSP_POCKETSTORE
;END HIVE BOOT SECTION
;//////////////////////////////////////////////////////////////////////////////////////
祝大家好运!