本发明专利技术公开了一种嵌入式系统软件注入热补丁的方法及系统,涉及嵌入式系统软件补丁技术领域。该方法包括:在软件程序中预留若干二级跳转表预留区,在补丁文件中预留若干三级跳转表预留区;为每一个原函数分配最近的二级跳转指令存储空间,为每个补丁函数分配最近的三级跳转指令存储空间;生成每个原函数的二级跳转指令序列,并存储于对应的二级跳转指令存储空间内,生成每个补丁函数的三级跳转指令序列,并存储于对应的三级跳转指令序列空间内;最后,将每个原函数的首条指令修改为一级跳转指令。本发明专利技术不影响系统程序的运行,也无需修改编译器;且内存空间浪费少,补丁启用时间短。
【技术实现步骤摘要】
本专利技术涉及嵌入式系统软件补丁
,具体来讲是一种嵌入式系统软件注入热补丁的方法及系统。
技术介绍
嵌入式系统应用非常广泛,家用DVD、机顶盒、通信设备中的交换机、路由器等都使用了嵌入式系统。嵌入式系统软件在嵌入式系统中具有举足轻重的作用,用户对嵌入式系统软件的连续运行时间和稳定性要求很高。如果嵌入式系统软件存在一般性的软件错误,采用热补丁技术进行在线修改软件的错误,能提高软件的连续运行时间和稳定性。目前嵌入式系统软件注入热补丁的实现方式主要有以下两种:(I)在编译程序的时候,在每一个函数首条指令的前面(指令地址递减方向)预留一定的空白区域,用以安排该函数的跳转指令序列,跳转到该函数的补丁函数。利用此种方法可以实现在线修复软件的错误,但是这种方式需要修改编译器,提供热补丁支持,同时每一个函数都预留一定的空白区域,有点浪费内存空间。(2)直接在函数的头部区域插入该函数的跳转指令序列,跳转到该函数的补丁函数。利用此种方法同样可以实现在线修复软件的错误,但是这种方式需要停止除本线程之外的其他所有线程的运行,待插入该函数的跳转指令序列完成之后再恢复停止运行的线程,因此采用该种方法会影响程序的运行,补丁的启用过程时间较长。
技术实现思路
本专利技术的目的是为了克服上述
技术介绍
的不足,提供一种嵌入式系统软件注入热补丁的方法及系统,不影响系统程序的运行,也无需修改编译器;且内存空间浪费少,补丁启用时间短。为达到以上目的,本专利技术提供一种嵌入式系统软件注入热补丁的方法,包括以下步骤:S1、在软件的程序编译阶段,在软件程序的各模块代码段中预留出若干二级跳转表预留区;在软件的补丁文件编译阶段,在补丁文件的各模块代码段中预留出若干三级跳转表预留区,转入步骤S2;S2、将离每个原函数最近的二级跳转表预留区,作为该原函数的二级跳转指令存储空间;将离每个补丁函数最近的三级跳转表预留区,作为该补丁函数的三级跳转指令存储空间;生成每个原函数的二级跳转指令序列,并存储于对应的二级跳转指令存储空间内;生成每个补丁函数的三级跳转指令序列,并存储于对应的三级跳转指令序列空间内,转入步骤S3 ;S3、将每个原函数的首条指令修改为一级跳转指令;当系统运行每个原函数时,根据该原函数的一级跳转指令,由原函数跳转至对应二级跳转指令序列的首地址;根据该二级跳转指令序列,由该二级跳转指令序列跳转至对应三级跳转指令序列的首地址;根据该三级跳转指令序列,最终由三级跳转指令序列到函数补丁的跳转。在上述技术方案的基础上,步骤S2包括以下步骤:S201、查找并记录补丁文件中的补丁函数后,将补丁文件加载至系统中,转入步骤S202 ;S202、记录所有补丁函数的地址;根据补丁函数名查找对应原函数的地址,转入步骤 S203 ;S203、在软件程序中查找二级跳转表预留区,记录二级跳转表预留区信息,转入步骤 S204 ;S204、在补丁文件中查找三级跳转表预留区,记录三级跳转表预留区信息,转入步骤 S205 ;S205、根据原函数的地址、二级跳转表预留区信息,将离每个原函数最近的二级跳转表预留区作为该原函数的二级跳转指令存储空间;根据补丁函数的地址、三级跳转表预留区信息,将离每个补丁函数最近的三级跳转表预留区作为该补丁函数的三级跳转指令存储空间,转入步骤S206 ;S206、根据每个原函数的二级跳转指令存储空间的地址、以及对应的补丁函数的三级跳转指令存储空间的地址,生成每个原函数的二级跳转指令序列,并存储于对应的二级跳转指令存储空间内;根据补丁函数地址、以及该补丁函数的三级跳转指令存储空间的地址,生成每个补丁函数的三级跳转指令序列,并存储于对应的三级跳转指令序列空间内。在上述技术方案的基础上,步骤SI中所述预留出若干二级跳转表预留区的同时,需为二级跳转表预留区定义一个标示符;所述预留出若干三级跳转表预留区的同时,需为三级跳转表预留区定义一个标示符;步骤S201中所述将记录有补丁函数的补丁文件加载至系统中时,系统将自动为补丁文件的各模块生成对应的补丁文件模块名;步骤S203具体包括以下步骤:获取并分析软件程序符号表中的一个符号信息;若符号名为二级跳转表预留区标示符、且符号所在模块的模块名不是补丁文件模块名,则确定查找到二级跳转表预留区,记录该二级跳转表预留区地址、模块名;判断软件程序符号表是否全部查找完毕,若是,转到步骤S204,若否,重新执行步骤S203 ;若符号名不为二级跳转表预留区标示符、或者符号所在模块的模块名是补丁文件模块名,则判断软件程序符号表是否全部查找完毕,若是,转到步骤S204,若否,重新执行步骤 S203。在上述技术方案的基础上,步骤S204具体包括以下步骤:获取并分析补丁文件符号表中的一个符号信息;若符号名为三级跳转表预留区标示符、且符号所在模块的模块名是补丁文件模块名,则确定查找到三级跳转表预留区,记录该三级跳转表预留区地址、模块名;判断补丁文件符号表是否全部查找完毕,若是,转到步骤S205,若否,重新执行步骤S204 ;若符号名不为三级跳转表预留区标示符、或者符号所在模块的模块名不是补丁文件模块名,则判断补丁文件符号表是否全部查找完毕,若是,转到步骤S205,若否,重新执行步骤S204。在上述技术方案的基础上,步骤S201中所述补丁函数为符合补丁函数命名规则的函数,所述补丁函数命名规则为:补丁函数名=原函数名+补丁标示+用户自定义项。在上述技术方案的基础上,步骤S2中所述二级跳转指令序列包括:将返回地址寄存器的值压入堆栈的指令、将跳转指令需要使用的寄存器压入堆栈的指令、将三级跳转指令序列的首地址赋值给寄存器的指令、跳转到三级跳转指令序列首地址的指令;所述三级跳转指令序列包括:还原二级跳转指令序列所使用的寄存器的值的指令、还原返回地址寄存器的值的指令、跳转至补丁函数首条地址的指令。在上述技术方案的基础上,步骤SI中,通过修改软件程序的链接脚本,在软件程序的各模块代码段中预留出若干二级跳转表预留区;通过修改补丁文件的链接脚本,在补丁文件的各模块代码段中预留出若干三级跳转表预留区。在上述技术方案的基础上,步骤S3之后还包括热补丁去激活的步骤:将原函数的首条指令还原为未修改成一级跳转指令之前的原指令。本专利技术还提供一种嵌入式系统软件注入热补丁的系统,包括跳转表预留区管理模块、热补丁安装模块和热补丁激活模块,其中:所述跳转表预留区管理模块用于:在软件的程序编译阶段,在软件程序的各模块代码段中预留出若干二级跳转表预留区;在软件的补丁文件编译阶段,在补丁文件的各模块代码段中预留出若干三级跳转表预留区;向热补丁安装模块发送热补丁安装信号;所述热补丁安装模块用于:收到热补丁安装信号后,将离每个原函数最近的二级跳转表预留区,作为该原函数的二级跳转指令存储空间;将离每个补丁函数最近的三级跳转表预留区,作为该补丁函数的三级跳转指令存储空间;生成每个原函数的二级跳转指令序列,并存储于对应的二级跳转指令存储空间内;生成每个补丁函数的三级跳转指令序列,并存储于对应的三级跳转指令序列空间内;向热补丁激活模块发送热补丁激活信号;所述热补丁激活模块用于:收到热补丁激活信号后,将每个原函数的首条指令修改为一级跳转指令;当系统运行每个原函数时,先根据该原函数的一级跳转本文档来自技高网...
【技术保护点】
一种嵌入式系统软件注入热补丁的方法,其特征在于,包括以下步骤:S1、在软件的程序编译阶段,在软件程序的各模块代码段中预留出若干二级跳转表预留区;在软件的补丁文件编译阶段,在补丁文件的各模块代码段中预留出若干三级跳转表预留区,转入步骤S2;S2、将离每个原函数最近的二级跳转表预留区,作为该原函数的二级跳转指令存储空间;将离每个补丁函数最近的三级跳转表预留区,作为该补丁函数的三级跳转指令存储空间;生成每个原函数的二级跳转指令序列,并存储于对应的二级跳转指令存储空间内;生成每个补丁函数的三级跳转指令序列,并存储于对应的三级跳转指令序列空间内,转入步骤S3;S3、将每个原函数的首条指令修改为一级跳转指令;当系统运行每个原函数时,根据该原函数的一级跳转指令,由原函数跳转至对应二级跳转指令序列的首地址;根据该二级跳转指令序列,由该二级跳转指令序列跳转至对应三级跳转指令序列的首地址;根据该三级跳转指令序列,最终由三级跳转指令序列到函数补丁的跳转。
【技术特征摘要】
【专利技术属性】
技术研发人员:刘应江,简楹,
申请(专利权)人:烽火通信科技股份有限公司,
类型:发明
国别省市:湖北;42
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。