蜂窝注册表和永久存储

来源:互联网 发布:苏联军事实力知乎 编辑:程序博客网 时间:2024/04/28 01:43

 WindowsCE有两种注册表,一种是基于RAM的,一种是基于蜂窝的注册表;WindowsCE会默认使用前者。如果是使用前者,PB在编译的时候会先把common.reg、platform.reg、project.reg及所有的.reg文件的内容合并到reginit.ini文件,然后再将reginit.ini文件压缩成default.fdf的文件,放置到WindowsCE的操作系统映像文件nk.bin中去。在操作系统启动的时候,default.fdf文件会被解压到RAM中形成基于RAM的注册表,既然是基于RAM的注册表,那么对它所有的改变都会在断电后消失。

        如何才能使操作系统运行起来后所有的改动在断电时都不丢失而在以后重新启动时永久保存呢?答案就是利用Flash、DOC、硬盘、SD/MCC等永久存储设备,将修改后的注册表保存到这些永久存储设备上。但是如果把所有注册表都放置到永久存储设备上,那么WindowsCE又怎么能在没有加载存储设备驱动的情况下读到注册表呢?且一般情况下,加载存储设备驱动也需要注册表的支持!那么怎么才能做到呢?这就是蜂窝注册表所想到的。

        蜂窝注册表把WindowsCE的注册表分成两部分,第一部分是称做boot.hv的注册表,里面的东西是一些在没有拿到保存在磁盘注册表之前引导时需要的一些设置,这部分的注册表和基于RAM的一样的,修改之后如果断电没有了,所以这部分的注册表项都是不需要改动的,需要改动的都放到第二部分;第二部分是system.hv和user.hv注册表,也就是一直提到的要放到永久存储设备上的注册表。PB在编译的时候会根据.reg文件中的注释来判断哪些注册表项放到boot.hv中,要放置到boot.hv中的注册表项必须放置到下列注释对之间:

; HIVE BOOT SECTION

.......

......

; END HIVE BOOT SECTION

 

夹在这个注释对之间的注册表项,PB在编译的时候会把它们放置到boot.hv文件中去,其他的注册表项会分别被放置到default.hv和user.hv文件中去。WindowsCE在启动的第一阶段先把所有的.hv文件加载到RAM中,然后打开boot.hv拿到必要的注册表设置,其中包括了如何加载system.hv以及永久存储设备的驱动的注册表设置,所以那些和加载永久存储设备相关的驱动都要放到boot.hv中去,如FAT文件驱动,mspart分区驱动等,有一点需要特别注意的就是如果你的系统使用的是BinFS文件系统,且device.exe位于NK.bin中,那么一定要在操作系统启动的第一阶段保证BinFS文件系统可用,否则系统就不可能从永久存储设备加载system.hv了。

        WindowsCE在启动的时候,永久存储设备上并不存在任何注册表文件(.hv),这个时候WindowsCE会将内存的default.hv和user.hv文件复制到注册表的BootVars键制定的地方,且default.hv往往会被重命名为system.hv,WindowsCE在第二次启动及以后的启动时,会先检查永久存储设备上的.hv文件是不是和RAM中的一致,不一致的话就加载永久存储设备上的注册表项。

        需要注意的是,蜂窝注册表也是在RAM中运行的,不同的是WindowsCE在启动时会到永久存储设备上读取改动的注册表项,因为这样才能保证速度,所以任何对注册表的改动都是在内存中进行的,如果不想办法将内存中的注册表保存到磁盘上,那么这些改动还是会丢失的,通常有两种方法避免丢失,一种方法是通过应用程序调用RegFlushKey函数,另一种方法就是在注册表中将RegistryFlags注册键的值设置为1让系统在每次改动后自动保存注册表。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hao507/archive/2008/10/17/3091495.aspx