技术开发 频道

活用注册表让Windows CE如虎添翼

2.Windows CE注册表的实现方式

  嵌入式系统的特点是小型化,因此一些嵌入式设备是没有外存的。为此Windows CE注册表提供了两种实现方式:基于RAM的注册表(RAM-Based Registry)和基于Hive的注册表(Hive-Based Registry)。在定制内核的时候只能选择其中一种,从理论上讲这两种注册表都能够实现永久保存注册表数据。注册表实现类型对于用户和应用程序来说是透明的,但是采用不同的类型会影响Windows CE的启动顺序和启动速度,还会影响内存的使用量。

  (1)基于RAM的注册表

  基于RAM的注册表,也叫基于对象存储(Object Storage)的注册表。正如其名,基于RAM的注册表把整个注册表作为一个对象存储堆存放在系统的内存中。这意味着如果对系统进行冷启动或者系统断电,对注册表的所有改动都会丢失。优点是使用基于RAM的注册表,对注册表的读写访问操作会变得非常高效。因此,基于RAM的注册表比较适用于没有外部存储,而且有电池保存内存数据(battery-backed RAM)的设备,它适合频繁热启动而不冷启动的设备。

  如果有外存且经常冷启动的设备采用基于RAM的注册表,则需要在系统断电的时候对注册表进行保存,等系统再次启动时再对保存的注册表进行还原。为此,Windows CE提供了两种方法用来断电保存基于RAM的注册表:

  ①第一种方式是在设备关闭前调用RegCopyFile函数,将整个注册表数据以文件形式保存到永久存储器上。Windows CE提供了两个系统API用来保存和还原整个注册表。当要保存和恢复注册表时,先在系统断电的时候调用RegCopyFile函数将整个注册表保存为外存上的一个文件;当系统重新启动时再调用RegRestoreFile函数将文件全部读出RAM中,然后再热启动系统,先前保存的注册表就可以生效了。

  需要注意的是,这时必须多一次热启动才能使恢复的注册表有效。因为只有在系统启动的时候才会去检测RegRestoreFile放在RAM里的注册表信息。但是此方法的缺点是需要两次启动,因此效率相对比较低。

  ②第二种方式是利用OEM函数。这一种方式可以避免前一种方式需要两次启动的缺点。OEM可以在BSP的OAL层中实现WriteRegistryToOEM和ReadRegistryFromOEM两个函数。Windows CE会在系统启动和关闭的时候自动调用这两个函数来保存和恢复注册表。当应用程序调用RegFlushKey函数时,这个函数会调用WriteRegistryToOEM函数写注册表数据到永久存储器上。

  此种方法虽然可以避免两次启动的缺陷,但问题是在内核启动时,调用ReadRegistryFromOEM之前文件系统驱动程序还没加载,因此无法使用CreateFile,ReadFile API来打开、读取文件,而只能使用一些更底层的操作来实现。因此,建议如果要采用基于RAM的注册表保存机制,而且要求永久保存注册表数据,使用第一种方式比较容易实现。

  (2)基于Hive的注册表

  基于Hive的注册表是把注册表数据存放在文件系统的文件上,这种文件被称作蜂箱Hive。这就意味着不再需要在系统断电和启动时进行保存恢复注册表操作。Hive是注册表中的一组键,包括子键、键值、数据,它是保存或者加载注册表数据的单位。

  Hive在文件系统上表现为单个文件,分为:①Boot Hive,包括HKEY_LOCAL_MACHINE, HKEY_CLASSES_ROOT, HKEY_USERS中的所有数据,一般只在启动时使用。②System Hive,包括OEM的HKEY_LOCAL_MACHINE, HKEY_CLASSES_ROOT, HKEY_USERS的所有数据,是指设备范围内不随着用户改变而改变的数据。③User Hive,包括HKEY_CURRENT_USER的所有数据,是指用户特有的设置,每个用户都有一个单独的User.hv。

  基于Hive的Windows CE注册表加载过程可分为两部分:boot.hv和system.hv。前者是启动时的注册表项,后者是系统注册表项。所谓Hive注册表就是先加载boot.hv,把注册表保存所在的存储驱动和文件系统先加载;然后再加载system.hv,也就是从磁盘上去读系统的注册表项。在启动时加载boot.hv的标签是HIVE BOOT SECTION 和END BOOT SECTION。

  基于Hive的注册表适用于有永久存储并且需要经常冷启动的设备。因为基于Hive的注册表把系统数据和用户数据分开存放,这就意味着基于Hive的注册表可以提供多用户支持。例如,为对每个用户提供不同的User.hv,当用户登录时加载相应的User.hv,从而达到多用户目的。
 

0
相关文章