APP下载

基于模块动态加载机制的航天器软件重构方案研究

2018-07-04,,,

计算机测量与控制 2018年6期
关键词:龙芯内核航天器

, ,,,

(中科院 微小卫星创新研究院,上海 201210)

0 引言

当今航天领域发展迅速,在轨、在研航天器型号数量急剧增加,航天器性能、功能不断增强,星载软件的复杂度越来越高,用户需求更新频率越来越快。随之带来软件开发工作也变得更加复杂,软件版本更迭频率也越来越快,在轨航天器的日常维护管理工作日益艰巨。

在轨软件重构作为星上软件更改的唯一方式变得尤为重要,一方面可以修正已知的软件设计缺陷和错误,最大程度的减少损失;另一方面还可通过注入新程序来适应用户新需求的变化,延长了在轨航天器的服役时间[1]。受航天器运行的特殊环境限制,在轨航天器的软件重构对安全性、可靠性有了更高的要求,而对于星上某些特殊设备,还需要充分考虑软件更新后的快速恢复能力,以期最大程度的减少系统中断时间。综上所述,研究可靠的、安全的软件在轨重构方法有很大的实用价值。

本文以在航天领域应用广泛、高可靠性的VxWorks操作系统为研究对象,分析现有星载软件的重构方式的弊端,提出了基于模块加载机制的软件重构方案,并借助龙芯硬件平台对该方案的合理性加以例证。

1 嵌入式软件重构技术研究

VxWorks操作系统是美国风河公司(Wind River Systems Inc)设计开发的嵌入式实时操作系统(RTOS),以其良好的可靠性和卓越的实时性被广泛应用于航空、航天、军事及通讯领域。

VxWorks操作系统基于优先级的抢占式任务调度模式,采用资源共享和优先级继承机制,以微内核为核心,扩展网络系统、I/O系统、文件系统以及其他功能库,用户可以根据需求进行功能组件的增添和裁剪,其中动态加载器组件(Loader Components)是VxWorks操作系统实现模块动态加载的核心和基础。

VxWorks操作系统提供了两种将目标模块加载到内核中的方式,两种方式均能够在不中断系统当前进程的情况下,对指定的部分软件实施维护和更新,来完成对目标模块的动态加载和卸载。一种是在目标机(Target)与主机(Host)建立关联(一般为Target Server/Agent方式)的前提下,在主机端端向目标机动态加载目标模块,这种方式一般用来前期软件功能调试,可以有效加快软件开发进度;还有一种为目标机自身借助文件系统、FTP等方式,动态加载某一特定模块到内核中,这种方式可以有效增加软件目标机使用和维护的灵活性。本文研究的便是第二种模块加载方式[2]。

1.1 VxWorks操作系统模块加载机制

对于嵌入式操作系统,软件设计人员通常在程序设计的最后阶段,将操作系统和应用软件链接编译成一个镜像,并将其固化在ROM中。当后续测试、使用过程中,发现程序设计错误或者需求更改时,需要修改代码,重新编译,然后更新ROM中存储的目标文件,重新加载程序才能完成软件更新。在此过程中,势必会对中断系统的运行状态。

基于上述开发方式生成的目标文件都相对较大,受星地通讯速率限制,在轨更新程序时费时费力,安全性也不好。除此之外,软件重构时还需要停止当前系统进程,完成固化后需重新启用新程序,对系统恢复正常运转也带来不小的麻烦,上述开发方式的软件层次架构如图1所示。

图1 常规嵌入式软件架构图

而如果在程序设计之初时,按照软件功能划分模块,建立多个子模块过程,编译形成多个目标文件。借助文件系统随时停止、加载、运行某个或某几个特定模块,而不会影响系统当前运行的其他功能,这便是动态加载的核心原理,且单个模块编译生成的目标文件都比较小,维护起来也比较容易[3-6]。

如图2所示,基于模块加载机制的软件架构由驱动层、操作系统层、应用层组成,其中操作系统层和驱动层是相对固定,设计人员在对操作系统各个组件完成剪裁、验证后,便相对固定下来,后期改动也较小。为了实现模块的动态加载功能,还必须在操作系统中增加相应的模块加载、管理相关的程序,借助文件系统,根据实际需要,将特定功能模块加载至内核中,更新全局符号表,查找函数符号,运行相应进程。

图2 基于模块加载机制的嵌入式软件架构图

应用层部分是用户自定义部分,是各个项目的特定部分,需要根据需求变化,随时更新代码。而对于航天器的软件,在轨重构也主要是更换这部分程序。

1.2 dosFS文件系统

VxWorks操作系统的模块加载组件仅支持ELF(Executable and Linking Format)文件格式目标文件,这是一种在可执行文件和共享库中都广泛使用的格式,ELF文件中将执行代码分为代码段(text)、数据段(data)和初值为0的数据段(bss)3个部分,分散的存储在目标文件中,目标文件还包括符号表和重定位信息段信息[7-8]。

对于VxWorks操作系统,编译生成的目标文件都是以“.o”或者“.out”(这两种都是ELF对象文件)的文件形式存储在ROM中,文件中的有些信息,必须通过文件系统才能加载到内核中。在使用文件系统加载符号文件时,首先分析目标文件的文件头表(ELF Header),根据这些信息得到text、data和bss相关信息,然后在内存映像中建立该模块的信息,然后根据符号信息,对模块符号进行重定位并更新系统符号表,从而完成整个加载过程。

VxWorks操作系统提供了多种文件系统,包括VRFS、HRFS、dosFs、rawFS、cdromFs、ROMFS、TSFS等[9-10]。在VxWorks操作系统中的文件系统的架构图如图3所示,涉及硬件层、驱动层、应用层等。其中图中方框部分即为文件系统的驱动部分,由其完成对底层硬件资源的分配,并提供相应的接口来供上层I/O系统来调用,即VxWorks的文件系统和设备驱动程序通过标准的I/O操作接口来进行连接。

由于本次例程中涉及的文件规模都相对较小,这里选用了相对简单的dosFs文件系统来进行实验验证。VxWorks操作系统的dosFs文件系统是一种与MS_DOS文件系统兼容的文件系统[11],能够满足实时应用的多种要求,其与老版本的dosFs文件系统相比,有如下新特点:

1)支持层次化的文件和目录结构,能够在一个磁盘上建立一定数目的文件并进行有效的管理;

2)可以将每一个文件指定为连续存储或非连续存储;

3)支持Microsoft风格的长文件格式(VFAT);

4)支持FAT12,FAT16和FAT32文件分配表格式;

一个简单dosFs文件系统可通过建立RAM Disk来实现,即分配CPU内存的一段存储空间建立软磁盘卷,并将其初始化成dosFs文件系统。需要注意的是在分配RAM Disk的存储空间时,既可以由操作系统动态分配空间,也可以由用户指定空间位置。而文件系统一旦建立成功,便可以使用通用I/O函数(open、close、write、read等)来访问文件系统,用来新建、打开、关闭以及读写文件了。

2 动态加载机制实验验证

基于上述理论,我们在龙芯CPU硬件平台上加以验证,龙芯1E是龙芯中科技术有限公司研制的基于MIPS架构的高性能抗辐照宇航级CPU芯片,提供了通用的处理器部件和对外接口,包含中断控制器、定时器、RS232串口控制器、浮点处理器、PCI和存储器接口(存储器接口支持SDRAM和FLASH ROM)等,龙芯1E芯片的外部时钟频率不低于66 MHz,功耗3 W[12]。操作系统为VxWork6.8,开发环境为WindRiver Workbench3.2。具体配置如表1所示。

表1 验证平台资源配置表

为了充分验证上述方案,需依次验证模块的固化存储、加载、执行、删除等过程。在验证时还设计了多个模块文件同时加载以及目标文件压缩、解压的过程,验证该方案的可拓展性。

1) 首先分别建立操作系统工程和子模块工程,在此次验证实验中,建立了一个VxWorks Image Project (VIP)和两个Downloadable Kernel Module Project (DKM),建立两个子模块工程的目的在于验证存在多个模块条件下,函数模块相互调用情况。其中对于两个DKM工程,其中一个DKM工程仅含有一个函数:

void Hello1(void)

{

printf("--- this is Hello1 DKM example --- ");

}

另外一个DKM工程包含两个函数:

void Hello2(void)

{

printf("--- this is Hello2 DKM example --- ");

}

void Hello3(void)

{

printf("--- this is Hello3 DKM example --- ");

}

而对于操作系统工程,除了必要组件之外还需要在其中完成模块管理的相关操作,包括建立文件系统,新建模块文件,加载模块,执行模块,删除模块等操作,其中涉及的用户自定义函数有“usrRamDiskInit”、“deleteModule”、“runModule”、“runModule1”等,其中涉及的函数作用和调用的系统函数如表2所示。

2) 在Workbench开发环境中,逐个编译上述工程,分别生成 “vxWorks”、“Example1.o”、“Example2.o”等目标文件,其中目标文件“Example2.o”利用VxWorks操作系统自带的压缩算法(deflate)生成压缩文件“Example2.z”。将上述目标代码依次固化到NOR FLASH中,通过压缩算法可以有效减小目标代码占用。制作压缩文件时可直接在Workbench中通过shell命令来完成,可采用以下示例:deflate UserApp.bz。

系统上电后,引导程序首先将操作系统文件从FLASH加载到SDRAM中,之后便开始可以使用用户保留空间建立RAM Disk,并在其中搭建dosFs文件系统。

文件系统建立成功后,依次在其中新建“Example1.o”、“Example2.o”两个文件,文件内容分别从FLASH存储的“Example1.o”、“Example2.z”拷贝得到。在处理压缩文件“Example2.z”时,必须先解压存储的目标代码后再进行数据拷贝,解压文件可以使用函数“inflate”来完成,这样包含模块的两个文件已经存在文件系统中了。

3) 最后利用VxWorks操作系统提供的符号加载函数将其加载到内核之中,操作系统提供了“symLib”、“loadLib”两个函数库可供用户调用。一旦加载完毕,用户就可以调用当前文件中包含的所有函数了。

上述几个过程涉及的目标代码存储及转移的信息流如图4所示。

图4 目标代码存储及转移信息流图

4) 在上述软件架构下,当需要进行软件重构时,只需要停止该进程,将特定的目标文件替换,然后重新加载该符号至内核,重新启用该进程,即可完成软件重构整个过程。以上述例程为例,当需要替换“Example1.o”模块时,首先需要在把内核中该模块停止,然后替换该文件,加载该模块到内核中,重新该进程即可。

由于单个目标文件都相对比较小,并且重构时也不需要中断系统的其他进程,可以将对整个系统的影响做到最小,以上过程涉及到的自定义函数如表2所示。

表2 涉及的自定义函数列表

3 结果分析

为了直观显示出模块加载的全过程,可以利用VxWorks操作系统的shell工具,通过命令的方式依次调用各个函数模块,执行上述过程。

1)系统上电后,操作系统首先被加载起来,正常运行后,可以从输出信息中得到操作系统及硬件的启动信息,如图5所示,从中可以看到,例程使用的操作系统版本为VxWorks 6.8,硬件平台为Loongson1E。

图5 VxWorks操作系统启动信息

2)系统初始加载后,此时文件系统还未建立,因此通过“devs”命令查询当前系统设备信息,如图6所示,可以看出设备列表中还没有磁盘卷信息;

图6 dosFs文件系统输出信息

通过命令行调用函数“usrRamDiskInit”,函数执行后,操作系统建立了512 KB大小的磁盘卷并将其格式化成“dosFs”格式,与此同时文件“Example1.o”、“Example2.o”也被建立起来。

通过命令行输入命令“devs”后,看以看出系统设备目录下新增了“/ram0”设备。输入命令“ls”可以查看到当前目录下的文件列表,可以看到当前目录下已经存在文件“Example1.o”和“ Example2.o”了,这说明文件系统以及文件都被成功建立。

3)虽然文件系统已经建立起来,但依然还未将文件“Example1.o”、“Example2.o”中的模块加载到内核中,此时通过命令行调用函数“Hello1”、“Hello2”、“Hello3”时,系统输出错误信息。

通过命令行调用函数“runModule”和“runModule1”后,两个文件包含的所有函数模块均被加载至内核中,此时可以通过命令行正常调用相关函数,运行结果如图7所示,其中在“runModule”函数中在加载成功后同时也调用了函数“Hello1”。

图7 子函数调用执行信息

5) 当模块需要更改时,应先停止相应的线程,并将该模块从内核中删除。通过命令行输入命令“moduleShow”可以查看当前目录下的模块信息,可以看出当前内核中存在“example1.o”、“example2.o”模块。通过命令调用“deleteModule”函数将模块“example1.o”从内核中删除,此时再调用函数“Hello1”,操作系统输出错误调用信息,当通过调用函数“runModule”又重新将模块加载到内存中,可以继续调用

图8 模块删除与重加载信息

该函数。需要注意的是,由于我们这次省去了文件更新替换的过程。

4 结束语

本文从当前常规在轨航天器软件重构角度出发,分析传统星载软件重构方式,并从模块加载的角度验证了一种新型在轨航天器软件重构方案,还从实例的角度验证了这一方案可行性和可操作性。

基于该架构的星载软件会使航天器的软件在轨更新变得更加可靠、简便、安全,也能极大程度地减小对系统的影响,减小了系统在轨维护难度,对于其他嵌入式系统的软件在线更新也有一定的借鉴意义。

参考文献:

[1] 刘 贇,左小川.嵌入式软件在线升级系统的设计与实现[J].计算机测量与控制, 2015,23(04):1425-1427.

[2] 王 鹏,张友根,李永刚.一种改进的VxWorks模块卸载方法研究[J].装备指挥技术学院学报,2010,21(5):83-87.

[3] 朱海江.星载软件模块化设计方法研究[D].哈尔滨:哈尔滨工业大学,2007.

[4] 石 炜,邓 伟.基于VxWorks的星载控制计算机动态可重构研究[J].电子设计工程,2013,21(6):30-33.

[5] 廖崇琦,文 臣,邓 文,等. 一种基于VxWorks的可重构软件框架设计[J]. 电子技术应用,2013,39(12):22-24.

[6] 于 康,宁 洪,邓胜兰,等.基于VxWorks的模块自动加载机制[J].计算机工程,2010,36(18): 264-266.

[7] 宁 涛. 面向嵌入式应用的动态加载机制研究[D].重庆:重庆大学,2008.

[8] 于 康.基于动态加载机制的星载计算机可靠性增强技术研究[D].长沙:国防科学技术大学,2009.

[9] Wind River,Kernel Programmer's Guide: Local File Systems[Z].Wind River,2009.

[10] Wind River,Vxworks Application Programmers Guide[Z].Wind River,2009.

[11] 王晋东,黄 海,王 坤,等. 基于VxWorks的dosFs文件系统分析与实现[J]. 微计算机信息,2008:85-87.

[12] 龙芯中科技术有限公司,龙芯1E1F开发手册[R].北京:龙芯中科技术有限公司,2017.

猜你喜欢

龙芯内核航天器
基于国产化龙芯的动环数据采集系统
2022 年第二季度航天器发射统计
多内核操作系统综述①
强化『高新』内核 打造农业『硅谷』
活化非遗文化 承启设计内核
2019 年第二季度航天器发射统计
微软发布新Edge浏览器预览版下载换装Chrome内核
2018 年第三季度航天器发射统计
2018年第二季度航天器发射统计
“龙芯之父”胡伟武