基于智能手机嵌入式操作系统的注册表CMOS实现方案


打开文本图片集

【摘要】文章重点阐述了智能手机系统注册表配置文件的生成和配置模块的建立,介绍了掉电保护所用到的注册表信息,同时给出了注册表系统向应用提供的API接口函数。

【关键词】智能手机 注册表 CMOS 掉电保护 API

1 引言

伴随着计算机技术、通信技术和微电子技术的高速发展,以及传统家电向信息家电的过渡,嵌入式技术的应用达到了前所未有的高度。同时由于手持通信设备市场的快速发展,手机的功能逐渐增多,现在手机已经不只是用于语音通信,而是集成了短信、彩信、上网与移动办公等附加功能的嵌入式通信平台。

本文主要介绍一种智能手机系统注册表设置模块的设计与实现方案,该模块的开发在Windows仿真环境下进行。智能手机在现今有大力发展和流行的趋势,本设计开发具有较大的市场价值。

2 注册表实现概述

普通智能手机的注册表原来是用数据库实现的,现在要改为用CMOS来实现,具体的做法是,用两块大小为64K的FLASH块来模拟CMOS,在此基础上实现注册表的管理,直接从FLASH驱动层做起。

注册表的记录改变了传统的Windows的做法,采用一种简化的方法,不分目录级,由一个主键加一个键值构成。其主键是一个null结束的字符串,可以包含目录信息,如可以写成“\APP\WINDOW\POSITION\X”;考虑到查找的方便性,主键字串必须用大写,并且以“\”开始。键值有三种类别,分别是DWORD、Binary、String,其中DWORD占4字节,String是null结束的字符串,Binary由一个4字节的Size加上内容构成。考虑到Flash的读写特性以及可移植性,整个记录信息向4字节对齐,并用0填充冗余各位。

数据整体结构用作注册表的大小为64K,另外的64K是为了擦写时备份用的。整个64K空间分成两大块,即索引块和数据块,其中索引块大小为4K,数据块为60K。整体结构如图1所示:

索引块由32字节的HEAD和一个偏移表构成,HEAD由一个4字节的片选字加一个28字节的保留位构成,保留位建议填写成“CMOS VER1.0”,片选字作为擦除时掉电保护用。偏移表的每项占4字节,共有1016项,每个偏移项由低28bits的偏移值和高4bits标志位构成,标志位作为增加和修改时掉电保护用。索引块结构如图2所示:

数据块由一个接一个变长的记录构成,每个记录内容向4字节对齐,并用0填充冗余各位。记录由4字节控制字段+4字节CHECKSUM+主键+键值构成。数据块结构如图3所示:

其中:控制字段=28bits SIZE+4bits FLAG。SIZE是低28位,即物理的前28位,它表示整个记录的大小,包括自身及CHECKSUM、主键、键值等;FLAG是高4位,即物理的后4位,表明键值的属性,同时用来作为掉电保护的判断标志,关于掉电保护在后面详细介绍。FLAG=0xE表示键值为DWORD;FLAG=0xC表示键值为Binary;FLAG=0x8表示键值为String;FLAG=其他表示写入控制字段时掉电,此时SIZE不可靠,整个数据块应该丢弃这四个字节。值得注意的是,FLAG的各个标志的定义最好不要更改,这涉及到掉电保护。

CHECKSUM是查找时加速用的,是主键转换成大写后产生的,算法可以自己定义,结束标志0不参与CHECKSUM的生成运算。查找时用户输入必须是全路径,大小写不敏感,但要以“\”开头。程序必须将用户输入转换成大写,这一点很重要,否则CHECKSUM就无效。

主键归一化成为:大写,“\”开头,“0”结束,以便查找。键值根据FLAG的不同,表示不同的含义。要说明的是,当FALG等于0xC时,键值为Binary,此时,键值=4字节SIZE+Binary值。另外,记录信息向4字节对齐,并用0填充冗余各位,在解析时要特别注意。

3 关于掉电保护信息

以上描述的是整个数据结构,下面论述掉电保护所用到的信息。掉电保护要做好,有两个必要条件,一是系统启动后在初始化时,有能力知道上次关机是正常关机还是异常掉电关机;二是系统在任何时候突然掉电,有能力追溯到掉电前的资料信息。

注册表系统用于掉电保护的信息有三处,分别是片选字、偏移表项的标志位、记录控制字段的FLAG。片选字共有两块64K的Flash,每块最前面的4字节是片选信息,正常情况下,正在使用的那一块(记A)片选信息写着00 00 00 C0,另外一块(记B)则写着FF FF FF FF,并且B是一个擦除过的很干净的空块。A其余的可能的取值是00 00 00 80,B其余的可能的取值是00 00 00 F0和00 00 00 E0,这一点和FMM中的用法基本相同。当A写满时需要整理,会运行一个整理流程,会用到这些取值。

偏移表项的标志位由每个偏移表项低28bits的偏移值和高4bits标志位构成,其中标志位正常的取值是0xC0表示有效,0x8表示已删除;其余的可能的取值是0xF表示空闲或者正在写,0xE表示刚刚修改完。对注册表的增加、修改、删除都会用到这些取值。

记录控制字的FLAG是由每个记录控制字低28bits的SIZE和高4bits的FLAG构成,FLAG的取值如前所述,为其他的取值时SIZE不可靠,整个数据块应该丢弃这4个字节,下一个偏移表项的取值应该而且仅仅只是越过这4个字节。对注册表的增加、修改、删除等操作,会用到这个FLAG,它和偏移表项的标志位一起,共同完成这几种操作的掉电保护。

4 实现流程API接口

注册表系统向应用提供的API接口有4个:RegCreateKey(),创建;RegDeleteKey(),删除;RegQueryValueEx(),查询;RegSetValue(),设置。函数接口定义如下:

(1)创建

LONG RegCreateKey(LPCTSTR lpKey,

DWORD dwType,

LPCTSTR lpData,

DWORD cbData);

功能:创建一个主键。

输入:

LPCTSTR lpKey:主键字串,必须是全路径的,大小写不敏感;

DWORD dwType:类别信息;

LPCTSTR lpData:默认键值数据指针;

DWORD cbData:默认键值数据长度。

输出:成功是返回REG_ERROR_SUCCESS,否则返回REG_ERROR_INPUT。

(2)删除

LONG RegDeleteKey(LPCTSTR lpKey);

功能:删除一个主键。

输入:LPCTSTR lpKey,主键字串,必须是全路径的,大小写不敏感。

输出:成功是返回REG_ERROR_SUCCESS,否则返回REG_ERROR_INPUT。

(3)查询

LONG RegQueryValueEx(LPCTSTR lpKey,

LPDWORD lpType,

LPBYTE lpData,

LPDWORD lpcbData);

功能:查询一个主键信息,包括类别和键值。

输入:

LPCTSTR lpKey:主键字串,必须是全路径的,大小写不敏感;

LPCTSTR lpData:键值数据指针;

DWORD cbData:键值数据长度。

输出:

DWORD dwType:类别信息;

LPCTSTR lpData:键值数据;

成功是返回REG_ERROR_SUCCESS,否则返回REG_ERROR_INPUT。

(4)设置

LONG RegSetValue(LPCTSTR lpKey,

DWORD dwType,

LPCTSTR lpData,

DWORD cbData);

功能:修改键值,如果找不到主键,则新创建一个;不能修改类别。

输入:

LPCTSTR lpKey:主键字串,必须是全路径的,大小写不敏感;

DWORD dwType:类别信息;

LPCTSTR lpData:默认键值数据指针;

DWORD cbData:默认键值数据长度。

输出:成功是返回REG_ERROR_SUCCESS,否则返回REG_ERROR_INPUT。

5 结束语

注册表的CMOS实现体现了智能手机的特点和先进技术,同时为上层应用软件提供了良好的开发环境,完全可以满足当前智能手机的需求。当然,本文实现方案还存在着一些不足,需要进一步优化,但是其注册表实现的设计思想在整个手机产业中具有较高的实用和推广价值。

参考文献

[1]RUINI A,CORE J,著. 魏永明,骆刚,姜君,译. Linux设备驱动程序(第2版)[M]. 北京: 中国电力出版社,2002.

[2]王继刚. 面向智能手机的嵌入式实时操作系统[J]. 中兴通讯技术,2005,16(4): 97-99.★

推荐访问:智能手机 注册表 嵌入式 操作系统 方案