姜 文,刘立康
(西安电子科技大学 通信工程学院,陕西 西安 710071)
基于VXWORKS系统的热补丁技术研究
姜 文,刘立康
(西安电子科技大学 通信工程学院,陕西 西安 710071)
软件产品交付用户使用后,需要解决软件产品在使用过程中的各类问题与缺陷。对于VXWORKS操作系统开发的软件产品,通常采用热补丁技术,可以在不影响系统正常运行的情况下完成对软件产品错误的修复。为了解决软件在使用过程中的各类问题与缺陷,需要深入研究热补丁技术。结合工作实践,叙述了VXWORKS操作系统的特点和热补丁制作过程中的各种相关技术。以ClearCase作为配置管理工具,ICP-CI作为持续集成工具,进行热补丁包制作;详细叙述了基于VXWORKS系统的软件热补丁包制作过程,包括热补丁代码的编写和静态检查、模块热补丁文件的制作、热补丁包打包、热补丁版本包的测试与发布。最后介绍了一个典型工作案例。工作实践表明,热补丁技术具有实时修复,且不影响嵌入式系统正常运行的优点,提高了系统可靠性,降低了软件开发成本。
嵌入式操作系统;热补丁;持续集成;静态检查
VXWORKS是实时嵌入式操作系统软件,可以为开发人员提供高效实时的任务调度、中断管理、系统资源管理和任务间通信。VXWORKS经过广泛验证,已成功应用在航天、航空、舰船、通信、医疗等关键领域。
软件产品交付用户使用后,需要解决软件产品在使用过程中的各类问题与缺陷[1]。对于VXWORKS平台开发的软件产品,采用热补丁技术,可以在不影响系统正常运行的情况下完成对系统错误的修复,从而提高了软件的安全性和可靠性,高质量完成软件维护工作,延续软件的使用寿命,降低软件开发成本。
文中采用软件配置管理工具ClearCase和持续集成工具ICP-CI进行热补丁包制作。详细叙述了热补丁代码的编写和静态检查、模块热补丁文件的制作、热补丁包打包、热补丁版本包的测试与发布。最后介绍了一个典型工作案例。工作实践表明,采用持续集成技术有利于提高软件热补丁制作的效率与质量。
软件产品交付用户使用过程中会出现的各种问题或缺陷,导致软件产品部分功能不可用,或者影响软件产品的性能,有时软件可能会出现安全问题。需要在原有的软件系统上实施补丁来修复这些问题。
1.1 补丁分类
软件补丁的分类有多种,根据待实施的软件可以分为操作系统补丁、应用软件补丁;根据修复的软件缺陷的危害程度可以分为高危补丁、普通补丁;根据实施补丁的方式可以分为冷补丁、热补丁。
1.1.1 冷补丁
冷补丁[2-3],是修改软件模块的源代码之后,对该模块对应的整个工程文件进行重新编译,将编译之后的所有可执行文件重新加载到设备上执行,在这个过程中需要在设备上停掉原有的软件产品,再重新安装一遍软件产品。
1.1.2 热补丁
热补丁[4-6],是在软件系统正常运行的过程中进行热补丁安装,热补丁的实质就是替换原有软件系统中的一个或多个函数。执行热补丁安装的过程中,并不需要停止软件系统,而且执行热补丁安装的过程操作起来也很快。通常,热补丁适用的软件系统是一个内核非抢占式的实时操作系统,它具有可伸缩、可裁剪和高可靠性等特点,是一个可以同时适用于主流 CPU(如MIPS、PPC、X86和ARM等)目标平台的实时操作系统。
1.2 VXWORKS系统的特点
VXWORKS系统[4,7-8]提供了以下功能:
(1)任务管理。
操作系统执行的每个程序都被称之为任务,VXWORKS系统模块的运行一般是以任务的形式进行调度和运行;操作系统可以动态启动或停止某一指定任务。
(2)符号表管理。
VXWORKS系统在软件编译时可以将所有的全局变量和外部函数都编译到一个全局符号表中,软件系统启动后,该符号表可以通过操作系统提供的相关函数通过变量或函数名查找变量存储地址或函数的入口地址。
(3)模块动态加载。
操作系统支持将模块软件编译成ELF格式的可执行文件,在系统运行过程中动态加载该文件。
由于VXWORKS系统具有上述三种功能,有利于采用热补丁的方式修复软件模块存在的各种缺陷。基于VXWORKS操作系统的软件产品热补丁具有继承性,即后一个版本的热补丁需要将前一个版本的热补丁所修改的缺陷收编进来,在热补丁的制作过程中需要注意这一点。
1.3 热补丁制作过程中的文件类型
Tornado是VXWORKS应用系统的集成开发环境。Tornado IDE采用C/C++语言编程,支持GNU的C/C++编译器。GNU编译器生成的目标文件缺省为ELF(Executable and Linking Format)格式[4-5]。
1.3.1 目标文件*.obj的文件格式
目标文件*.obj为ELF格式[5-6],文件格式如图1所示。
图1 目标文件*.obj的文件格式
目标文件包括文件头、代码段、符号段、重定位段和段表。其中,代码段存放二进制代码指令;数据段中分类存储数据;符号段中存放该文件中定义的各个全局函数和全局变量的名字以及它们加载后在内存中的地址;在重定位段中存放引用外部符号“名字”以及“在何处引用”等信息。文件头对段表进行索引,段表中包括代码段的段头、数据段的段头、重定义段的段头,这些段头包含对应段的相关信息。
1.3.2 热补丁文件*.pat的文件格式
热补丁文件*.pat的文件格式[5-6]如图2所示。
在补丁文件中每个补丁单元对应一个补丁函数。每个补丁单元包括代码段、数据段和函数替换表三部分。其中,代码段和数据段存放的是补丁函数的实际指令;函数替换表中包括被补丁函数的地址和补丁函数地址。每个补丁单元对应相应的补丁单元头,补丁单元头中包含补丁函数名称、函数尺寸和函数地址。
1.3.3 文件类型
热补丁制作过程中涉及以下文件类型。
(1)*.c或*.cpp文件,采用C/C++语言编写的热补丁源程序。
图2 热补丁*.pat的文件格式
(2)目标文件*.obj,采用gcc或g++将*.c或*.cpp文件编译生成的目标文件,具有ELF格式的二进制文件。
(3)模块目标文件*.elf,将软件模块中的所有目标文件*.obj连接在一起生成模块的目标文件(模块名.elf),通常称为模块基线文件。
(4)热补丁文件*.pat,由热补丁函数组成的文件,可以加载到系统中应用。
(5)符号表信息文件*.SYM,在目标文件中删除符号信息以外的所有内容得到的文件。文件中以符号为单位存放各个全局函数和全局变量的名字和它们加载后在内存中的地址。
1.4 热补丁包制作流程图
采用持续集成技术制作热补丁,可以高效率和高质量完成热补丁包的制作[4-6,9-12]。文中采用的软件配置管理工具是ClearCase,持续集成工具是ICP-CI,进行热补丁包制作。热补丁的制作流程如图3所示。
2.1 热补丁代码编写
制作热补丁之前,开发工程师需要通过软件产品的配置管理工程师(CMO)确认需要制作热补丁的软件代码基线。同时确认目前加载在软件基线上的热补丁包版本。开发人员从版本库下载相关的软件基线代码文件和补丁包代码文件,编写新的热补丁代码。
对于补丁开发首先需要定位存在源代码缺陷函数(因为热补丁的原理就是函数替换),定位之后修改相关的函数源代码,修改函数相应的功能代码。
开发工程师进行补丁开发与通常的软件开发有区别,需要注意如下事项:
(1)对*.h文件的处理。
对补丁开发过程中涉及的代码缺陷,定位到需要修改的函数源代码后,修改相应的功能代码时,不能修改对应的*.h文件中的内容。
图3 热补丁的制作流程图
(2)对函数的处理。
修改缺陷对应的*.c文件的源代码时,只保留需要修改的函数。去掉所有无关的函数,可以直接删掉或者用#if 0 #endif注释掉。
(3)对全局变量的处理。
修改缺陷对应的*.c文件时,需要将所有的全局变量都改用extern声明,并把在定义全局变量时的赋值都去掉;对于用const声明的全局常变量(常变量,只允许读不允许写),如果开发工程师所修改的函数中未用到该全局变量则在该全局变量前加extern声明,还要将其后面的赋值去掉;若所修改的函数中用到了该全局变量,就需要将该全局变量改成别的变量名,并重新定义,其初始化与原全局变量一致,同时在要修改的函数中用新的变量名替换老的变量名;若该全局变量是static声明的,如果需要修改的函数中未用到该变量,可直接加extern声明。
(4)对静态函数的处理。
若修改的函数是静态函数,可通过修改该函数的上层函数,即修改完缺陷对应的函数之后,不能注释掉调用该函数的上层函数,另外,所有的上层函数要调用的静态函数都不能注释掉。
(5)加入返回补丁版本号的函数。
修改的*.c文件中加入一个返回补丁版本号的函数,其返回值为补丁版本号。
开发工程师完成补丁代码编写后,对代码进行单元测试,静态走码检查,最后将评审过的代码合入版本库。开发工程师向版本库提交代码时,要添加注释、说明、CR单号、修改原因等,以保证可追溯。
2.2 ClearCase版本库的代码更新
持续集成工具ICP-CI需要在版本库锁库之后完成源代码更新。ICP-CI工具执行代码更新时,需要编写代码更新的批处理脚本code_update.bat,把代码更新的脚本配置在任务中。
2.3 代码静态检查
为了确保热补丁文件的源代码质量,需要对开发工程师修改的源代码进行静态检查。采用持续集成工具ICP-CI调用静态检查工具PC-Lint和Coverity Prevent[13]对补丁代码进行静态检查。PC-Lint通常用于C、C++源代码的静态检查,是最常用的静态检查工具。重量级静态检查工具Coverity Prevent是检测和解决C、C++、Java和C#源代码中严重缺陷的领先自动化方法。另外,为了提高热补丁的安全性,还需要对补丁源代码进行危险函数检查,避免出现诸如strcpy等函数。发现代码问题反馈给开发工程师,其对代码进行修改,直到存在的问题全部解决。
热补丁分为三个层级:函数热补丁,模块热补丁(由多个函数热补丁组成),热补丁包(包含多个模块热补丁)。基于持续集成[7]的热补丁开发通常是制作热补丁包。
3.1 模块热补丁目录结构
制作模块热补丁时,需要创建“产品名_版本号_BASEVXWORKS模块名”文件夹,用于存放相关文件与热补丁文件。以UPE模块为例,文件夹目录结构如表1所示。
表1 UPE模块热补丁文件夹目录结构
3.2 模块热补丁文件制作过程
以UPE模块为例,叙述模块热补丁文件制作过程。
3.2.1 集成到ICP-CI工具进行热补丁文件编译
首先创建一个构建工程:“产品名_版本号_PatchBuild”。在ICP-CI的任务管理页面上配置编译任务完成热补丁源程序代码编译。配置任务以模块为单位,在任务栏上选择“compile”任务。具体配置如表2所示。
表2 UPE模块在ICP-CI页面上配置“compile”任务
持续集成工程师编写相关的*.ini配置文件、Makefile文件、补丁编译脚本和ANT脚本,启动相关程序完成补丁源程序代码的编译工作。将编译生成的*.obj文件归档到UPEobj目录下。
3.2.2 模块热补丁文件的制作
编译工作完成之后,制作补丁中间文件和模块UPE热补丁文件。
(1)根据*.obj文件的个数,在UPEobj文件夹中生成从HP0001到HP000X的子目录。热补丁中间文件制作工具makepatch.exe通过补丁目标文件*.obj生成与其对应的热补丁文件、符号表信息文件和制作热补丁文件的过程日志文件。*.obj文件和生成的热补丁中间文件存放在对应的文件夹中。以HP 0001文件夹为例,文件夹中存放的文件如表3所示。
表3 补丁中间文件的文件目录
(2)编写批处理脚本,通过热补丁中间文件生成模块热补丁文件。由于模块热补丁文件具有继承性,即包含上一个版本热补丁修复的产品缺陷,因此对非首次编译的热补丁文件而言,需要将前一个热补丁版本的热补丁中间文件与本次编译生成的热补丁中间文件合并起来生成目前版本的模块热补丁文件。模块UPE的热补丁文件是upe_patch.pat。该补丁文件归档到UPE elease文件夹中。
3.3 热补丁包打包
软件的所有模块热补丁文件制作完成后,将这些模块热补丁文件打包。由于热补丁版本包也具有继承性,即后一个版本的热补丁版本包收编包含前一个版本包编译生成的热补丁文件。同时要更新热补丁包版本号。
(1)创建热补丁包文件夹。
热补丁文件制作完成后,需要创建热补丁包的文件夹。将各模块热补丁文件*.pat拷贝到热补丁包文件夹的bin/new目录下。若模块补丁文件已经更新,拷贝更新后模块热补丁文件;若没有更新,拷贝原来的模块热补丁文件。将其他相关的文件拷贝到相应的目录下。
(2)热补丁包打包。
修改打包配置文件autorun.ini:填写本次版本号、基线版本号、源文件目录和目的文件目录。运行打包工具packer.exe完成热补丁版本包打包。热补丁包制作完成后,补丁版本包的文件名为:产品名 版本号 loadfiles.rar。
热补丁版本包制作完成后由产品经理提交转测试流程。测试经理安排测试工程师与测试环境对补丁版本包进行测试[14-16]。
测试工程师根据该补丁版本需要修复的缺陷列表,设计相应的测试用例,测试新增与待改进的特性是否符合设计规格;还要根据基本测试用例完成补丁的基本功能测试,测试工作完成后,测试工程师提供测试报告。
热补丁测试分为三个层次:补丁函数测试、补丁模块测试和补丁包测试。
(1)补丁函数测试是最基础的测试,补丁函数测试是函数缺陷修复、新增与待改进的特性的测试。对于UPE模块,通过基线文件upe.elf和四类中间文件(热补丁文件patchHP000X.pat,符号表信息patchHP000X.SYM,日志文件patchHP000X.txt和编译目标文件*.obj)测试补丁函数。通过这四类文件可以方便测试补丁函数,将测试结果及时反馈给补丁源程序代码的开发人员,修改代码存在的各种问题。这四类文件也有利于补丁包测试和补丁模块测试中各种缺陷问题的定位。
(2)补丁模块测试,对于UPE模块,通过基线文件upe.elf和upe_patch.pat,对补丁模块进行功能、性能和兼容性的综合测试。
(3)补丁包测试,热补丁包的测试是补丁包加载后综合技术指标的全面测试。
完成热补丁测试工作后,将相关文件和热补丁版本包归档。产品经理发布热补丁包。
热补丁通常有4个基本状态:加载,激活,去激活和卸载。基于VXWORKS系统的热补丁包可以采用LMT(Local Maintenance Terminal)客户端工具安装和管理。LMT工具是指安装了“本地维护终端”的软件组,通过LMT工具的MML(Man-Machine Language)命令,可以对网元进行相应操作和维护。
将热补丁版本包解压之后,使用FTP工具,打开客户端工具连接到主版本的单板,执行MML命令进行补丁热的安装和管理。执行LOD TOBAM将热补丁版本加载到硬盘,执行LOD TOBP将热补丁版本加载到FLASH。加载完成之后激活补丁,执行CHK VERSION与DSP PATCH查看补丁版本号,表示加载相应的热补丁版本成功。
常用的补丁管理MML命令如下:
DSP PATCH显示补丁
ACT PATCH 激活补丁
DEA PATCH 去激活补丁
CON PATCH 确认补丁
RVW PATCH 删除补丁
某公司采用软件配置管理工具ClearCase和持续集成工具ICP-CI进行基于VXWORKS系统的软件热补丁的制作。
补丁包版本编号为V2.11.0_SPC101,共制作了10个模块的热补丁文件,收编了若干个来自各局点和内部测试发现的软件产品缺陷,并完成了热补丁包打包以及所有的结果文件归档任务。补丁包发布后在各局点安装使用,解决了存在的问题。
热补丁技术为嵌入式系统升级软件和嵌入式系统进行错误动态修复提供了一种技术方法。工作实践表明,热补丁技术具有实时修复,且不影响嵌入式系统正常运行的优点,对于VXWORKS系统的软件采用热补丁技术,可以提高软件的安全性和可靠性,同时降低软件开发成本。文中采用持续集成技术开发热补丁包,可以提高软件热补丁的质量和开发效率,可以快速向开发工程师反馈软件源代码的缺陷,便于开发工程师及时修复源代码的缺陷,同时也给项目的管理提供了很好的保证。
[1] Grubb P,Takang A A.软件维护:概念与实践[M].韩 柯,孟海军,译.第2版.北京:电子工业出版社,2004.
[2] 姜 文,刘立康.现代应用软件的维护与技术支持[J].计算机技术与发展,2015,25(4):116-120.
[3] 姜 文,刘立康.应用软件维护中的补丁开发与管理[J].计算机技术与发展,2015,25(11):11-16.
[4] 程友清.嵌入式网络设备软件热补丁技术研究[J].微电子学与计算机,2013,30(1):28-31.
[5] 常莉莉.分布式系统热补丁技术的研究与实现[D].广州:中山大学,2006.
[6] 雷震宇.嵌入式网络设备在线热升级的研究及实现[D].武汉:武汉邮电科学研究院,2012.
[7]RiverW.Vxworks程序员指南[M].北京:清华大学出版社,2003.
[8] 陈智育,温彦军,陈 琪.Vxworks程序开发实践[M].北京:人民邮电出版社,2004.
[9]MehdiG.Contributorstoqualityduringsoftwaremaintenance[J].DecisionSupportSystems,1998,23(4):361-369.
[10]HauptmannS,WaselJ.On-linemaintenancewithon-the-flysoftwarereplacement[C]//Internationalconferenceonconfigurabledistributedsystems.[s.l.]:IEEEComputerSociety,1996:70-80.
[11] 姜 文,刘立康.Oracle数据库补丁问题研究[J].电子设计工程,2014,22(20):10-13.
[12]ShahR.Oracleondemandbestpractices:criticalpatchupdate[R].[s.l.]:OracleCorporation,2008.
[13] 姜 文,刘立康.基于VxWorks平台的软件重量级静态检查[J].微型机与应用,2016,35(6):79-81.
[14] 蔡建平.嵌入式软件测试实用技术[M].北京:清华大学出版社,2010.
[15]MichalikB,WeynsD,BouckeN,etal.Supportingonlineupdatesofsoftwareproductlines:acontrolledexperiment[C]//2011internationalsymposiumonempiricalsoftwareengineeringandmeasurement.WashingtonDC:IEEEComputerSociety,2011:187-196.
[16]ChenXuhui,ZhangDengyi,YangHongyun.Researchonkeytechnologiesofon-lineprogramminginembeddedsystem[C]//2009thirdinternationalsymposiumonintelligentinformationtechnologyapplication.WashingtonDC:IEEEComputerSociety,2009:45-47.
Research on Hot Patch Technology Based on VXWORKS
JIANG Wen,LIU Li-kang
(School of Telecommunication Engineering,Xidian University,Xi’an 710071,China)
After the software is delivered to customers,all kinds of problems and defects are needed to be solved during the use of software.The software developed by the VXWORKS operating system is usually used the hot-patch technology,which can solve the software errors with the system operated normally.In order to solve kinds of questions and defects,the technique of hot patch is needed to be researched deeply.With the practice of the work,the characteristics of VXWORKS operating system and the types of files during the process of hot patch making are described.With ClearCase as the configuration management tool and ICP-CI as the continuous integration tool to produce hot patches,the process of software hot patches based on the VXWORKS operating system is described in detail,including writing and static checking the code of hot patch,making the hot patch files for modules,packing the hot patches,and testing and releasing the version package of hot patches.Finally,a typical work case is introduced.Practice shows that the technique of hot patch has the advantages of real-time repair,and will not affect the normal operation of the embedded system,improving system reliability,reducing the cost of software development.
embedded operating system;hot patch;continuous integration;static check
2016-04-17
2016-08-11
时间:2017-02-17
国家部委基础科研计划:国防预研基金项目(A1120110007)
姜 文(1986-),女,硕士研究生,工程师,CCF会员,研究方向为图像处理、数据库应用和软件工程等;刘立康,副教授,研究方向为数字通信、图像处理、嵌入式应用技术等。
http://www.cnki.net/kcms/detail/61.1450.TP.20170217.1628.022.html
TP311.53
A
1673-629X(2017)03-0018-05
10.3969/j.issn.1673-629X.2017.03.004