CN100432931C - 嵌入式系统动态补丁长跳转的实现方法 - Google Patents
嵌入式系统动态补丁长跳转的实现方法 Download PDFInfo
- Publication number
- CN100432931C CN100432931C CNB2006101680737A CN200610168073A CN100432931C CN 100432931 C CN100432931 C CN 100432931C CN B2006101680737 A CNB2006101680737 A CN B2006101680737A CN 200610168073 A CN200610168073 A CN 200610168073A CN 100432931 C CN100432931 C CN 100432931C
- Authority
- CN
- China
- Prior art keywords
- patch
- function
- small
- address
- jump
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Images
Landscapes
- Stored Programmes (AREA)
Abstract
本发明公开了一种嵌入式系统动态补丁长跳转的实现方法,解决了现有动态补丁升级时会覆盖掉被补丁函数可执行语句的机器码,造成被补丁函数的破坏的问题。包括:在被补丁函数所在的短跳转地址范围内为补丁小函数区和补丁函数区分配内存;并将补丁小函数对应的短跳转至的补丁小函数地址,和补丁函数对应的补丁函数地址写入补丁文件;在补丁函数加载到内存时,需要为被补丁函数的序言指令准备相应的短跳转指令;为被补丁函数短跳转至的小函数准备相应的长跳转指令;在补丁激活时,短跳转指令替换被补丁函数序言的第一条指令;通过短跳转至小函数再跳转至补丁函数,实现动态补丁升级的长跳转。本发明满足了嵌入式软件动态补丁对长跳转的需求。
Description
技术领域
本发明涉及一种软件动态补丁升级时长跳转的方法,尤其涉及一种当补丁函数和被补丁函数的相对地址超过短跳转地址范围时长跳转的实现方法。
背景技术
软件补丁是计算机软件系统和软件工程学中的一个术语,它一般是为了对系统软件中的某些错误进行修改而发布的独立的软件单元。而软件动态补丁升级技术,是在不影响系统正常运行的情况下完成对系统错误的修复,即在软件运行过程中,用补丁模块实时替换旧的模块,不需要打断原有程序的执行顺序。
在嵌入式领域,现有的动态补丁升级技术,通常采用的技术方案如图1所示。
其中,前台是运行嵌入式软件的目标机或是目标单板,后台(一般是个人计算机(PC))主要完成对前台信息的收集、管理、监控。该方案在后台完成补丁文件的制作,同时通过补丁服务进程同前台通信,以完成对动态补丁的监控;前台补丁监控进程和后台通信,同时完成对动态补丁的加载和升级。
动态补丁升级的实质是在软件运行过程中,修改被补丁函数序言部分的第一条指令,使其执行一个跳转指令,从而跳转到内存中补丁函数所在的地址处。
对于一般的嵌入式软件,由于其代码段和数据段在内存中都位于短跳转地址范围内(如PowerPC处理器,地址范围为0×0~16M),所以使用短跳转就可以满足要求,实现动态补丁的升级。但是随着软件规模的不断增大,当代码段和数据段的大小在内存中大于短跳转地址范围,以至补丁函数和被补丁函数之间的相对距离超过短跳转地址范围以后,动态补丁的短跳转就不能够很好的工作了。
要在嵌入式系统软件中实现动态补丁的长跳转,现有的解决方案一般都是直接使用相应处理器提供的长跳转指令。但是在动态补丁升级过程中直接使用处理器长跳转指令却往往引入了其他问题,使嵌入式系统软件动态补丁升级出现灾难性的结果。由于不同的处理器其提供的指令名称、格式都不相同,下面以在嵌入式领域有广泛应用的PowerPC处理器来说明动态补丁长跳转的现有解决方案及其存在的弊端:
1、使用链接寄存器(LR)保存补丁函数的绝对地址,在条件满足时,通过跳转指令bclr或是bclrl跳转到补丁函数。
由于动态补丁一般都需要进行函数级别的替换,而对于函数替换,LR寄存器需要保存函数的返回地址,所以bclr或是bclrl跳转破坏了函数的返回地址,必须增加额外的LR寄存器的保护工作,稍有不慎,便会导致补丁函数执行完后无法返回到上层函数的异常;同时还对动态补丁升级中被补丁函数的可补丁提出额外的限制,比如被补丁函数的长度、被补丁函数的位置等等。
2、使用计数寄存器(CTR)保存补丁函数的绝对地址,通过4条指令(最少指令数,一条绝对地址的高16位赋值,一条绝对地址的低16位赋值,一条向CTR赋值,一条通过bcctr指令跳转)实现长跳转。
该方案在CTR没有被其他进程(线程)使用时可以正常工作,但是一旦该进程被其他进程(线程)抢占并且同步修改CTR后,可能造成系统运行环境的更改,导致动态补丁功能的异常。由于在动态补丁升级中,被补丁函数的情况差别很大,无法确定CTR是否在补丁函数中被更改。
3、把被补丁函数从序言处替换为一个小函数,该小函数的功能是保存CTR、LR,通过函数调用方式调用补丁函数(仍然使用bcctr指令实现跳转),调用补丁函数返回后再恢复CTR、LR寄存器的值,返回到被补丁函数的调用者。
该技术方案是否可行,取决于补丁函数替换的时机、被替换的函数的大小以及替换时的保护。有可能出现如图2所示的异常情况。在被补丁函数的序言处开始用小函数(指令替换区)的机器码覆盖,由于被补丁函数的函数序言最多只有6条指令(重定位函数最少有6条指令,非重定位函数最少3条指令),而小函数实现最少需要7条指令,所以动态补丁升级时会覆盖掉被补丁函数可执行语句的机器码,造成被补丁函数的破坏,一旦动态补丁升级中出现异常,需要返回到动态补丁升级前的状态时,由于被补丁函数的机器码已被修改,就会造成任务的执行错误。所以该方案实现起来需要解决的问题较多。
对于嵌入式系统软件的动态补丁升级,直接使用处理器提供的长跳转指令来实现的方案,都存在类似如上所述严重缺陷。
发明内容
针对现有技术存在的缺陷和不足,本发明提供一种嵌入式系统动态补丁长跳转的实现方法,以达到实现动态补丁长跳转的目的。
为达到上述目的,本发明采用以下技术方案:
本发明嵌入式系统软件动态补丁长跳转的实现方法,包括如下步骤:
步骤A,在被补丁函数所在的短跳转地址范围内为补丁小函数区和补丁函数区分配内存;并将补丁小函数对应的短跳转至的补丁小函数地址,和补丁函数对应的补丁函数地址写入补丁文件;
步骤B,在补丁函数加载到内存时,需要为被补丁函数的序言指令准备相应的短跳转指令;为被补丁函数短跳转至的小函数准备相应的长跳转指令;
步骤C,在补丁激活时,使用步骤B的短跳转指令替换被补丁函数序言的第一条指令;通过短跳转至小函数再跳转至补丁函数,实现动态补丁升级的长跳转。
优选的:在所述的嵌入式系统软件动态补丁长跳转的实现方法中,还包括:
步骤D,在补丁函数执行完后返回到小函数区,小函数区对相关寄存器进行弹栈恢复,同时返回链接寄存器保存的补丁函数返回地址。
优选的:在所述的嵌入式系统软件动态补丁长跳转的实现方法中,还包括:
步骤E,在补丁卸载时,释放步骤A申请的补丁小函数占用的内存和补丁函数占用的内存。
优选的:在所述的嵌入式系统软件动态补丁长跳转的实现方法中,步骤A中小函数区的大小是确定的,每个补丁函数对应一个小函数,其执行寄存器压栈、赋值补丁函数地址、长跳转、寄存器弹栈、函数返回,对于不同的处理器,都有一个固定的字节大小,这对于该小函数区的管理提供了很大方便;小函数区的起始地址需要保存,以备被补丁函数序言的短跳转。
本发明在实现嵌入式系统软件动态补丁长跳转时可以有效避免目前技术方案存在的缺点和不完善,同时在原有的短跳转技术的基础上可以顺利过渡到长跳转,满足嵌入式软件动态补丁对长跳转的需求;同时,该发明对于短跳转也是同样兼容的。
附图说明
图1为嵌入式系统动态补丁升级的软件总体方案示意图。
图2为被补丁函数序言替换为小函数方案缺陷分析示意图。
图3为动态补丁长跳转过程示意图。
图4为为补丁函数分配的空间写入补丁文件示意图。
图5为A)补丁文件格式示意图,B)替换函数表示意图。
图6为动态补丁升级长跳转实现示意图。
具体实施方式
下面结合附图对本发明进行详细描述。
以下为一个本发明实际应用的具体实例,是在PowerPC处理器下面的具体应用。
参见图3,图3给出了此实例完成基于PowerPC处理器动态补丁长跳转完整过程的示意图。要完成基于PowerPC处理器动态补丁长跳转的目的,本实例需要如下的步骤:
(1)步骤1:系统发现程序中的错误后,在根据补丁源文件(.c)生成补丁文件(补丁文件示意图如图5所示)时,在前台根据补丁小函数区大小(一个补丁对应一个小函数)和补丁函数大小在规划好(满足小函数区同被补丁函数区在短跳转地址范围(16M)以内的地址空间中)的内存中分配大小。并由后台将其地址写入补丁文件,即图5B所示的短跳转至的地址和去补丁函数地址(交互过程如图4)。
其中,短跳转函数区的大小固定,为7条指令大小(CTR压栈、取补丁函数地址高16位、取补丁函数地址低16位、向CTR赋值补丁函数地址、bcctr跳转、CTR弹栈、函数返回,共28字节);补丁函数大小需要根据补丁源文件计算其代码段和数据段大小。
(2)步骤2-1:在补丁函数加载到内存时,需要为被补丁函数的序言指令准备相应的短跳转指令。此时从补丁文件中读出短跳转所至的小函数地址,比如该实例中为addrl=0×d762c。然后填写相应的跳转指令,本实例中短跳转指令为ba,ba指令中AA为1,LK位为0(故替换指令dwRepInst|=0×2;),指令码0~5位,为18;短跳转地址在6~29位(故替换指令dwRepInst|=0×48000000;)。
(3)步骤2-2:在补丁函数加载到内存时,需要为被补丁函数短跳转至的小函数区准备相应的长跳转指令。此时从补丁文件中读出长跳转所至的补丁函数地址,例如该实例中为addr2=0×532d7600。由于该段汇编代码需要实现CTR的压栈、取addr2的高16位的地址、取addr2的低16位的地址、向CTR赋值addr2、bcctr跳转、CTR弹栈、函数返回功能,共需要7条汇编指令,为了使该小函数区保持最少的汇编指令,同时又能够根据需要读取每个补丁函数的地址addr2。最好的办法是直接在addrl地址写上述7条汇编指令的机器码,比如该实例中,可以直接在addrl地址开始处写9121fffc 3ca0 532d 38a5 7600 7ca90 3a6 4c800420 8121 fffc 4e80 0020机器码,共28字节。
(4)步骤3:在补丁激活时,使用步骤2-1的短跳转指令替换被补丁函数序言的第一条指令。则通过短跳转至小函数区再跳转至补丁函数区,实现了动态补丁升级的长跳转。
(5)步骤4:在补丁去激活时,恢复被补丁函数先前的序言部分,则可以避免故障补丁的影响。
(6)步骤5:在补丁卸载时,为了最大程度的利用内存资源,需要释放步骤1申请的短跳转地址和去补丁函数地址。
上述步骤的示意过程参见图6。
可见,上述实例通过短跳转成功实现了动态补丁的长跳转,有效避免了目前现有技术方案中存在的隐患,保证了动态补丁的升级从相对地址小于短跳转地址范围顺利过渡到相对地址大于短跳转地址的补丁函数。该发明可以实现动态补丁短跳转到长跳转的有效升级,同时最大程度的减小动态补丁软件的升级成本,在嵌入式软件领域有很大的推广价值和实用价值。
Claims (4)
1、嵌入式系统软件动态补丁长跳转的实现方法,包括如下步骤:
步骤A,在被补丁函数所在的短跳转地址范围内为补丁小函数区和补丁函数区分配内存;并将补丁小函数对应的短跳转至的补丁小函数地址,和补丁函数对应的补丁函数地址写入补丁文件;
步骤B,在补丁函数加载到内存时,需要为被补丁函数的序言指令准备相应的短跳转指令;为被补丁函数短跳转至的小函数准备相应的长跳转指令;
步骤C,在补丁激活时,使用步骤B的短跳转指令替换被补丁函数序言的第一条指令;通过短跳转至小函数再跳转至补丁函数,实现动态补丁升级的长跳转。
2、根据权利要求1所述的嵌入式系统软件动态补丁长跳转的实现方法,其特征在于还包括:
步骤D,在补丁函数执行完后返回到小函数区,小函数区对相关寄存器进行弹栈恢复,同时返回链接寄存器保存的补丁函数返回地址。
3、根据权利要求2所述的嵌入式系统软件动态补丁长跳转的实现方法,其特征在于还包括:
步骤E,在补丁卸载时,释放步骤A申请的补丁小函数占用的内存和补丁函数占用的内存。
4、根据权利要求1所述的嵌入式系统软件动态补丁长跳转的实现方法,其特征在于步骤A中小函数区的大小是确定的,每个补丁函数对应一个小函数,其执行寄存器压栈、赋值补丁函数地址、长跳转、寄存器弹栈、函数返回,对于不同的处理器,都有一个固定的字节大小,这对于该小函数区的管理提供了很大方便;小函数区的起始地址需要保存,以备被补丁函数序言的短跳转。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNB2006101680737A CN100432931C (zh) | 2006-12-22 | 2006-12-22 | 嵌入式系统动态补丁长跳转的实现方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNB2006101680737A CN100432931C (zh) | 2006-12-22 | 2006-12-22 | 嵌入式系统动态补丁长跳转的实现方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101004681A CN101004681A (zh) | 2007-07-25 |
CN100432931C true CN100432931C (zh) | 2008-11-12 |
Family
ID=38703854
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNB2006101680737A Expired - Fee Related CN100432931C (zh) | 2006-12-22 | 2006-12-22 | 嵌入式系统动态补丁长跳转的实现方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN100432931C (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102982277A (zh) * | 2012-12-24 | 2013-03-20 | 广东威创视讯科技股份有限公司 | 一种实现嵌入式系统软件补丁的方法和系统 |
Families Citing this family (17)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101482834B (zh) * | 2009-01-20 | 2012-02-22 | 华为技术有限公司 | 在线补丁激活方法、通信装置及系统 |
CN101697131B (zh) | 2009-11-04 | 2013-07-03 | 中兴通讯股份有限公司 | 一种可重定位文件动态加载的方法及装置 |
CN103218262B (zh) * | 2010-02-11 | 2017-03-15 | 华为技术有限公司 | 在线补丁的激活方法、装置及系统 |
CN102156661B (zh) | 2010-02-11 | 2013-06-12 | 华为技术有限公司 | 在线补丁的激活方法、装置及系统 |
CN102547740B (zh) | 2011-12-31 | 2015-03-25 | 华为技术有限公司 | 干扰消除方法、设备及通信系统 |
CN102609241B (zh) * | 2012-01-19 | 2018-04-27 | 中兴通讯股份有限公司 | 热补丁方法及装置 |
CN103294457B (zh) * | 2012-02-27 | 2017-02-01 | 百度在线网络技术(北京)有限公司 | 动态替换主程序中c/c++函数的方法及装置 |
CN103399774A (zh) * | 2013-07-29 | 2013-11-20 | 华为技术有限公司 | 链接方法及链接器及计算机系统 |
CN103399775A (zh) * | 2013-08-05 | 2013-11-20 | 北京华为数字技术有限公司 | 一种热补丁方法及设备 |
CN104424037B (zh) * | 2013-08-29 | 2018-12-14 | 中兴通讯股份有限公司 | 一种动态补丁函数的方法及装置 |
CN103530184B (zh) * | 2013-10-24 | 2017-04-12 | 华为技术有限公司 | 一种在线补丁激活的方法及装置 |
CN104809018B (zh) * | 2015-05-18 | 2018-01-02 | 烽火通信科技股份有限公司 | 一种嵌入式系统软件注入热补丁的方法及系统 |
CN107357622B (zh) * | 2017-07-17 | 2020-09-22 | 迈普通信技术股份有限公司 | 热补丁实现方法及通信设备 |
CN107797820B (zh) | 2017-11-13 | 2021-03-23 | 北京百度网讯科技有限公司 | 用于生成补丁的方法和装置 |
CN110045980B (zh) * | 2019-05-22 | 2022-09-02 | 东信和平科技股份有限公司 | 一种对nb-iot设备的远程升级方法、设备及系统 |
CN110262838A (zh) * | 2019-06-14 | 2019-09-20 | 深圳乐信软件技术有限公司 | 一种程序崩溃的处理方法、装置、终端及存储介质 |
CN111694594B (zh) * | 2020-05-18 | 2023-03-03 | 成都盛芯微科技有限公司 | 补丁程序的控制方法和系统 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6260157B1 (en) * | 1999-02-16 | 2001-07-10 | Kurt Schurecht | Patching of a read only memory |
CN1475909A (zh) * | 2002-08-16 | 2004-02-18 | 华为技术有限公司 | 一种嵌入式系统软件补丁的实现和控制方法 |
CN1737773A (zh) * | 2004-08-16 | 2006-02-22 | 上海华为技术有限公司 | 对嵌入式系统进行在线监测的方法及其系统 |
CN1770108A (zh) * | 2004-11-05 | 2006-05-10 | 华为技术有限公司 | 软件在线升级的方法 |
-
2006
- 2006-12-22 CN CNB2006101680737A patent/CN100432931C/zh not_active Expired - Fee Related
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6260157B1 (en) * | 1999-02-16 | 2001-07-10 | Kurt Schurecht | Patching of a read only memory |
CN1475909A (zh) * | 2002-08-16 | 2004-02-18 | 华为技术有限公司 | 一种嵌入式系统软件补丁的实现和控制方法 |
CN1737773A (zh) * | 2004-08-16 | 2006-02-22 | 上海华为技术有限公司 | 对嵌入式系统进行在线监测的方法及其系统 |
CN1770108A (zh) * | 2004-11-05 | 2006-05-10 | 华为技术有限公司 | 软件在线升级的方法 |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102982277A (zh) * | 2012-12-24 | 2013-03-20 | 广东威创视讯科技股份有限公司 | 一种实现嵌入式系统软件补丁的方法和系统 |
Also Published As
Publication number | Publication date |
---|---|
CN101004681A (zh) | 2007-07-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN100432931C (zh) | 嵌入式系统动态补丁长跳转的实现方法 | |
CN101763279B (zh) | 一种BootLoader架构设计方法 | |
CN101799763B (zh) | 内核在线补丁的方法、装置和系统 | |
CN101334825B (zh) | 应用程序管理和运行系统及方法 | |
US9798595B2 (en) | Transparent user mode scheduling on traditional threading systems | |
US7774636B2 (en) | Method and system for kernel panic recovery | |
CN100511156C (zh) | 强制性地终止输入/输出操作阻止的线程的设备和方法 | |
KR20010030592A (ko) | 하드웨어 원조된 문맥 스위칭 능력을 가진 데이터프로세싱 유닛 | |
CN101324850B (zh) | Linux内核动态加载方法 | |
CN100465893C (zh) | 一种嵌入式操作系统驱动程序动态升级方法 | |
CN105260270A (zh) | 一种Flash存储空间的动态恢复方法及装置 | |
CN101477491A (zh) | 一种统计函数运行状态的方法和装置 | |
CN102667714B (zh) | 支持访问由操作系统环境外的资源提供的功能的方法和系统 | |
CN105550029A (zh) | 一种进程调度方法及装置 | |
CN104965708A (zh) | 一种应用程序运行过程的内存管理方法及装置 | |
CN106547606B (zh) | 堆栈自检方法及装置 | |
US20030120712A1 (en) | Task context switching RTOS | |
CN101236489A (zh) | 虚拟硬件系统及其指令执行方法、以及虚拟机 | |
CN108255526B (zh) | 一种系统启动及运行的方法、装置 | |
CN103761118A (zh) | 一种智能卡及智能卡内部署应用的方法 | |
CN109933358B (zh) | 用于减少计量设备程序升级量的控制方法 | |
CN106354560B (zh) | 一种系统的维护进程运行方法及装置 | |
CN115659322B (zh) | 一种基于运行时顺序调度装载的代码复用攻击防御方法 | |
US7934073B2 (en) | Method for performing jump and translation state change at the same time | |
CN1818824A (zh) | 一种可靠性高的个人计算机及操作系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20081112 Termination date: 20171222 |