wince Hive注册表实现机制

WinCE下的注册表可以分为两种,一种是RAM based,另外一种是HIVE based了.这要根据你在PB里添加的是哪种配置. 用PB向导新建的WinCE工程文件默认会用RAM based. Hive 注册表可以实现掉电不丢失数据.那它是如何实现这种机制的呢. RAM based 注册表因为是把信息保存在内存中的,所以掉电之后信息会丢失(现在有很多消费电子类产品用后备电池在主电源切断后继续给内存供电以实现保存数据). Hive的机制就是把注册表放在磁盘里的保存,这样就可以做到掉电不丢失数据. 磁盘可以是SD卡或flash等设备. 但是这样我们会马上想到一个问题,加载这些磁盘的驱动也是要读注册表的,好像遇到了鸡生蛋,蛋生鸡的问题. 微软解决这个问题的方法是把注册表分为两部分,第一个叫做boot.hv注册表. 里面放加载保存到磁盘上那部分注册表之前要引导的一些设置,比如磁盘的驱动信息. 

Wince下设置hive注册表的方法,网上有不少, 我下面的这篇文章都是前人的成果,以及我在msdn上查到的一些相关资料, 我在板子上实际操作验证过. 

下面所有的操作都是在platform.reg下的完成的. 

1. Add the Hive-based Registry Catalog item to your OS design. 


2. 保证将包含系统HIVE的文件系统驱动程序的注册表信息和存储设备的驱动程序的注册表信息包含在下面的命令中.

; HIVE BOOT SECTION

<your registry settings>

; END HIVE BOOT SECTION

这句话的意思是, 下面所有的设置都必须包含在

; HIVE BOOT SECTION

; END HIVE BOOT SECTION

这两行语句中, 你不要以为它已经注释掉,不起作用了. 前面提到为了实现hive,

注册表被分成了两部分, 一部分是boot.hv,包含在这两行语句的配置,就是这个所谓的boot.hv了. 


3. Verify the following registry settings in the Platform.reg file for your OS design. 

[HKEY_LOCAL_MACHINE\init\BootVars]

"SystemHive"="<your system hive location>"

"Start DevMgr"=dword:<your value>

"DefaultUser"="<username>"//这个一般设置成default就行了.

  "RegistryFlags"=dword:1

下面对各个项做解释. 

如果你用"Documents and Settings\\system.hv", hiv e注册表会保存在\HDD\Documents and Settings\system.hv, 所以,如果你想它保存在flash, 就要"SYSTEMHIVE"="NAND Flash\\system.hv" 或者 "SYSTEMHIVE"=” system.hv"(在platform.reg里设置, 如果是第二种写法, 系统会根据其它注册表的键值判断文件系统的类型)


Start DevMgr这个值决定了,加不加载device.exe, 一般情况下,都是把hive注册表放在ram外, 所以要加载, 所以一般为1

"DefaultUser" Set the following registry value in the Platform.reg file for your OS design to determine the default hive to load. 

"RegistryFlags “ HIVE注册表也是在内存中运行的,不同的是启动的时候会从磁盘上去读改动的表项,因为这样才能保证速度,所以你做的的注册表改动也是在内存中做的,这个时候如果你不掉用FlushRegister去将内存中的数值保存到磁盘上那么这些改动还是会丢失的。正常情况下,CE能够保证重要的注册表数据能够从内存刷到(Flush)永久存储器上。但是这并不能完全保证所有数据都能完整地保存而不丢失,所以要保证万无一失,应该主动地调用RegFlushKey函数强制将内存中的数据刷到永久存储器上。这个函数的参数只有一个,就是注册表分支。CE还增加一个上面registryFlags这个注册表项它的作用是每当函数RegCloseKey被调用时都自动调用RegFlushKey函数。  


4 Set the following flag bit on each driver that is loaded during the first boot phase. 

[HKEY_LOCAL_MACHINE\Drivers\...]

"Flags"=dword:1000

这个标志是一个位掩码,它可以和其它已经存在的"Flags"或运算。值1000表示此驱动程序只加载一次,这样device.exe就不会把当前驱动程序加载两次了。 如果是要把注册表保存在flash里, 在nandflash的相关驱动中添加"flags"=dword:1000. 举个例子:

[HKEY_LOCAL_MACHINE\Drivers\BlockDevice\FlashDrv]

  "Prefix"="DSK"

  "Dll"="FLASHDRV.dll"

  "Order"=dword:0

  "Ioctl"=dword:4

  "Profile"="FlashDrv"

  "FriendlyName"="MS Flash Driver"

  "MountFlags"=dword:11

  "BootPhase"=dword:1

  "Flags"=dword:1000

  

5. 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

//比如,如果是放在nand flash中, 路径就应该是这样的.

[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\NandMSFlash\FATFS]

当然,最后一项说明用的文件系统是FAT, 如果你用bins作为文件系统, 就是下面这样

[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\NandMSFlash\BINS]

如果是放在硬盘里, 路径是这样的.

[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\HDProfile]

虽然pb5.0的关于hive的帮助中说在相关的注册表项中添加mountflag=dword:2,但mountflag的值在ce5.0下是忽视的,具体查看相关文档。所以要使"MountAsBootable"=dword:1, 实际做的时候,先用mounflag,如果不行就用mountasbootable.


下面是一个可用的hive注册表的配置:

;------------------------------HIVE---------------------------------------

; HIVE BOOT SECTION

[HKEY_LOCAL_MACHINE\init\BootVars]

   "SYSTEMHIVE"="system.hv"

   "Start DevMgr"=dword:1

   "RegistryFlags"=dword:1


[HKEY_LOCAL_MACHINE\init\BootVars]

   "DefaultUser"="default"


[HKEY_LOCAL_MACHINE\Drivers\BlockDevice\FlashDrv]

  "Prefix"="DSK"

  "Dll"="FLASHDRV.dll"

  "Order"=dword:0

  "Ioctl"=dword:4

  "Profile"="FlashDrv"

  "FriendlyName"="MS Flash Driver"

  "MountFlags"=dword:11

  "BootPhase"=dword:1

  "Flags"=dword:1000


[HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\FlashDrv]

  "DriverPath"="Drivers\\BlockDevice\\FlashDrv"

  "LoadFlags"=dword:1

  "MountFlags"=dword:11

  "BootPhase"=dword:1

  "Flags"=dword:1000


[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\FlashDrv]

  "DefaultFileSystem"="FATFS"

  "PartitionDriver"="mspart.dll"

  "AutoMount"=dword:1

  "AutoPart"=dword:1

  "AutoFormat"=dword:1

  "Folder"="ResidentFlash"

  "Name"="Microsoft Flash Disk"

  "BootPhase"=dword:0

  "Flags"=dword:1000


[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\FlashDrv\FATFS]

  "FriendlyName"="FAT FileSystem"

  "Dll"="fatfsd.dll"

  "Flags"=dword:00280014

  "Paging"=dword:1

  "CacheSize"=dword:0

  "EnableCacheWarm"=dword:0

  "EnableCache"=dword:1

  "MountFlags"=dword:2

; END HIVE BOOT SECTION

;------------------------------HIVE---------------------------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值