4712|7

75

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于wince hive-based registry [复制链接]

我在wince PB上添加了hive-based registry,烧入板子后就不能正常启动了,请问这是什么原因呢?

最新回复

WinCE下面就两种注册表,一种是RAM-based Registry,另外就是Hive-based Registry了,缺省用的是前者.既然是RAM based那么所有的改动都会在断电后蒸发掉。如果想永久保存该怎么办呢,其实再笨你也能想出来,保存到磁盘上不就OK了吗!?对,但是你想如果你把注册表全放到磁盘(SDMMC或HDD或Flash)上WinCE怎么在没有加载你磁盘的驱动的情况下读到注册表呢?而一般情况加载磁盘的驱动程序也是要注册表的支持啊!HIVE想到了这些,看它怎么做,它把注册表分成两部分(其实是三部分,当时大体还是两步分,把user.hv和system.hv 做一部分),第一部分就是叫做boot.hv的注册表,里面的东西就是一些在没有拿到保存在磁盘的注册表之前引导时需要的一些设置,这部分的注册表和 RAM based的是一样的,改了之后断电就没了,所以这部分的注册表项都是不需要改动的,需要改动的都放到第二部分就是了,这第二部分就是system.hv 和user.hv了,也就是一直提到的要放到磁盘上的注册表. 编译的时候PB会根据platform.reg和Common.reg中的标签判断哪些表项放到boot.hv中,这个标签就是;HIVE BOOT SECTION ;END BOOT SECTION,夹在这个标签之间的表项PB在编译的时候会把它们塞到boot.hv中去,其他的内容会分别塞到default.hv和user.hv中去,最后 会把这三个hv文件统统塞到XIPKERNEL中去,这样WinCE在引导的第一阶段就把所有的hv扔到RAM中去了,然后打开boot.hv拿到必要的资料,这其中包括如何加载放置system.hv的磁盘的驱动,所以那些和加载这个磁盘相关的驱动要统统放到boot.hv中,比如FAT文件系统驱动, mspart分区驱动等等,这里有一点很重要就是假如你用binfs而且device.exe在NK.bin中,那么一定在第一阶段要保证binfs可用,否则这里就不可能为system.hv创造条件了。WinCE第一次启动时候磁盘上没有东东,这个时候WinCE会将内存中的default.hv和 user.hv复制到注册表BootVars指定的地方,default.hv往往会被重命名为system.hv,第二次启动会先检查磁盘上的hv是不是和内存中的一致,不一致就加载磁盘上的表项。整个过程就是这样子,但要注意一点,HIVE注册表也是在内存中运行的,不同的是启动的时候会从磁盘上去读改动的表项,因为这样才能保证速度,所以你做的的注册表改动也是在内存中做的,这个时候如果你不掉用FlushRegister去将内存中的数值保存到磁盘上那么这些改动还是会丢失的。两种方法来避免丢失,一种是认为去调用FlushRegister,令一种就设置一个flag让WinCE在每次改动注册表后自动 Flush. 以上说明摘自:http://dev.eeworld.net/author/fredzeng/c8af2703f82c4e99b00c42f55c898d3a.html 下面说一下我是怎么具体实现的。 1,  在PB 的Catalog 把Hive-based Registry拖进去(Hive-based Registry的具体位置不用说了吧!)。当然 Binary Rom Image File System也要拖进去(默认的情况下已经有了) 2,  把Storage Manager 下的FAT File System拖进去。因为是基于nandflash的,所以要FAT支持。 3,  打开platform.reg ,找到 ;HIVE BOOT SECTION ………………………… ;END BOOT SECTION 这一段,把下面的代码替换掉这一段(这一段的我也看不懂,呵呵。摘自:http://www.embedu.cn/redirect.php?fid=30&tid=3401&goto=nextnewset) ; @CESYSGEN IF FILESYS_FSREGHIVE ; HIVE BOOT SECTION ; Valid Bits for Flags registry value ; If no flags are set, the hive will be stored in the object store. ; ; 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) [HKEY_LOCAL_MACHINE\init\BootVars]    "SystemHive"="system.hv"   "DefaultUser"="default"   "Flags"=dword:3   "RegistryFlags"=dword:1 [HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\FlashDrv] "DriverPath"="Drivers\\BuiltIn\\FlashDrv" "LoadFlags"=dword:1 "BootPhase"=dword:0 "Flags"=dword:1000 [HKEY_LOCAL_MACHINE\Drivers\BuiltIn\FlashDrv] "Prefix"="DSK" "Dll"="FLASHDRV.dll" "Order"=dword:0 "Ioctl"=dword:4 "Profile"="FlashDrv" "FriendlyName"="MS Flash Driver"   "IClass"=multi_sz:"{A4E7EDDA-E575-4252-9D6B-4195D48BB865}" ; Bind BINFS to the block driver [HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\FlashDrv] "DefaultFileSystem"="FATFS" "PartitionDriver"="mspart.dll" "AutoMount"=dword:1 "AutoPart"=dword:1 "AutoFormat"=dword:1 "MountAsBootable"=dword:1 "Flags"=dword:1000 "Folder"="ResidentFlash" "Name"="Microsoft Flash Disk" "BootPhase"=dword:0 ; Keep FATFS from trying to shadow \Windows [HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\FlashDrv\FATFS]   "Flags"=dword:00000024 "EnableCacheWarm"=dword:0 [HKEY_LOCAL_MACHINE\System\StorageManager\FATFS] "FriendlyName"="FAT FileSystem" "Dll"="fatfsd.dll" "Flags"=dword:00000064 "Paging"=dword:1 "EnableCache"=dword:1 "CacheSize"=dword:0 IF TODO [HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\Relfsd] "Dll"="relfsd.dll" "Paging"=dword:0 "LoadFlags"=dword:1 ENDIF TODO ; END HIVE BOOT SECTION ; @CESYSGEN ENDIF FILESYS_FSREGHIVE 4,  接下来重新build一次   详情 回复 发表于 2008-5-28 14:19
点赞 关注

回复
举报

82

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
要实现hive-based registry功能,不是简单的把这个component添加进去就可以的,还需要做很多设置。
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
楼上的能具体说下吗?
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

4
 
顶上去!!!
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

5
 
楼主可以到PB的帮助里搜一下:
ms-help://MS.WindowsCE.500/wcedata5/html/wce50conUsingtheHiveBasedRegistry.htm
内容还挺多的
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

6
 
我照着上面的去做了,可是,可是还是不行啊!是什么原因呢?
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

7
 
问题解决了,原来我用的wince4.2的bsp包在5.0的pb上添加,不过为什么4.2的bsp包就不能在5.0上实现这些功能呢?
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

8
 
WinCE下面就两种注册表,一种是RAM-based Registry,另外就是Hive-based Registry了,缺省用的是前者.既然是RAM based那么所有的改动都会在断电后蒸发掉。如果想永久保存该怎么办呢,其实再笨你也能想出来,保存到磁盘上不就OK了吗!?对,但是你想如果你把注册表全放到磁盘(SDMMC或HDD或Flash)上WinCE怎么在没有加载你磁盘的驱动的情况下读到注册表呢?而一般情况加载磁盘的驱动程序也是要注册表的支持啊!HIVE想到了这些,看它怎么做,它把注册表分成两部分(其实是三部分,当时大体还是两步分,把user.hv和system.hv 做一部分),第一部分就是叫做boot.hv的注册表,里面的东西就是一些在没有拿到保存在磁盘的注册表之前引导时需要的一些设置,这部分的注册表和 RAM based的是一样的,改了之后断电就没了,所以这部分的注册表项都是不需要改动的,需要改动的都放到第二部分就是了,这第二部分就是system.hv 和user.hv了,也就是一直提到的要放到磁盘上的注册表. 编译的时候PB会根据platform.reg和Common.reg中的标签判断哪些表项放到boot.hv中,这个标签就是;HIVE BOOT SECTION ;END BOOT SECTION,夹在这个标签之间的表项PB在编译的时候会把它们塞到boot.hv中去,其他的内容会分别塞到default.hv和user.hv中去,最后 会把这三个hv文件统统塞到XIPKERNEL中去,这样WinCE在引导的第一阶段就把所有的hv扔到RAM中去了,然后打开boot.hv拿到必要的资料,这其中包括如何加载放置system.hv的磁盘的驱动,所以那些和加载这个磁盘相关的驱动要统统放到boot.hv中,比如FAT文件系统驱动, mspart分区驱动等等,这里有一点很重要就是假如你用binfs而且device.exe在NK.bin中,那么一定在第一阶段要保证binfs可用,否则这里就不可能为system.hv创造条件了。WinCE第一次启动时候磁盘上没有东东,这个时候WinCE会将内存中的default.hv和 user.hv复制到注册表BootVars指定的地方,default.hv往往会被重命名为system.hv,第二次启动会先检查磁盘上的hv是不是和内存中的一致,不一致就加载磁盘上的表项。整个过程就是这样子,但要注意一点,HIVE注册表也是在内存中运行的,不同的是启动的时候会从磁盘上去读改动的表项,因为这样才能保证速度,所以你做的的注册表改动也是在内存中做的,这个时候如果你不掉用FlushRegister去将内存中的数值保存到磁盘上那么这些改动还是会丢失的。两种方法来避免丢失,一种是认为去调用FlushRegister,令一种就设置一个flag让WinCE在每次改动注册表后自动 Flush.

以上说明摘自:http://dev.eeworld.net/author/fredzeng/c8af2703f82c4e99b00c42f55c898d3a.html

下面说一下我是怎么具体实现的。

1,  在PB 的Catalog 把Hive-based Registry拖进去(Hive-based Registry的具体位置不用说了吧!)。当然 Binary Rom Image File System也要拖进去(默认的情况下已经有了)

2,  把Storage Manager 下的FAT File System拖进去。因为是基于nandflash的,所以要FAT支持。

3,  打开platform.reg ,找到

;HIVE BOOT SECTION

…………………………

;END BOOT SECTION

这一段,把下面的代码替换掉这一段(这一段的我也看不懂,呵呵。摘自:http://www.embedu.cn/redirect.php?fid=30&tid=3401&goto=nextnewset)

; @CESYSGEN IF FILESYS_FSREGHIVE

; HIVE BOOT SECTION

; Valid Bits for Flags registry value

; If no flags are set, the hive will be stored in the object store.

;

; 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)

[HKEY_LOCAL_MACHINE\init\BootVars]

   "SystemHive"="system.hv"

  "DefaultUser"="default"

  "Flags"=dword:3

  "RegistryFlags"=dword:1



[HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\FlashDrv]

"DriverPath"="Drivers\\BuiltIn\\FlashDrv"

"LoadFlags"=dword:1

"BootPhase"=dword:0

"Flags"=dword:1000



[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\FlashDrv]

"Prefix"="DSK"

"Dll"="FLASHDRV.dll"

"Order"=dword:0

"Ioctl"=dword:4

"Profile"="FlashDrv"

"FriendlyName"="MS Flash Driver"

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

; Bind BINFS to the block driver

[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\FlashDrv]

"DefaultFileSystem"="FATFS"

"PartitionDriver"="mspart.dll"

"AutoMount"=dword:1

"AutoPart"=dword:1

"AutoFormat"=dword:1

"MountAsBootable"=dword:1

"Flags"=dword:1000

"Folder"="ResidentFlash"

"Name"="Microsoft Flash Disk"

"BootPhase"=dword:0

; Keep FATFS from trying to shadow \Windows

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

  "Flags"=dword:00000024

"EnableCacheWarm"=dword:0

[HKEY_LOCAL_MACHINE\System\StorageManager\FATFS]

"FriendlyName"="FAT FileSystem"

"Dll"="fatfsd.dll"

"Flags"=dword:00000064

"Paging"=dword:1

"EnableCache"=dword:1

"CacheSize"=dword:0

IF TODO

[HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\Relfsd]

"Dll"="relfsd.dll"

"Paging"=dword:0

"LoadFlags"=dword:1

ENDIF TODO

; END HIVE BOOT SECTION

; @CESYSGEN ENDIF FILESYS_FSREGHIVE

4,  接下来重新build一次

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表