修改注册表实现HIVE

基础知识: 

Hive的机制就是把注册表放在磁盘里的保存,这样就可以做到掉电不丢失数据. 磁盘可以是SD卡或flash等设备. 但是这样我们会马上想到一个问题,加载这些磁盘的驱动也是要读注册表的,好像遇到了鸡生蛋,蛋生鸡的问题. 微软解决这个问题的方法是把注册表分为两部分,第一个叫做boot.hv注册表. 里面放加载保存到磁盘上那部分注册表之前要引导的一些设置,比如磁盘的驱动信息. 

1.       基于hive的注册表包含三部分:引导hive,系统hive和用户hive,分别对应于boot.hv,system.hv和user.hv。Boot.hv主要用于系统引导时候所需的注册表设置,这部分设置不会被保存在flash或者磁盘上面,也就是说,在系统掉电以后就会丢失。实际上,这部分应该说是属于RAM-Based注册表,由于这部分数据不需要改动,所以也就无所谓了。System.hv存放关于系统的注册表设置,user.hv存放和用户相关的注册表设置。

 

2.      在PB编译WinCE系统的时候,Platform Builder会根据common.reg和platform.reg文件中的注释标签来判断哪些注册表设置放入boot.hv中,凡是在注释标签”;HIVE BOOT SECTON”和”;END HIVE BOOT SECTION”之间的设置都会被放入boot.hv中,其他的都会放到default.hv和user.hv中。

 

 

3.      [HKEY_LOCAL_MACHINE\init\BootVars]

"SystemHive"="\\NandFlash\\system.hv"

"ProfileDir"=\\NandFlash\\user.hv

"DefaultUser"= “default

"Flags"=dword:1

"RegistryFlags"=dword:1

 

DefaultUser:默认加载的用户HIVE文件。

“SystemHive”用来设置system.hv存放的位置,这里存放在NandFlash磁盘的根目录下面。

“ProfileDir”用来设置user.hv存放的位置,这里存放在NandFlash磁盘的根目录下面。

“Flags”用来设置是否立刻启动Device Manager,主要是为了启动Hive-Based所需的存储设备。

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

 

4.      修改磁盘设备驱动的配置

为相关的磁盘驱动添加支持Hive的设置,如下:

[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\NANDFlash]

"Flags"=dword:1000

; 0x00000001   Start storage manager in boot phase 1 for hive-based

registry

; 0x00000002   Start device manager in boot phase 1 for hive-based

registry

; 0x00000004   Start storage manager in boot phase 1 for registry in

;              external ROM (such as BINFS)

; 0x00000008   Start device manager in boot phase 1 for registry in

;              external ROM (such as BINFS)

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

这个标志位告诉设备管理器在系统启动的第一阶段(boot registry)加载此驱动,这样,在系统启动的第二阶段(加载system registry)的时候就不会第二次来加载此驱动,这样可以防止此驱动被加载两次,我的系统的nandflash驱动就需要在系统启动的第一阶段被加载,因为nandflash需要先加载起来,后面才能把加载的system.hv和user.hv保存在挂载于nandflash的分区中。

由于Hive注册表会被保存在NandFlash中,所以将”Flags”的设置添加到了NandFlash设备驱动的注册表设置中。上面的设置只有在使用HIVE-Based注册表的时候需要,如果不是用Hive注册表,需要注释掉。

 

5.      添加Storage Manager的相关配置

[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\<ProfileName>\<FileSystemName>]

"MountBootable"=dword:1

同样,在使用HIVE注册表的时候需要上述设置,如果不是使用HIVE注册表,则注释掉就可以了。

6.      platform.reg会覆盖common.reg

7.      [HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\MSFlash]

   "Name"="NAND FLASH"

   "Folder"="NANDFlash"

    "AutoPart"=dword:1

   "AutoFormat"=dword:1

   "PartitionDriver"="flashpart.dll"

"MountAsBootable"=dword:1

Folder:挂载的目录名

NameSTOREINFO (StorageManager) 结构体的.szStoreName成员变量值

[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\HDProfile]

在Profiles下有两种存储设备

[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\NAND_Flash]

   "Profile"="MSFlash"

   "IClass"=multi_sz:"{A4E7EDDA-E575-4252-9D6B-4195D48BB865}",

                    "{8DD679CE-8AB4-43c8-A14A-EA4963FAA715}"

   "Order"=dword:0

   "FriendlyName"="Freescale NAND FLASH Driver"

   "Dll"="flashmdd.dll"

   "FlashPddDll"="flashpdd_nand.dll"

   "Prefix"="DSK"

    "Flags"=dword:1000

初始化存储设备,它是MSFlash

 

 

实现:

1.      添加组件,有RAM and ROM File System、Hive-based registry、Binary Rom Image File System

2.      增加组件需要先clear sysgen 然后在build current BSP and subproject

3.       在platform.reg中进行修改、添加成

;------------------------------------------------------------------------------
; Hive Registry Configuration
;
; @CESYSGEN IF FILESYS_FSREGHIVE
; HIVE BOOT SECTION


; BootVars Flags:
; 1 = Start Storage Manager in boot phase 1 for hive-based registry.
; 2 = Start Device Manager in boot phase 1 for hive-based registry.
; 4 = Start Storage Manager in boot phase 1 for registry in external
;     ROM (e.g., BINFS).
; 8 = Start Device Manager in boot phase 1 for registry in external
;     ROM (e.g., BINFS).
;
; We use 1 so that we launch only the Storage Manager in boot phase 1 


using
; the hive-based registry. This avoids any potential startup conflicts 


with
; having both the Storage Manager and Device Manager running during 


boot
; phase one.
;
[HKEY_LOCAL_MACHINE\init\BootVars]
    "Flags"=dword:3
    "RegistryFlags"=dword:0
    "DefaultUser"="default"


; END HIVE BOOT SECTION
; @CESYSGEN ENDIF FILESYS_FSREGHIVE
;------------------------------------------------------------------------------

4.       .dat文件中增加环境变量

set FILESYS_FSREGHIVE=1

set PRJ_ENABLE_REGFLUSH_THREAD=1


转自CSDN:http://blog.csdn.net/menglongcaiying/article/details/7458536

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值