WinCE RAM-Based与Hive-Based注册表

 2015-5-25          [nemail]    
[lablebox]

  Windows Embedded CE嵌入式操作系统支持两种不同的注册表类型:RAM-based注册表和Hive-based注册表。

 

  RAM-based注册表将所有注册表信息保存在对象存储(object store)中,对象存储可以看作是WinCE系统在内存中永久的虚拟RAM磁盘,因此要保存注册表信息,需要把注册表转存到具有掉电保护的RAM介质中,为此CE提供了转存及恢复注册表的底层函数。如果没有对注册表进行这样的转存及恢复,则系统总是使用缺省的注册表。

 

  Hive-based注册表将注册表数据存储为文件,注册表文件可以存储在任何文件系统中。将注册表存储在非易失的存储介质上(比如Flash),就不需要类似RAM-based注册表的备份与恢复操作。

 

  RAM-based注册表通常用在总是使用热启动,很少甚至从不冷启动的系统中,Windows Embedded CE6.0及以后版本,默认采用Hive-based注册表,英创公司的WinCE系列工控主板默认使用Hive-based注册表,注册表文件存储在NandFlash中。

 

  WinCE在系统启动过程中会在注册表里添加信息,最典型的就是在注册表中生成驱动的Active 项,如果是Hive-based注册表,则意味着WinCE在整个启动过程中会不停写盘,在大多数情况下这没有任何问题,但如果系统使用环境供电不稳定,在系统启动过程中频繁断电,则有可能导致注册表损坏。而对RAM-based注册表,每次系统启动时都会将内核中的默认注册表加载到RAM中,系统启动过种中生成的注册表信息也写在RAM中,因此不会有注册表被写坏的问题。所以从启动的可靠性来看,RAM-based的注册表方式优于Hive-based注册表方式。

 

  为了提高主板的可靠性,我们在BSP中增加了支持RAM-based注册表的底层转存及恢复功能。所设计的转存及恢复功能,主要是针对那些在实际的应用中,必须保存的相关信息。比如触摸屏较准参数,网络参数等。为此我们对内核进行了更新,新的内核在采用RAM-based注册表同时,也能保存一些必要的注册表数据。

 

  英创WinCE RAM-based注册表版本内核目前能保存以下注册表信息:

 



注册表功能

注册表

1

 触摸屏校准参数 [HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\TOUCH]
  'CalibrationData'=''

2

 网络1参数 [HKEY_LOCAL_MACHINE\Comm\ENET1\Parms\TcpIp]
  'EnableDHCP'=dword:0
  'UseZeroBroadcast'=dword:0
  'DefaultGateway'='192.168.201.19'
  'IpAddress'='192.168.201.213'
  'Subnetmask'='255.255.255.0'
  'DNS'='61.139.2.69'

3

 网络2参数 [HKEY_LOCAL_MACHINE\Comm\ENET2\Parms\TcpIp]
  'EnableDHCP'=dword:0
  'UseZeroBroadcast'=dword:0
  'DefaultGateway'='192.168.201.19'
  'IpAddress'='192.168.201.213'
  'Subnetmask'='255.255.255.0'
  'DNS'='61.139.2.69'

3

 系统语言设置 [HKEY_LOCAL_MACHINE\MUI]
  'SysLang'=dword:804
 [HKEY_LOCAL_MACHINE\MUI]
  'DefaultLCID'=dword:804
 [HKEY_CURRENT_USER\MUI]
  'CurLang'=dword:804


表1

 

  使用RAM-based注册表时,无论是由控制面板、远程注册表工具或通过程序代码直接修改了上面例出的注册表项后,都需要调用RegFlushKey函数才能真正保存注册表信息。下面是示例代码:

 

  HKEY hOpenKey;
    // 打开任意注册表键
  
  RegOpenKeyEx (HKEY_LOCAL_MACHINE, L'HARDWARE\\DEVICEMAP\\TOUCH', 0, 0, &hOpenKey);
    // 调用RegFlushKey会触发系统保存注册表
  
  RegFlushKey( hOpenKey );
    // 关闭打开的注册表
  
  RegCloseKey( hOpenKey);

 

  我们将上面代码封装成了一个小工具RegFlushKey,放在系统的控制面板中,方便调试时使用。比如用户通过控制面板的笔针工具较准完触摸屏后,再点击运行一次RegFlushKey,触摸屏较准数据就保存了。

 

图1

 

  根据用户实际需求,我们会不断添加保存的注册表项,本文档表1也会同步更新。

 

  与hive-based注册表相比,使用RAM-based注册表还有些需要注意的地方,比如“拨号连接”。在hive注册表的系统中,通过控制面板或英创提供的RasEntry程序新建拨号连接后,对应的注册表就已经自动保存了,系统断电重启不会丢失,因此在hive注册表情况下,拨号连接只需要建立一次。而RAM-based注册表不能保存这些信息,所以系统每次启动后都需要新建拨号连接。

[lablebox]