一种嵌入式系统中软件模块的动态升级方法与流程

文档序号:14249199阅读:202来源:国知局
一种嵌入式系统中软件模块的动态升级方法与流程
本发明属于嵌入式开发及维护领域,具体涉及一种软件的动态升级方法。
背景技术
:在具有复杂应用的嵌入是系统中,当某些软件模块开发完成后,需要该模块在嵌入式系统中运行,此时就需要用到加载技术。当前常用的加载技术有两种:一种是静态加载技术,一种是动态加载技术。其中,静态加载方式使用成熟的工具链,该工具链(比如:gnu)提供可靠完整的编译和链接工具,开发人员解决编译、链接中存在的问题,就可生成可重定位格式的目标文件。当需要加载时,主机端工具需要计算可重定位目标文件各段大小,向目标机端发送加载地址请求,根据回复的加载地址,对可重定位文件进行二次链接,进行地址重定位,得到最终目标文件。最后,将目标文件写入到目标机内存中,并运行程序。动态加载方式可以用于在软件开发过程中,以增量方式向目标机动态下载目标模块进行调试,从而加快开发的速度。目标机端配合主机端动作,将目标模块进行加载和运行。主机端的编译器生成的目标文件,这些目标文件没有实际的运行地址。先将目标文件加载到目标机机端的指定区域,当需要模块运行时,首先,在目标机端,要完成对目标文件的二次链接,才能将目标文件加载到内存中运行,但不记录模块间存在的相互依赖关系。这两种方式应用于软件动态升级中都存着缺陷,不能满足嵌入式系统中对于软件进行动态升级的要求。采用静态加载方式将软件模块加载到目标机端后,代码段和数据段的位置都不能改变。从设计上不满足操作系统动态升级的要求,模块的升级无法脱离开发环境的支持,在软件维护升级阶段意义不大。传统的动态加载方式,在需要卸载旧版本的软件模块,回收其所占用资源时,各模块间可能存在相互依赖关系,应当确保系统中没有其他模块依赖于待卸载模块。由于该方法没有进行模块依赖关系检查功能,在卸载的过程中,如果软件模块间存有依赖关系,则极有可能会出现软件系统出现紊乱,导致不可预料的后果,所以该方法常用于软件调试阶段,而不用于软件升级以及维护阶段。技术实现要素:模块化的软件架构是实现操作系统动态升级的前提,所设计的系统应具有高度的模块化特征,每个模块完成特定的任务。模块的动态升级一般适用于应用程序或者组件等独立性较强、与操作系统核心功能无扇入的模块。内核不可裁剪部分组件只有在底层硬件或资源管理能力发生改变时才需要修改,因此内核不可裁剪部分组件不需要在线升级能力。动态升级是指通过一系列预定的动作将新模块加载到系统中,并适时对旧模块进行动态替换,最终实现系统平滑升级的过程。动态升级可以在系统运行过程中把下载到指定空间的独立模块链接到系统中,实现不停机的更新服务。其中,动态链接是动态升级的关键技术。目标机端通过动态链接技术,能够在实现目标模块在指定地址空间中的再定位。动态升级工具软件架构分为主机端和目标机端两部分,如图1所示。主机端升级工具由升级功能插件和升级图形插件两部分组成。升级图形插件和升级功能插件都是以插件的形式集成到eclipse平台上,作为开发环境的一部分功能。包括如下几部分:1.升级图形插件面向用户,提供图形化的界面操作。2.升级功能插件用于控制宿主机端的整个升级流程,是主机端升级工具的逻辑控制单元。3.目标机管理负责发送主机端的信息到目标机端,信息包括主机端的命令和目标映像。目标机端通讯服务提供数据的收取和发送服务,当前可以提供网络或者串口的方式实现。通讯服务用于接受主机端发送过来的数据信息,包括,命令信息、数据信息等;同时,通讯服务将目标机端的信息反馈给主机端,包括应答信息、查询信息、状态信息等。目标机端分为管理服务和升级服务两部分。各部分功能如下:1.管理服务创建数据结构并保存模块信息;通过符号引用关系动态分析模块之间的依赖关系,维护模块依赖关系表,并将被加载模块信息及其依赖关系上报给升级服务;与操作系统层交互,实现管理服务功能。2.升级服务是整个动态升级模块的核心部分,与管理服务交互,执行主机端的各种命令,包括查询、加载模块和卸载模块等,主要功能包括如下几个方面:1)调用管理服务的功能,提取模块间依赖关系,为后续的模块的加/卸载功能提供支持。2)处理查询命令,返回目标机端的查询信息,包括已加载模块信息和模块间依赖关系等。3)接收文件并将文件加载到指定的区域,在目标机端进行二次链接,并将目标文件加载到内存中运行。在节点众多的嵌入式系统中,比如传感器网络等,存在着安装拆卸困难等情况,所以,当软件模块发生改变,动态升级技术能够实现软件模块的平滑升级,满足节点的可重新配置和自适应性要求,并保证系统的正常运行。技术方案:一种嵌入式系统中软件模块的动态升级方法,包括以下几个步骤;步骤1:开发环境基于eclipse平台实现,主机端的动态升级功能以插件的形式集成在开发环境平台上,开发环境发起升级动作,通过目标机管理将数据发送到目标机端。步骤2:通讯服务负责接受主机端的数据,将升级请求转发给升级服务。步骤3:升级服务响应升级请求,查询模块表,判断该模块是否存在,模块存在,到步骤4,模块不存在到步骤8。步骤4:系统中已存在该模块,根据模块之间依赖关系表,调用管理服务功能进行模块停止操作,如果停止成功,进行模块卸载,修改依赖关系表,到步骤7;如果停止失败,到步骤8。步骤5:主机端收到成功命令后,发送目标文件,通讯服务接收文件,由升级服务存储到存储区域。步骤6:升级服务依据管理服务提供的模块依赖信息,进行目标文件的动态连接。在动态连接成功过程中,完成地址重定位,调用管理服务的模块加载功能,当该模块加载完成后,在管理服务中启动已升级的模块,到步骤7。步骤7:进入通讯服务,发送成功反馈。步骤8:进入通讯服务,发送错误反馈。所述主机端升级工具由升级功能插件和升级图形插件两部分组成。升级图形插件面向用户,提供图形化的界面操作;升级功能插件用于控制宿主机端的整个升级流程,是主机端升级工具的逻辑控制单元。这两部分都是以插件的形式集成到eclipse平台上,作为开发环境的一部分功能。目标机端分为管理服务和升级服务两部分。管理服务创建数据结构并保存模块信息;通过符号引用关系动态分析模块之间的依赖关系,维护模块依赖关系表,并将被加载模块信息及其依赖关系上报给升级服务,与操作系统层交互,实现管理服务功能。升级服务实现与管理服务交互,执行主机端的各种命令,包括查询、加载模块和卸载模块等命令。附图说明图1为本发明动态升级工具软件架构图;图2为本发明动态升级结构图;图3为本发明动态升级流程图。图4为模块依赖示意图;图5为本发明模块依赖关系提取过程图;具体实施方式动态升级工具按照模块划分为主机端部分和目标机端部分。主机端面向用户,提供信息查询、模块操作、模块设置等操作。目标机端负责对模块进行动态升级和管理。主机端将具体操作转化为命令,发送给目标机端;目标机端在加载过程中产生信息反馈,形成回复信息,使主机端知悉当前加载状态。主机端动态升级管理分为信息查询、模块设置、模块加载和模块卸载四部分功能。各部分功能如下:1.信息查询:提供对模块信息的查询功能,帮助用户实时了解已加载和待加载模块的信息。2.模块设置:提供对模块的设置功能。3.模块加载:将目标映像文件发送到目标机端。这些映像文件可能没有指定实际的运行地址。4.模块卸载:将已加载文件从目标机端卸载。目标机端是动态升级的主要部分,它识别加载命令,读取存储设备中的指定模块,进行升级。动态升级结构设计如图2所示。升级服务提供实现动态加载的api,通过该api可以启动目标机端动态加载过程。通过开发环境的操作或者目标机端的程序调用,最终都会使用到升级服务api。升级服务从存储设备中读取模块文件,经过动态链接,完成地址重定位后,将模块加载到内存中,供系统正常调用。管理服务为加载服务提供服务支持,升级服务执行过程中调用到管理服务提供的功能接口。动态升级的过程中,通讯服务接受主机端的数据,将升级请求转发给升级服务。升级服务响应升级请求,判断该模块是否存在,如果存在,则需调用管理服务功能停止模块,如果停止失败,向主机端回复错误数据包;如果停止成功,进行模块卸载,则回复成功状态。主机端收到成功命令后,发送目标文件,通讯服务接收文件,由升级服务存储到存储区域。升级服务依据管理服务提供的模块依赖信息,进行目标文件的动态连接。动态连接成功后,调用管理服务的模块加载功能,当该模块加载完成后,在管理服务中启动已升级的模块。动态升级具体流程如图3所示。其中,通讯服务负责的来自主机端数据包的接收,并转发给对应的处理服务,同时,它也负责目标机端信息的反馈给主机端。升级服务响应升级请求,是整个动态升级的主逻辑单元。它存储接受到的文件,根据管理服务提供的依赖关系完成动态连接过程,调用管理服务提供的功能,完成整个动态链接过程。管理服务与操作系统交互,实现模块的管理功能,包括模块信息管理和模块操作管理。其中,模块信息管理包括模块自身信息以及模块依赖关系信息;模块操作管理包括模块的停止、卸载、加载和启动等功能。升级服务中实现了动态加载的过程,动态加载过程方案中各部分功能的详细分析如下:1.目标文件解析:目标文件必须是一种标准的可执行文件,采用分层管理模型,分析可执行文件是内部信息,将解析结果存放在数据存储结构中。2.符号分析与管理:用于动态升级的模块是被单独编译成目标文件的,因此在该模块的目标文件存对其他模块中的函数和全局变量的调用。模块符号解析时,遇到符号就填入本模块中相应的符号表中,升级服务利用这些已加载到内存中的符号的内存地址来修正目标模块中的符号引用。3.重定位:升级服务所要处理的重定位信息,是以重定位表的形式存在的。重定位项具有两个功能:当代码段被重定位到另一个段基址时,标注修改信息;标注未定义符号,明确改写符号值的位置。分析目标文件,根据重定位表中的信息修正每个重定位项后,更新地址敏感指令。如果内存映像中仍有外部引用的地址未知,则升级服务将进行报错处理,此时目标模块不能被加载。4.模块载入:经过上述处理后的模块代码,是可以载入的目标代码。升级服务向系统申请各段加载地址空间,完成程序的内存载入。5.系统运行:该模块已经正常的融入到整个系统中,系统根据运行时机,调用更新后的模块功能。软件系统中包含各类可加载的软件模块构成,可加载模块的代码作为编译单元被独立编译,系统中的每个模块都应具有格式的一致性。在升级过程中,模块直到被载入前都保持独立,一个模块可能会被多个进程使用。当模块需要被调用时,通过动态升级的方式把模块链接入系统,等执行到模块部分时,进程就会进入到该模块进行功能执行,所以就存在多个进程去调用一个模块的情况。模块的输入\输出关系对应着模块之间的引用关系,也就是依赖关系。由于模块具有输入和输出的特性,那么就存在它依赖于某些模块,同时某些模块也依赖于它,如图4所示,因此提到依赖关系时,两种特性都需要关注。依据图4中各个模块之间的依赖情况,可以提取出这些模块之间的依赖关系如表1所示。表中记录了一个模块依赖于哪些模块,同时,哪些模块又依赖于它。表1依赖关系表模块名依赖于(数目)拥有的依赖ab,c(2)无(0)bc,d(2)a(1)c无(0)a,b(2)d无(0)b(1)e无(0)无(0)可以看到,如果要卸载模块e,对系统并没有影响,当然这种没有输入和输入的模块,可能在系统中并不存在。如果卸载模块a,则对系统并没有太大的影响,只需要修改依赖关系表即可,修改后的模块依赖表如表2所示。表2卸载模块a后的依赖关系表模块名依赖于(数目)拥有的依赖bc,d(2)无(0)c无(0)b(1)d无(0)b(1)e无(0)无(0)当模块需要卸载的时候,需要保证依赖于它的模块不存在,如果卸载模块b,查询到模块b,还拥有来自于a的依赖,这个时候,就不能随意的卸载模块b了,必须保证依赖于它的模块a暂停工作,才能卸载模块b,否则,直接卸载模块b,会导致系统发生不可预知的错误。要保证系统的安全运行,在动态升级过程中必须考虑到模块之间的依赖关系,尤其在模块卸载时,一定要考察依赖于该模块的其他模块运行状态。在动态升级的管理服务中实现了对模块依赖关系的管理,对模块间依赖关系进行提取,把提取到的关系记录到模块信息中,建立该模块的依赖关系映射,包括该模块依赖于哪些模块,和哪些模块依赖于该模块。在动态升级的符号解析阶段,自动提取模块依赖信息。模块间依赖关系产生的原因是某模块对另一个模块中定义的符号进行外部引用。在动态加载模块的过程中,利用系统符号表中的符号,对这些外部符号引用进行重定位。由于在系统符号表中由不同模块定义的符号各自具有与本模块对应的标记,所以对于符号解析中使用的每个符号,通过其模块标记就可以追溯到定义该符号的模块,此模块即为新加载模块所依赖的模块,从而可提取每个新加载模块对其他模块的依赖关系信息。模块信息提取过程,如图5所示。建立模块表用于管理模块信息,依赖关系的提取是在动态加载过程中实现的,对待升级模块m_e进行符号分析后,发现未定义符号s_x,在符号表中进行查找s_x的信息,找到符号s_x的定义,完成符号地址的重定位,同时,在s_x符号项中记录了它属于m_k模块,这样就建立了待加载模块m_e与m_k之间的依赖关系,在模块m_e中记录对模块m_k的依赖,而在m_k中也同样记录存在来自m_e的依赖。当需要卸载模块m_k时,需要查询有没有对m_k的依赖,如果有,不能直接卸载。如果没有,直接卸载该模块,并且通知所有m_k所依赖的模块,让这些模块在自己的依赖链表中删除m模块。模块及它们之间的依赖关系可以用一个有向图来描述,每个模块作为图的一个结点,各个结点都拥有出度(依赖于哪些模块)和入度(哪些模块依赖于它),这样就可以把对模块依赖关系的处理当作对图来处理,利用数据结构中对图的处理方法进行算法设计。设计两个链表,分别用来记录每个模块对该模块的依赖信息,和该模块对其他模块的依赖信息。当软件模块进行加\卸载的时候,就变成了对链表的添加和删除操作。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1