michaelcao1980的专栏

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 toDWORD: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

#define MOUNTFLAGS_TYPE_HIDDEN AFS_FLAG_HIDDEN// 1 – Hidden file system#define MOUNTFLAGS_TYPE_BOOTABLE AFS_FLAG_BOOTABLE // 2 – May contain system registry#define MOUNTFLAGS_TYPE_ROOTFS AFS_FLAG_ROOTFS // 4 – Mount as root of file system, "/"#define MOUNTFLAGS_TYPE_HIDEROM AFS_FLAG_HIDEROM // 8 – Hide ROM when mounting FS root; use with FLAG_ROOTFS#define MOUNTFLAGS_TYPE_MOUNTROM AFS_FLAG_MOUNTROM // 16 – Mount the new filesystem as an additional ROM filesystem// The upper 16bits of MountFlags are used by StorageManager#define MOUNTFLAGS_TYPE_NODISMOUNT 0x00010000 // Do not allow dismount of this partition

注册表需要保存到NAND FLASH里面,需要在boot.hv里就加载FAT文件系统来访问

存储在第一个盘里面的system.hv,user.hv. 所以要在注册表中把加载第一部分FAT的项目放在“; HIVE BOOT SECTION” ;items to load“; END HIVE BOOT SECTION”

1. 必须加入HIVE based regiters这个组件到OS(在PB右边的文件系统选项里)

2. 注册表添加,必须将一下部分加入你的注册表中实现hive   ;HIVE BOOT SECTION   [HKEY_LOCAL_MACHINE\init\BootVars]   "SYSTEMHIVE"="Documents and Settings\\system.hv" ;system.hv会保存到\HDD\Documents and Settings\system.hv  ;"PROFILEDIR"="Documents and Settings" ;user.hv会保存到\HDD\Documents and Settings\default\user.hv  "Start DevMgr"=dword:1 ;这个说是启动device.exe,但是wince 5.0好像不用这个   "DefaultUser"="default" ;咱们只有一个用户default,基本上就是决定user.hv的路径了   "Flags"=dword:3 ;这个应该是wince 5.0下决定在哪个阶段启动device.exe的表项   "RegistryFlags"=dword:1 ;这个就是设置注册表每次改动后自动flush到system.hv   ;###########################################################################   ;这个部分是binfs的注册表项,如果你不是用的binfs那么不用将它们拉到boot.hv中   [HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\SMFlash]   "DriverPath"="Drivers\\BlockDevice\\SMFlash"   "LoadFlags"=dword:1   "MountFlags"=dword:11   "BootPhase"=dword:0   "Flags"=dword:1000   [HKEY_LOCAL_MACHINE\Drivers\BlockDevice\SMFlash]   "Prefix"="DSK"   "Dll"="BIBDrv.dll"   "Order"=dword:0   "Ioctl"=dword:4   "Profile"="SMFlash"   "FriendlyName"="Samsung Flash Driver"   "MountFlags"=dword:11   "BootPhase"=dword:0   "Flags"=dword:1000   ; Bind BINFS to the block driver   [HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\SMFlash]   "DefaultFileSystem"="BINFS" ;binfs的路径为/BINFS   "PartitionDriver"="mspart.dll"   "AutoMount"=dword:1   "AutoPart"=dword:1   "MountFlags"=dword:11   "Folder"="ResidentFlash"   "Name"="Samsung Flash Disk"   "BootPhase"=dword:0   "Flags"=dword:1000   "MountHidden"=dword:0   ;###########################################################################   ;###########################################################################   [HKEY_LOCAL_MACHINE\Drivers\BuiltIn\PocketStore]   "Prefix"="DSK"   "Dll"="ONDisk.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 ;这个flag指定这个驱动只在boot.hv中加载一次   [HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\PocketStore]   "DefaultFileSystem"="FATFS"   "PartitionDriver"="mspart.dll"   "AutoMount"=dword:1   "AutoPart"=dword:1   "AutoFormat"=dword:1   "MountAsBootable"=dword:1 ;这个是wince 5.0下指定这个分区保存system.hv的关键   "Folder"="HDD"   "Name"="NAND Drive"   "Ioctl"=dword:4   [HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\PocketStore\FATFS]   "EnableCacheWarm"=dword:0     ENDIF   ;###########################################################################   ;END HIVE BOOT SECTION   ; HIVE BOOT SECTION   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;   ; Support BINFS 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   3. config.bib文件修改   MEMORY   pdwXIPLoc 00000000 803FF000 FIXUPVAR   XIPKERNEL 80200000 001FF000 RAMIMAGE   CHAIN 803FF000 00001000 RESERVED   NK 80400000 01E00000 NANDIMAGE   RAM 80400000 07C00000 RAM   FLASH 92000000 00100000 RESERVED     CONFIG   AUTOSIZE=ON   COMPRESSION=ON   DLLADDR_AUTOSIZE=ON   KERNELFIXUPS=ON   PROFILE=OFF   RAM_AUTOSIZE=OFF   ROMFLAGS=0   ;ROMSIZE=01E00000   ;ROMSTART=800B8000   ;ROMWIDTH=32   ROM_AUTOSIZE=OFF   XIPSCHAIN=803FF000 4. 必须将下列文件加入到XIPKERNEL里   "nk.exe",   "coredll.dll",   "filesys.exe",   "fatfsd.dll",   "diskcache.dll",   "fatutil.dll",   "binfs.dll",   "fsdmgr.dll",   "mspart.dll",   "smflash.dll",   "boot.hv",   加入方法如下:   nk.exe $(_FLATRELEASEDIR)\kern.exe XIPKERNEL SH   其他项类似方法添加.

世界会向那些有目标和远见的人让路(冯两努–香港着名推销商

michaelcao1980的专栏

相关文章:

你感兴趣的文章:

标签云: