S3C2410基于nandflash 的Hive-basedRegistry的实现
Target Board: GEC2410 ( 64MRAM
IDE: Platform Builder5.0
WinCE下面就两种注册表,一种是RAM-based Registry,另外就是Hive-basedRegistry了,缺省用的是前者.既然是RAMbased那么所有的改动都会在断电后蒸发掉。如果想永久保存该怎么办呢,其实再笨你也能想出来,保存到磁盘上不就OK了吗!?对,但是你想如果你把注册表全放到磁盘(SDMMC或HDD或Flash)上WinCE怎么在没有加载你磁盘的驱动的情况下读到注册表呢?而一般情况加载磁盘的驱动程序也是要注册表的支持啊!HIVE想到了这些,看它怎么做,它把注册表分成两部分(其实是三部分,当时大体还是两步分,把user.hv和system.hv 做一部分),第一部分就是叫做boot.hv的注册表,里面的东西就是一些在没有拿到保存在磁盘的注册表之前引导时需要的一些设置,这部分的注册表和RAMbased的是一样的,改了之后断电就没了,所以这部分的注册表项都是不需要改动的,需要改动的都放到第二部分就是了,这第二部分就是system.hv 和user.hv了,也就是一直提到的要放到磁盘上的注册表. 编译的时候PB会根据platform.reg和Common.reg中的标签判断哪些表项放到boot.hv中,这个标签就是;HIVE BOOT SECTION ;END BOOTSECTION,夹在这个标签之间的表项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.youkuaiyun.com/author/fredzeng/c8af2703f82c4e99b00c42f5
下面说一下我是怎么具体实现的。
1,
2,
3,
;HIVE BOOTSECTION
…………………………
;END BOOTSECTION
这一段,把下面的代码替换掉这一段(这一段的我也看不懂,呵呵。摘自:http://www.embedu.cn/redirect.php?fid=30&tid=3401&goto=nextnewset)
; @CESYSGEN IFFILESYS_FSREGHIVE
; HIVE BOOTSECTION
; Valid Bits forFlags registry value
; If no flags areset, the hive will be stored in the object store.
;
;0x00000001
;0x00000002
;0x00000004
;
;0x00000008
;
[HKEY_LOCAL_MACHINE\init\BootVars]
[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"="MSFlash Driver"
; Bind BINFS tothe 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"="MicrosoftFlash Disk"
"BootPhase"=dword:0
; Keep FATFS fromtrying to shadow \Windows
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\FlashDrv\FATFS]
"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
ENDIFTODO
; END HIVE BOOTSECTION
; @CESYSGEN ENDIFFILESYS_FSREGHIVE
4,
5,
总结:在nandflash上开辟一个区出来,用来保存注册表和用户的数据。就想PC挂一个硬盘上去。具体怎么开辟这个区,刚才修改的那段注册表就是命令NK怎么做了,自动开辟了。