[go: up one dir, main page]
More Web Proxy on the site http://driver.im/

CN113918244A - 热补丁处理方法及装置 - Google Patents

热补丁处理方法及装置 Download PDF

Info

Publication number
CN113918244A
CN113918244A CN202111144914.1A CN202111144914A CN113918244A CN 113918244 A CN113918244 A CN 113918244A CN 202111144914 A CN202111144914 A CN 202111144914A CN 113918244 A CN113918244 A CN 113918244A
Authority
CN
China
Prior art keywords
address
processes
patch
business
hot patch
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.)
Granted
Application number
CN202111144914.1A
Other languages
English (en)
Other versions
CN113918244B (zh
Inventor
王海旭
贾宇
杨启军
王镜清
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Hillstone Networks Co Ltd
Original Assignee
Hillstone Networks Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Hillstone Networks Co Ltd filed Critical Hillstone Networks Co Ltd
Priority to CN202111144914.1A priority Critical patent/CN113918244B/zh
Publication of CN113918244A publication Critical patent/CN113918244A/zh
Application granted granted Critical
Publication of CN113918244B publication Critical patent/CN113918244B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4482Procedural
    • G06F9/4484Executing subprograms
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/60Software deployment
    • G06F8/65Updates
    • G06F8/656Updates while running
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/3005Arrangements for executing specific machine instructions to perform operations for flow control
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • G06F9/44521Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • G06F9/544Buffers; Shared memory; Pipes
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Security & Cryptography (AREA)
  • Stored Programmes (AREA)

Abstract

本发明公开了一种热补丁处理方法及装置。其中,该方法包括:通过第一接口将热补丁文件加载到多个业务进程分别对应的多个进程地址空间中,并分别确定多个业务进程分别对应的多个基址表,其中,多个基址表的地址相同,多个业务进程均为目标程序的进程;基于基址表的地址,生成多个业务进程统一的跳转指令,其中,跳转指令用于将业务进程从旧函数跳转至热补丁文件的补丁函数;将跳转指令写入目标程序的主进程,其中,主进程和多个业务进程共享内存。本发明解决了相关技术中的热补丁在多业务进程加载过程中,占用较多的内存,导致内存资源浪费的技术问题。

Description

热补丁处理方法及装置
技术领域
本发明涉及系统更新领域,具体而言,涉及一种热补丁处理方法及装置。
背景技术
对于一些业务要求严格的服务商来说,当软件版本遇上紧急问题时,传统方式升级因为时效性不足、需重中断业务,往往不能满足其严苛的升级条件。因此需要一种更为平滑,对业务影响更小的解决方法。即在设备不重启且不中断业务的前提下,来修改问题的方式。热补丁技术是一种快速低成本修复软件缺陷的技术方案。和升级软件版本相比,其主要目的在业务不中断、进程不重启的前提下,修改进程的执行逻辑,从而修复软件漏洞。热补丁包一般由软件供应商制作并发布,用户可以方便快捷的通过加载补丁包的方式,在保证对业务没有影响的前提下,解决相应的软件问题。
目前,较为成熟的技术方案是创建调试进程,使用ptrace系统调用(一种调试进程的系统调用接口,可直接修改进程内存,或是直接调用一些进程中存在的接口)直接修改进程代码段,以实现修改进程执行逻辑。
现有方案主要由以下执行以下步骤:1.创建调试进程,调用ptrace关联需要修改的目标程序。使其成为目标程序的调试父进程,从而可以在目标程序中调用函数及修改目标程序的地址空间。2.调试父进程通过ptrace调用dlopen(进程加载动态库的系统调用)接口,使目标程序将补丁动态库加载至进程地址空间中。3.调试父进程通过ptrace修改目标程序代码段中需要打补丁函数的函数入口处的指令,使用长跳转指令跳转至补丁动态库中新函数的函数入口中。4.调试父进程取消对目标程序的跟踪,并结束调试父进程。
对于多进程的程序模型(由主进程调用fork(创建子进程的系统调用)接口创建出若干个业务子进程)来说,由于其代码段内容完全一致,因此这些进程的代码段实际上映射同一块物理内存。
但是如果修改某一进程的代码段时,由于进程地址空间隔离的原则,会触发kernel的写时拷贝机制。Kernel对于内存管理的最小单位为页,因此无论改动多小的内存,kernel都会新分配一页内存,从共享的内存页将内容完全拷贝至新内存页上,并执行修改操作。
若该程序存在几十个进程,那么逐一修改代码段会多占用几十个内存页,产生大量的内存浪费。如果该情况发生在一个小内存的并使用hugepage(一种大页内存管理机制,其一页内存会占用2048K或4096K的空间,可以减少系统中内存页的数量,减少页表层级,有效减少TLB miss的几率,从而提高系统性能)的嵌入式设备上,大量的内存浪费是无法接受的。
针对上述的问题,目前尚未提出有效的解决方案。
发明内容
本发明实施例提供了一种热补丁处理方法及装置,以至少解决相关技术中的热补丁在多业务进程加载过程中,占用较多的内存,导致内存资源浪费的技术问题。
根据本发明实施例的一个方面,提供了一种热补丁处理方法,其特征在于,包括:通过第一接口将热补丁文件加载到多个业务进程分别对应的多个进程地址空间中,并分别确定多个业务进程分别对应的多个基址表,其中,多个所述基址表的地址相同,所述多个业务进程均为目标程序的进程;基于所述基址表的地址,生成多个所述业务进程统一的跳转指令,其中,所述跳转指令用于将业务进程从旧函数跳转至所述热补丁文件的补丁函数;将所述跳转指令写入所述目标程序的主进程,其中,所述主进程和所述多个业务进程共享内存。
可选的,通过第一接口将热补丁文件加载到多个业务进程分别对应的多个进程地址空间中,并分别确定多个业务进程分别对应的多个基址表包括:通过第一接口将所述热补丁文件加载多个业务进程的分别对应的多个进程地址空间中,生成多个业务进程分别对应的基地址,其中,所述基地址用于调用所述热补丁文件;每个业务进程将对应的基地址写入自身的基址表中,确定多个业务进程分别对应的多个基址表。
可选的,基于所述基址表的地址,生成多个所述业务进程统一的跳转指令包括:获取所述热补丁文件中补丁函数的地址偏移;根据所述基址表的地址和所述地址偏移,生成所述跳转指令。
可选的,将所述跳转指令写入所述目标程序的主进程包括:确定所述热补丁文件在所述主进程中的目标地址,其中,所述主进程的目标地址与内存共享的多个业务进程共享;将所述跳转指令写入所述目标地址。
可选的,将所述跳转指令写入所述目标程序的主进程之后,还包括:在目标业务进程运行至目标地址的情况下,响应所述跳转指令,根据所述基址表的地址获取所述热补丁文件相对于所述目标业务进程的基地址,其中,所述目标业务进程为多各所述业务进程中任一业务进程;根据所述基地址与所述地址偏移,确定所述补丁函数的执行地址;根据所述执行地址,执行所述补丁函数。
可选的,将所述跳转指令写入所述目标地址之前,还包括:通过所述主进程对多个所述业务进程发送预修改通知,其中,所述预修改通知用于通知业务进程停止运行;在接收到多个所述业务进程对所述预修改通知的应答成功消息的情况下,激活所述热补丁文件中预设的预处理函数,以对所述热补丁文件进行写入处理。
可选的,通过第一接口将热补丁文件加载到多个业务进程分别对应的多个进程地址空间中,并分别确定多个业务进程分别对应的多个基址表之前,还包括:对所述热补丁文件进行校验,至少包括下列之一:来源校验,版本校验,完整性校验,目标程序校验。
根据本发明实施例的另一方面,还提供了一种热补丁处理装置,包括:加载模块,用于通过第一接口将热补丁文件加载到多个业务进程分别对应的多个进程地址空间中,并分别确定多个业务进程分别对应的多个基址表,其中,多个所述基址表的地址相同,所述多个业务进程均为目标程序的进程;生成模块,用于基于所述基址表的地址,生成多个所述业务进程统一的跳转指令,其中,所述跳转指令用于将业务进程从旧函数跳转至所述热补丁文件的补丁函数;写入模块,用于将所述跳转指令写入所述目标程序的主进程,其中,所述主进程和所述多个业务进程共享内存。
根据本发明实施例的另一方面,还提供了一种处理器,所述处理器用于运行程序,其中,所述程序运行时执行上述中任意一项所述的热补丁处理方法。
根据本发明实施例的另一方面,还提供了一种计算机存储介质,所述计算机存储介质包括存储的程序,其中,在所述程序运行时控制所述计算机存储介质所在设备执行上述中任意一项所述的热补丁处理方法。
在本发明实施例中,采用通过第一接口将热补丁文件加载到多个业务进程分别对应的多个进程地址空间中,并分别确定多个业务进程分别对应的多个基址表,其中,多个基址表的地址相同,多个业务进程均为目标程序的进程;基于基址表的地址,生成多个业务进程统一的跳转指令,其中,跳转指令用于将业务进程从旧函数跳转至热补丁文件的补丁函数;将跳转指令写入目标程序的主进程,其中,主进程和多个业务进程共享内存的方式,通过根据热补丁在多个业务进程的基址表,生成多个业务统一的跳转指令,将该跳转指令写入共享内存的主程序,达到了多个业务进程都可以采用共享内存的主进程中的同一跳转指令,实现跳转热补丁函数的目的,从而实现了避免多个业务进程分别各自设置跳转指令和内存空间来跳转热补丁函数,降低了热补丁在多业务进程加载过程中的占用内存,极大地节省了内存资源的技术效果,进而解决了相关技术中的热补丁在多业务进程加载过程中,占用较多的内存,导致内存资源浪费的技术问题。
附图说明
此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1是现有技术中热补丁执行逻辑的流程图;
图2是根据本发明实施例的一种热补丁处理方法的流程图;
图3是根据本发明实施方式的多进程的热补丁执行的流程图;
图4是根据本发明实施方式的热补丁加载的示意图;
图5是根据本发明实施方式的多进程基址表的示意图;
图6是根据本发明实施方式的主进程加载热补丁的流程图;
图7是根据本发明实施方式的业务进程加载热补丁的流程图;
图8是根据本发明实施例的一种热补丁处理装置的示意图。
具体实施方式
为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
根据本发明实施例,提供了一种热补丁处理方法的方法实施例,需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
图2是根据本发明实施例的一种协议数据的处理方法的流程图,如图2所示,该方法包括如下步骤:
步骤S202,通过第一接口将热补丁文件加载到多个业务进程分别对应的多个进程地址空间中,并分别确定多个业务进程分别对应的多个基址表,其中,多个基址表的地址相同,多个业务进程均为目标程序的进程;
步骤S204,基于基址表的地址,生成多个业务进程统一的跳转指令,其中,跳转指令用于将业务进程从旧函数跳转至热补丁文件的补丁函数;
步骤S206,将跳转指令写入目标程序的主进程,其中,主进程和多个业务进程共享内存。
通过上述步骤,采用通过第一接口将热补丁文件加载到多个业务进程分别对应的多个进程地址空间中,并分别确定多个业务进程分别对应的多个基址表,其中,多个基址表的地址相同,多个业务进程均为目标程序的进程;基于基址表的地址,生成多个业务进程统一的跳转指令,其中,跳转指令用于将业务进程从旧函数跳转至热补丁文件的补丁函数;将跳转指令写入目标程序的主进程,其中,主进程和多个业务进程共享内存的方式,通过根据热补丁在多个业务进程的基址表,生成多个业务统一的跳转指令,将该跳转指令写入共享内存的主程序,达到了多个业务进程都可以采用共享内存的主进程中的同一跳转指令,实现跳转热补丁函数的目的,从而实现了避免多个业务进程分别各自设置跳转指令和内存空间来跳转热补丁函数,降低了热补丁在多业务进程加载过程中的占用内存,极大地节省了内存资源的技术效果,进而解决了相关技术中的热补丁在多业务进程加载过程中,占用较多的内存,导致内存资源浪费的技术问题。
上述热补丁文件可以为快速低成本修复软件缺陷的补丁。和升级软件版本相比,其主要目的在业务不中断、进程不重启的前提下,修改进程的执行逻辑,从而修复软件漏洞。上述业务进程为多个,属于目标程序的多个业务进程。业务进程为多个的情况下,在加载热补丁时,各自的加载进程独立,并需要创建各自业务进程缓存补丁文件的物理存储空间,这样就会导致,在多个业务进程加载热补丁文件时,需要占用大量的物理内存,导致内存资源浪费。
上述第一接口可以为目标程序的dl_open接口,通过该第一接口,可以将热补丁文件,例如,热补丁动态库,加载到多个业务进程各自的进程地址空间中。该进程地址空间时业务进程在目标程序中就设置有的,用于存储各个业务进程对应的进程地址。
在通过上述第一接口将上述热补丁文件加载到业务进程对应的进程地址空间后,就会自动生成该热补丁文件在业务进程中的基地址,也即是热补丁文件需要写入业务进程的具体地址,但是由于不同业务进程打补丁的位置不一样,上述第一接口也就无法保证热补丁文件加载到相同的进程地址空间中,就会导致每个业务进程的跳转指令不一致,也即是通过补丁函数打补丁的地址不一致,仍然会出现各自进行跳转,需要占用对应物联内存的问题。
因此,本实施例在将热补丁文件写入业务进程的进程地址空间时,将生成的热补丁文件的基地址,写入业务进程的基址表,在目标程序中,多个业务进程的多个基址表的地址相同。从而将热补丁文件的地址通过基址表的地址统一起来。
然后基于上述基址表的地址生成多个业务进程统一的跳转指令,由于多个业务进程的基址表的地址相同,其跳转至基址表的跳转指令也相同,而且对多个业务进程采用统一的跳转指令,在运行时,触发跳转指令后,就可以跳转至基址表,获取热补丁文件的基地址,从而获取并运行热补丁文件,完成对各个业务进程的打补丁过程。
跳转指令生成后,还需要将跳转指令与写入业务进程的内存中,以便业务进程在运行到跳转指令时,调用存储的跳转指令,以完成对热补丁的跳转。但是在各个业务进程中存储同一个跳转指令,还是需要将跳转指令多次拷贝,并创建多个物理内存,存在内存占用的问题,考虑到,目标程序的主程序和业务程序可以共享内存,本实施例将主进程和多个业务进程进行内存共享,则只需要一个内存空间,就可以实现对多个业务进程对跳转指令的存储要求。
可选的,通过第一接口将热补丁文件加载到多个业务进程分别对应的多个进程地址空间中,并分别确定多个业务进程分别对应的多个基址表包括:通过第一接口将热补丁文件加载多个业务进程的分别对应的多个进程地址空间中,生成多个业务进程分别对应的基地址,其中,基地址用于调用热补丁文件;每个业务进程将对应的基地址写入自身的基址表中,确定多个业务进程分别对应的多个基址表。
上述第一接口可以为dl_open接口,加载补丁时,补丁管理程序通知目标程序的主进程,主进程收到加载通知,通知所有业务进程调用dl_open将补丁加载至各自对应的进程地址空间,并解决所有符号链接重定向的问题。但是由于dl_open并不能保证所有进程将补丁动态库加载至相同的进程地址空间中,这样会导致每个进程的跳转指令不一致,为解决该问题,目标程序需要一个补丁动态库基址表,该表为进程的全局变量,在不同进程中拥有相同的地址。当各个业务进程通过dl_open加载补丁完成后,将补丁动态库的基地址写入补丁动态库基址表中。
可选的,基于基址表的地址,生成多个业务进程统一的跳转指令包括:获取热补丁文件中补丁函数的地址偏移;根据基址表的地址和地址偏移,生成跳转指令。
由于基址表为目标程序的全局变量,因此其在所有业务进程中的地址相同;并且所有业务进程加载同一热补丁文件,因此,补丁函数在热补丁文件中的偏移相同。至此所有进程可以使用完全相同的跳转指令实现旧函数到新的补丁函数的跳转。
可选的,将跳转指令写入目标程序的主进程包括:确定热补丁文件在主进程中的目标地址,其中,主进程的目标地址与内存共享的多个业务进程共享;将跳转指令写入目标地址。
上述目标程序中的主进程和多个业务进程已经进行了内存共享,现在只需要将多个业务进程统一的跳转指令,写入主进程,则将该跳转指令存储在该共享内存中,参与内存共享的业务进程都可调用和使用。上述目标地址,也即是热补丁文件需要插入主进程的地址。可以通过热补丁文件确定。
需要说明的是,在将热补丁文件写入主程序时,可以先对热补丁文件的预处理函数进行激活,使得热补丁文件处于可处理状态。保证后续对热补丁文件的写入处理。
可选的,将跳转指令写入目标程序的主进程之后,还包括:在目标业务进程运行至目标地址的情况下,响应跳转指令,根据基址表的地址获取热补丁文件相对于目标业务进程的基地址,其中,目标业务进程为多各业务进程中任一业务进程;根据基地址与地址偏移,确定补丁函数的执行地址;根据执行地址,执行补丁函数。
具体的,跳转指令在执行时,目标业务进程运行至目标地址的情况下,触发跳转指令,通过基址表的地址读取热补丁文件的基地址并将其存储在寄存器中。将寄存器中的热补丁文件的基地址,与补丁函数在热补丁文件中的偏移相加获得补丁函数在进程地址空间中的地址,也即是执行地址,并将其存储在寄存器中。根据执行地址,执行补丁函数时,使用跳转指令跳转寄存器中的补丁函数在进程地址空间中的执行地址为当前业务进程正执行旧函数的地址,完成从旧函数到新的补丁函数的跳转。
需要说明的是,对于每个补丁点或是不同程序来说,补丁动态库基址表的地址和补丁函数在动态库中的偏移都是不同的,因此跳转指令需要根据指令的二进制格式动态组装。
可选的,将跳转指令写入目标地址之前,还包括:通过主进程对多个业务进程发送预修改通知,其中,预修改通知用于通知业务进程停止运行;在接收到多个业务进程对预修改通知的应答成功消息的情况下,激活热补丁文件中预设的预处理函数,以对热补丁文件进行写入处理。
由于主进程和业务进程之间处于完全的共享内存状态,因此只需要主进程修改代码段,所有的业务进程便会跟着变化。但是,主进程在修改时需要停止运行,由于共享内存的原因,主进程向所有业务进程发送预修改通知,通知所有进程停止在安全点处,等待所有业务进程应答成功,停止多个业务进程。
上述激活预处理函数,是为了使得热补丁函数为可处理状态,为之后写如主进程的代码提供基础。从而保证跳转指令可以成功写如上述主进程。
可选的,通过第一接口将热补丁文件加载到多个业务进程分别对应的多个进程地址空间中,并分别确定多个业务进程分别对应的多个基址表之前,还包括:对热补丁文件进行校验,至少包括下列之一:来源校验,版本校验,完整性校验,目标程序校验。
具体的,上述来源校验也即是补丁来源校验:在制作并发布补丁包时,补丁包中会携带补丁提供方的签名信息。在补丁来源校验阶段,使用补丁发布方的公钥校验补丁签名,以确保补丁来源安全可靠。
上述版本校验也即是软件版本校验:补丁包中带有补丁描述信息,读取补丁描述信息,与补丁激活环境进行对比,确保补丁版本与软件版本匹配对应。
上述完整性校验:通过crc32对补丁动态库文件计算摘要,与补丁描述文件中的信息进行比对,确保补丁动态库正确完整,没有损坏。
上述目标程序校验:对目标程序的可执行文件通过crc32计算摘要,与补丁描述信息进行比对,确保补丁与目标文件匹配。
从而保证了热补丁在加载和实现过程中的稳定性和可靠性,为热补丁的加载和实现提供有力保障。
需要说明的是,本申请实施例还提供了一种可选的实施方式,下面对该实施方式进行详细说明。
本实施方式提供了一种面向嵌入式高性能设备的热补丁实现方案,根据嵌入式设备内存有限同时又有较高性能要求等特点,针对多进程处理的高并发模型,设计的热补丁实现方案。主要目的在于补丁安全性与合法性的检查,将补丁代码加载至进程地址空间,避免修改代码段触发写时拷贝导致的大量内存页浪费,保证补丁跳转指令在各个进程间完全一致。
图3是根据本发明实施方式的多进程的热补丁执行的流程图,如图3所示,本实施方式完整技术按照模块逻辑划分主要分为以下四部分:
1.补丁校验:
补丁校验过程主要分为补丁来源校验、软件版本校验、补丁动态库校验、目标程序校验四部分。
补丁来源校验:在制作并发布补丁包时,补丁包中会携带补丁提供方的签名信息。在补丁来源校验阶段,使用补丁发布方的公钥校验补丁签名,以确保补丁来源安全可靠。
软件版本校验:补丁包中带有补丁描述信息,读取补丁描述信息,与补丁激活环境进行对比,确保补丁版本与软件版本匹配对应。
补丁动态库校验:通过crc32对补丁动态库文件计算摘要,与补丁描述文件中的信息进行比对,确保补丁动态库正确完整,没有损坏。
目标程序校验:对目标程序的可执行文件通过crc32计算摘要,与补丁描述信息进行比对,确保补丁与目标文件匹配。
2.补丁加载:
图4是根据本发明实施方式的热补丁加载的示意图,如图4所示,补丁加载时,补丁管理程序通知目标程序的主进程,主进程收到加载通知,主进程通知所有业务进程调用dl_open将补丁动态库加载至进程地址空间,并解决所有符号链接重定向的问题。
但是由于dl_open并不能保证所有进程将补丁动态库加载至相同的进程地址空间中,这样会导致每个进程的跳转指令不一致,为解决该问题,目标程序需要一个补丁动态库基址表,该表为进程的全局变量,在不同进程中拥有相同的地址。
图5是根据本发明实施方式的多进程基址表的示意图,如图5所示,当各个进程dl_open完成后,将补丁动态库的基地址写入补丁动态库基址表中,并通知主进程加载完成。
图6是根据本发明实施方式的主进程加载热补丁的流程图,如图6所示,为目标程序的主进程加载热补丁的流程。
图7是根据本发明实施方式的业务进程加载热补丁的流程图,如图7所示,为目标程序的业务进程加载热补丁的流程。
3.动态生成跳转指令:
由于需要避免触发kernel的写时拷贝导致大量内存页浪费的问题,因此对于跳转指令的基本要求就是每个进程所修改的跳转指令必须完全一致,但是由于dl_open接口无法保证每个进程加载动态库的地址一致,因此通过简单的长跳转指令无法满足要求。
因此动态生成的跳转指令进行如下过程:
1)通过补丁动态库基址表的地址读取补丁动态库基址并将其存储在寄存器中。
2)将寄存器中的补丁动态库基址与补丁函数在动态库中的偏移相加获得补丁函数在进程地址空间中的地址,并将其存储在寄存器中。
3)使用长跳转指令跳转寄存器中的补丁函数在进程地址空间中的地址,完成从旧函数到新的补丁函数的跳转。
由于动态库基址表为目标程序的全局变量,因此其在所有目标程序中的地址相同;并且所有进程加载同一补丁动态库,因此补丁函数在动态库中的偏移相同。至此所有进程可以使用完全相同的跳转指令实现旧函数到新的补丁函数的跳转。
以X86_64为例,动态生成的跳转指令如下:
movabs $jmp_entry, %rax
movabs $offset, %r10
add %r10, %rax
jmpq *%rax
其中,$jmp_entry为补丁动态库基址表的地址,$offset为补丁函数在动态库中的偏移,对于每个补丁点或是不同程序来说,补丁动态库基址表的地址和补丁函数在动态库中的偏移都是不同的,因此跳转指令需要根据指令的二进制格式动态组装。
4.修改代码段:
由于内核的写时拷贝机制,使用ptrace等方式修改代码段会导致内存页的浪费。因此为避免触发写时拷贝机制,需要在支持热补丁的进程初始化阶段(调用fork创建业务进程前),使用mmap接口将进程自己的代码段设置为共享内存,然后再创建业务进程。这样的话,多进程间的代码段给将处于完全的共享内存状态,而非写时拷贝状态的共享内存。
由于进程间处于完全的共享内存状态,因此只需要主进程修改代码段,所有的业务进程便会跟着变化。
主进程主要流程如下:
1)向所有业务进程发送预修改通知,通知所有进程停止在安全点处,等待所有业务进程应答成功。
2)执行补丁动态库中设置的补丁激活预处理函数。
3)调用mprotect接口(一种可以修改进程页保护权限的系统调用),将需要修改函数所在的内存页修改为可读可写可执行。
4)直接使用memcpy(内存拷贝函数)将上一步动态生成的跳转指令需要修改的函数入口处。
5)调用mprotect接口将内存页回复至可读可执行(去除可写)保护权限。
6)通知所有业务进程修改完成,恢复至正常工作状态。
本实施方式可应用于嵌入式设备处于关键业务的关键节点上运行,其运行环境并不允许升级版本、重启等任何中断业务的情况发生。当该设备发现软件故障时,可使用热补丁方案在不影响业务的前提下修复软件故障。
本实施方式能够在不影响业务的前提下修复软件故障。可以解决传统使用ptrace方式的在打补丁时大量浪费内存页的情况。其良好缜密的补丁校验方式可保证补丁安全可靠。无需调试进程辅助,大大提高了打补丁的效率,降低业务波动的可能。安全的代码段修改方式,保证进程运行环境稳定。
本实施方式使用补丁动态库基址表存储补丁动态库的基地址,以方便后续使用统一的跳转指令修改所有进程。旧函数到新的补丁函数的跳转方式,通过动态读取地址和偏移进行跳转,而非简单的长跳转指令。基于进程共享代码段的指令修改方式,避免浪费内存页的情况。
图8是根据本发明实施例的一种热补丁处理装置的示意图,如图8所示,根据本发明实施例的另一方面,还提供了一种热补丁处理装置,包括:加载模块82,生成模块84和写入模块86,下面对该装置进行详细说明。
加载模块82,用于通过第一接口将热补丁文件加载到多个业务进程分别对应的多个进程地址空间中,并分别确定多个业务进程分别对应的多个基址表,其中,多个所述基址表的地址相同,所述多个业务进程均为目标程序的进程;生成模块84,与上述加载模块82相连,用于基于所述基址表的地址,生成多个所述业务进程统一的跳转指令,其中,所述跳转指令用于将业务进程从旧函数跳转至所述热补丁文件的补丁函数;写入模块86,与上述生成模块84相连,用于将所述跳转指令写入所述目标程序的主进程,其中,所述主进程和所述多个业务进程共享内存。
通过上述装置,采用通过第一接口将热补丁文件加载到多个业务进程分别对应的多个进程地址空间中,并分别确定多个业务进程分别对应的多个基址表,其中,多个基址表的地址相同,多个业务进程均为目标程序的进程;基于基址表的地址,生成多个业务进程统一的跳转指令,其中,跳转指令用于将业务进程从旧函数跳转至热补丁文件的补丁函数;将跳转指令写入目标程序的主进程,其中,主进程和多个业务进程共享内存的方式,通过根据热补丁在多个业务进程的基址表,生成多个业务统一的跳转指令,将该跳转指令写入共享内存的主程序,达到了多个业务进程都可以采用共享内存的主进程中的同一跳转指令,实现跳转热补丁函数的目的,从而实现了避免多个业务进程分别各自设置跳转指令和内存空间来跳转热补丁函数,降低了热补丁在多业务进程加载过程中的占用内存,极大地节省了内存资源的技术效果,进而解决了相关技术中的热补丁在多业务进程加载过程中,占用较多的内存,导致内存资源浪费的技术问题。
根据本发明实施例的另一方面,还提供了一种处理器,所述处理器用于运行程序,其中,所述程序运行时执行上述中任意一项所述的热补丁处理方法。
根据本发明实施例的另一方面,还提供了一种计算机存储介质,所述计算机存储介质包括存储的程序,其中,在所述程序运行时控制所述计算机存储介质所在设备执行上述中任意一项所述的热补丁处理方法。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
在本发明的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
在本申请所提供的几个实施例中,应该理解到,所揭露的技术内容,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,可以为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

Claims (10)

1.一种热补丁处理方法,其特征在于,包括:
通过第一接口将热补丁文件加载到多个业务进程分别对应的多个进程地址空间中,并分别确定多个业务进程分别对应的多个基址表,其中,多个所述基址表的地址相同,所述多个业务进程均为目标程序的进程;
基于所述基址表的地址,生成多个所述业务进程统一的跳转指令,其中,所述跳转指令用于将业务进程从旧函数跳转至所述热补丁文件的补丁函数;
将所述跳转指令写入所述目标程序的主进程,其中,所述主进程和所述多个业务进程共享内存。
2.根据权利要求1所述的方法,其特征在于,通过第一接口将热补丁文件加载到多个业务进程分别对应的多个进程地址空间中,并分别确定多个业务进程分别对应的多个基址表包括:
通过第一接口将所述热补丁文件加载多个业务进程的分别对应的多个进程地址空间中,生成多个业务进程分别对应的基地址,其中,所述基地址用于调用所述热补丁文件;
每个业务进程将对应的基地址写入自身的基址表中,确定多个业务进程分别对应的多个基址表。
3.根据权利要求1所述的方法,其特征在于,基于所述基址表的地址,生成多个所述业务进程统一的跳转指令包括:
获取所述热补丁文件中补丁函数的地址偏移;
根据所述基址表的地址和所述地址偏移,生成所述跳转指令。
4.根据权利要求3所述的方法,其特征在于,将所述跳转指令写入所述目标程序的主进程包括:
确定所述热补丁文件在所述主进程中的目标地址,其中,所述主进程的目标地址与内存共享的多个业务进程共享;
将所述跳转指令写入所述目标地址。
5.根据权利要求4所述的方法,其特征在于,将所述跳转指令写入所述目标程序的主进程之后,还包括:
在目标业务进程运行至目标地址的情况下,响应所述跳转指令,根据所述基址表的地址获取所述热补丁文件相对于所述目标业务进程的基地址,其中,所述目标业务进程为多各所述业务进程中任一业务进程;
根据所述基地址与所述地址偏移,确定所述补丁函数的执行地址;
根据所述执行地址,执行所述补丁函数。
6.根据权利要求4所述的方法,其特征在于,将所述跳转指令写入所述目标地址之前,还包括:
通过所述主进程对多个所述业务进程发送预修改通知,其中,所述预修改通知用于通知业务进程停止运行;
在接收到多个所述业务进程对所述预修改通知的应答成功消息的情况下,激活所述热补丁文件中预设的预处理函数,以对所述热补丁文件进行写入处理。
7.根据权利要求1至6中任一项所述的方法,其特征在于,通过第一接口将热补丁文件加载到多个业务进程分别对应的多个进程地址空间中,并分别确定多个业务进程分别对应的多个基址表之前,还包括:
对所述热补丁文件进行校验,至少包括下列之一:来源校验,版本校验,完整性校验,目标程序校验。
8.一种热补丁处理装置,其特征在于,包括:
加载模块,用于通过第一接口将热补丁文件加载到多个业务进程分别对应的多个进程地址空间中,并分别确定多个业务进程分别对应的多个基址表,其中,多个所述基址表的地址相同,所述多个业务进程均为目标程序的进程;
生成模块,用于基于所述基址表的地址,生成多个所述业务进程统一的跳转指令,其中,所述跳转指令用于将业务进程从旧函数跳转至所述热补丁文件的补丁函数;
写入模块,用于将所述跳转指令写入所述目标程序的主进程,其中,所述主进程和所述多个业务进程共享内存。
9.一种处理器,其特征在于,所述处理器用于运行程序,其中,所述程序运行时执行权利要求1至7中任意一项所述的热补丁处理方法。
10.一种计算机存储介质,其特征在于,所述计算机存储介质包括存储的程序,其中,
在所述程序运行时控制所述计算机存储介质所在设备执行权利要求1至7中任意一项所述的热补丁处理方法。
CN202111144914.1A 2021-09-28 2021-09-28 热补丁处理方法及装置 Active CN113918244B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202111144914.1A CN113918244B (zh) 2021-09-28 2021-09-28 热补丁处理方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202111144914.1A CN113918244B (zh) 2021-09-28 2021-09-28 热补丁处理方法及装置

Publications (2)

Publication Number Publication Date
CN113918244A true CN113918244A (zh) 2022-01-11
CN113918244B CN113918244B (zh) 2025-06-13

Family

ID=79236589

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202111144914.1A Active CN113918244B (zh) 2021-09-28 2021-09-28 热补丁处理方法及装置

Country Status (1)

Country Link
CN (1) CN113918244B (zh)

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102479265A (zh) * 2010-11-25 2012-05-30 上海华虹集成电路有限责任公司 修改硬掩膜产品固件错误功能的方法
CN103942073A (zh) * 2014-04-08 2014-07-23 北京奇虎科技有限公司 实现系统热补丁的方法及装置
CN104268229A (zh) * 2014-09-26 2015-01-07 北京金山安全软件有限公司 一种基于多进程浏览器的资源获得方法及装置
US20170011016A1 (en) * 2015-07-10 2017-01-12 Wealthcounsel Llc Automated document generation with xqml
CN106775671A (zh) * 2016-11-30 2017-05-31 武汉虹信通信技术有限责任公司 一种用于通信系统linux环境中的热补丁修复方法

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102479265A (zh) * 2010-11-25 2012-05-30 上海华虹集成电路有限责任公司 修改硬掩膜产品固件错误功能的方法
CN103942073A (zh) * 2014-04-08 2014-07-23 北京奇虎科技有限公司 实现系统热补丁的方法及装置
CN104268229A (zh) * 2014-09-26 2015-01-07 北京金山安全软件有限公司 一种基于多进程浏览器的资源获得方法及装置
US20170011016A1 (en) * 2015-07-10 2017-01-12 Wealthcounsel Llc Automated document generation with xqml
CN106775671A (zh) * 2016-11-30 2017-05-31 武汉虹信通信技术有限责任公司 一种用于通信系统linux环境中的热补丁修复方法

Also Published As

Publication number Publication date
CN113918244B (zh) 2025-06-13

Similar Documents

Publication Publication Date Title
JP4426736B2 (ja) プログラム修正方法およびプログラム
JP3593241B2 (ja) 計算機の再起動方法
US10157268B2 (en) Return flow guard using control stack identified by processor register
WO2012100535A1 (zh) 超级内核组件的升级方法和计算机系统
CN110162429B (zh) 系统修复方法、服务器及存储介质
JP6288275B2 (ja) 仮想化基盤管理装置、仮想化基盤管理システム、仮想化基盤管理方法、及び、仮想化基盤管理プログラム
CN104915263A (zh) 基于容器技术的进程故障处理方法及装置
CN111143023B (zh) 一种资源变更的方法及装置、设备、存储介质
CN101482823A (zh) 一种单板应用版本的实现方法及系统
CN117591136A (zh) 存储镜像生成方法、装置、计算机设备及存储介质
CN104216771A (zh) 软件程序的重启方法及装置
CN115062307A (zh) 基于Open POWER的程序完整性校验方法、系统、终端及存储介质
CA2340342A1 (en) A method, computer, and article of manufacturing for fault tolerant booting
WO2025113399A1 (zh) 用于管理虚拟机的方法、装置、设备和存储介质
CN101002174A (zh) 在便携式装置中加载具有面向对象的中间语言的软件的方法
CN113918244B (zh) 热补丁处理方法及装置
US9804932B2 (en) Method and device for processing data and electronic apparatus
US10572166B1 (en) Firmware download for a solid state storage card
CN114594975B (zh) 固件管理方法、装置、存储介质及电子设备
CN116679971A (zh) 一种热修复方法、装置、电子设备及存储介质
CN100514305C (zh) 实现操作系统安全控制的系统及方法
CN113608922A (zh) 一种备份系统切换方法和装置
US10712952B1 (en) Metadata caches in a reliable distributed computing system
CN100424652C (zh) 一种基于嵌入式操作系统的硬盘自恢复保护方法
CN119377015B (zh) 一种配置镜像内存的方法、装置、设备及存储介质

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant