肖永全 张国
1西安西瑞保护控制设备有限责任公司 陕西 710000
2长庆油田公司矿区事业部 陕西 710000
在嵌入式实际应用过程中,因为嵌入式系统其独特性和实时性要求,基本上没有虚拟内存等机制存在,整个内存空间对用户程序开放的。所以不恰当的操作,往往会修改其代码段甚至系统内核,从而导致缺陷缺陷甚至系统崩溃。而对代码段只读区域进行检测保护,是保护一个嵌入式系统可靠性的可行的实现方法。
VxWorks操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是嵌入式开发环境的关键组成部分。良好的持续发展能力、高性能的内核以及友好的用户开发环境,在嵌入式实时操作系统领域占据一席之地。它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。
Vxworks系统使用linux系统的GNU工具链,其中包括GCC编译器和LD链接器。其编译生成的二进制文件格式符合ELF格式,其系统加载规则符合ELF规定。
ELF(可执行连接格式)是UNIX系统实验室(USL)作为应用程序二进制接口(Application Binary Interface(ABI))而开发和发布的。工具接口标准委员会(TIS)选择了正在发展中的ELF标准作为工作在32位INTEL体系上不同操作系统之间可移植的二进制文件格式。ELF文件现在已经成为Linux系统下最主要最流行的可执行文件格式。Gcc的默认输出格式就是elf。而VxWorks下生成的程序映像就是ELF格式,如图1所示。
图1 ELF文件格式布局
首先是文件头和程序头表,然后依次各个段排列在后。其中每个段的描述均在节头表(section header table)中。比如要查找代码段信息,需要查找ELF文件头中Text段的偏移量和长度。
由于CRC-32的可靠性,把CRC-32用于重要数据存储传输十分合适,所以在通信、计算机等领域运用十分广泛。
对代码段采用CRC-32校验,其中生成多项式为:
若余式为零则认为存储无差错;若余式不为零则存储有差错。
在宿主机生成目标印象ELF的之后,编制脚本objdump从而解析出其代码段偏移地址 TextSectionOffset和长度TextSectionSize。在目标机加载运行后,启动tCheckTextSection任务,定期进行代码段校验,如校验值和初始校验值不相符,则应该进行异常处理(图2)。
在系统加载后,数据段TextSection的值会发生变化,而代码段应该稳定,如果发生变化,则可以断定内存越界错误。而这种错误在自动控制设备中,往往是致命的错误,需要及时处理,否则将造成被控制对象误操作,从而给工业生产带来损失。
图2 tCheckTextSection流程示意
在系统加载后,数据段TextSection的值会发生变化,而代码段应该稳定,如果发生变化,则可以断定内存越界错误。而这种错误在自动控制设备中,往往是致命的错误,需要及时处理,否则将造成被控制对象误操作,从而给工业生产带来损失。
因为本系统是智能电网电力自动化设备,控制对象是国家电网,如果系统错误动作将会造成错误供电或者错误断电,影响很大。目前本系统采用的异常处理,即立刻停止所有后续操作,并且使系统进入安全模式。在安全模式中对系统进行最小化动作处理后系统重新加载代码段。
在实际工程实践中,此方法证明可以稳定有效的保证代码段的完整性,在下一步的工作中,但是没有对代码段的内部结构进行分析。其可以继续细分为系统内核,核心任务,应用任务。可以对其进行重要性,优先级排序后,当次要模块被修改后,只需要重新加载其代码而不是整个系统映像重新加载一遍。
[1]Wind River System.VxWorks_BSP_Reference www.wind_river.com.2004.
[2]基于 PowerPC的嵌入式 Linux.北京航空航天大学出版社.2004.