CN112988182A - Linux内核热补丁实现方法、电子设备及计算机可读介质 - Google Patents

Linux内核热补丁实现方法、电子设备及计算机可读介质 Download PDF

Info

Publication number
CN112988182A
CN112988182A CN201911283684.XA CN201911283684A CN112988182A CN 112988182 A CN112988182 A CN 112988182A CN 201911283684 A CN201911283684 A CN 201911283684A CN 112988182 A CN112988182 A CN 112988182A
Authority
CN
China
Prior art keywords
instruction code
function
patched function
patched
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.)
Pending
Application number
CN201911283684.XA
Other languages
English (en)
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.)
ZTE Corp
Original Assignee
ZTE Corp
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 ZTE Corp filed Critical ZTE Corp
Priority to CN201911283684.XA priority Critical patent/CN112988182A/zh
Priority to US17/783,015 priority patent/US11868763B2/en
Priority to PCT/CN2020/129031 priority patent/WO2021115036A1/zh
Publication of CN112988182A publication Critical patent/CN112988182A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/60Software deployment
    • G06F8/65Updates
    • 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
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3644Software debugging by instrumenting at runtime
    • 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/4401Bootstrapping
    • G06F9/4406Loading of operating system
    • 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
    • G06F9/4486Formation of subprogram jump address

Abstract

本公开提供了一种LINUX内核热补丁实现方法,该方法包括:通过原子操作方式修改被补丁函数的头部指令码,由被补丁函数地址直接或间接跳转至补丁函数地址,实现补丁函数的激活。LINUX内核热补丁实现方法能够在LINUX系统不重启的情况下实现补丁函数的激活,保障LINUX系统的稳定性,提升用户体验。本公开还提供了一种电子设备及计算机可读介质。

Description

LINUX内核热补丁实现方法、电子设备及计算机可读介质
技术领域
本公开实施例涉及计算机技术领域,特别涉及一种LINUX内核热补丁实现方法、电子设备及计算机可读介质。
背景技术
Linux系统作为通信软件的基础操作系统,随着应用场景越来越复杂,加载的内核驱动模块也越来越多,难免会暴露出内核和/或内核模块故障。传统的解决方法均是通过“冷补丁”方式解决内核故障和/或内核模块故障,即在更换内核和/或内核模块后重启系统。
但是,随着通信网络应用越来越来广泛,Linux系统服务的用户也越来越多,用户对Linux系统的稳定性要求也越来越高,如果依旧使用“冷补丁”方式解决内核故障和/或内核模块故障,就需要使系统进行重启,这会大规模影响用户的生活和工作,降低Linux系统的稳定性,造成用户体验差。
发明内容
本公开实施例提供一种LINUX内核热补丁实现方法、电子设备及计算机可读介质,能够在LINUX系统不重启的情况下激活补丁函数,保障LINUX系统的稳定性,提升用户体验。
第一方面,本公开实施例提供一种LINUX内核热补丁实现方法,其包括:
通过原子操作方式修改被补丁函数的头部指令码,由被补丁函数地址直接或间接跳转至补丁函数地址,实现补丁函数的激活。
第二方面,本公开实施例提供一种电子设备,其包括:
一个或多个处理器;
存储装置,其上存储有一个或多个程序,当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现根据权利要求1-11任意一项所述的方法。
第三方面,本公开实施例提供一种计算机可读介质,其上存储有计算机程序,所述程序被处理器执行时实现根据权利要求1-11任意一项所述的方法。
本公开实施例提供的LINUX内核热补丁实现方法,通过原子操作方式修改被补丁函数的头部指令码,由被补丁函数地址直接或间接跳转至补丁函数地址,实现补丁函数的激活。该补丁函数的激活在LINUX系统不重启的情况下进行,保障了LINUX系统的稳定性,提升了用户体验。
附图说明
附图用来提供对本公开实施例的进一步理解,并且构成说明书的一部分,与本公开的实施例一起用于解释本公开,并不构成对本公开的限制。通过参考附图对详细示例实施例进行描述,以上和其它特征和优点对本领域技术人员将变得更加显而易见,在附图中:
图1a为本公开实施例提供的一种LINUX内核热补丁实现方法的流程图;
图1b为本公开实施例提供的一种LINUX内核热补丁实现方法的示意图;
图2为本公开实施例提供的断点异常挂接的操作的流程图;
图3a为本公开实施例提供的一种去除激活的补丁函数的方法的流程图;
图3b为本公开实施例提供的一种去除激活的补丁函数的方法的示意图;
图4a为本公开实施例提供的一种LINUX内核热补丁实现方法的流程图;
图4b为本公开实施例提供的一种LINUX内核热补丁实现方法的示意图;
图5a为本公开实施例提供的一种LINUX内核热补丁实现方法的流程图;
图5b为本公开实施例提供的中继空间划分的示意图;
图5c为本公开实施例提供的一种LINUX内核热补丁实现方法的示意图;
图6a为本公开实施例提供的一种去除激活的补丁函数的方法的流程图;
图6b为本公开实施例提供的一种去除激活的补丁函数的方法的示意图;
图7为本公开实施例提供的中继空间回溯方法的流程图;
图8a为本公开实施例提供的一种LINUX内核热补丁实现方法的流程图;
图8b为本公开实施例提供的一种LINUX内核热补丁实现方法的示意图;
图9a为本公开实施例提供的一种LINUX内核热补丁实现方法的流程图;
图9b为本公开实施例提供的一种LINUX内核热补丁实现方法的示意图;
图10为本公开实施例提供的确定被补丁函数的第二条指令码的地址是否被内核栈穿过的方法的流程图;
图11a为本公开实施例提供的一种去除激活的补丁函数的方法的流程图;
图11b为本公开实施例提供的一种去除激活的补丁函数的方法的示意图;
图12为本公开实施例提供的中继空间回溯的方法的流程图。
具体实施方式
为使本领域的技术人员更好地理解本发明的技术方案,下面结合附图对本发明提供的LINUX内核热补丁实现方法、电子设备及计算机可读介质进行详细描述。
在下文中将参考附图更充分地描述示例实施例,但是所述示例实施例可以以不同形式来体现且不应当被解释为限于本文阐述的实施例。反之,提供这些实施例的目的在于使本公开透彻和完整,并将使本领域技术人员充分理解本公开的范围。
如本文所使用的,术语“和/或”包括一个或多个相关列举条目的任何和所有组合。
本文所使用的术语仅用于描述特定实施例,且不意欲限制本公开。如本文所使用的,单数形式“一个”和“该”也意欲包括复数形式,除非上下文另外清楚指出。还将理解的是,当本说明书中使用术语“包括”和/或“由……制成”时,指定存在所述特征、整体、步骤、操作、元件和/或组件,但不排除存在或添加一个或多个其它特征、整体、步骤、操作、元件、组件和/或其群组。
本文所述实施例可借助本公开的理想示意图而参考平面图和/或截面图进行描述。因此,可根据制造技术和/或容限来修改示例图示。因此,实施例不限于附图中所示的实施例,而是包括基于制造工艺而形成的配置的修改。因此,附图中例示的区具有示意性属性,并且图中所示区的形状例示了元件的区的具体形状,但并不旨在是限制性的。
除非另外限定,否则本文所用的所有术语(包括技术和科学术语)的含义与本领域普通技术人员通常理解的含义相同。还将理解,诸如那些在常用字典中限定的那些术语应当被解释为具有与其在相关技术以及本公开的背景下的含义一致的含义,且将不解释为具有理想化或过度形式上的含义,除非本文明确如此限定。
LINUX系统是通信软件的一种基础操作系统,依据设计制造处理器的指令集特点,当前Linux系统所支持的架构主要包括复杂指令集计算机(Complex Instruction SetComputer,CISC)架构和精简指令集计算机(Reduced Instruction Set Computer,RISC)架构。其中,CISC架构中包括X86架构等;RISC架构中包括高级精简指令集制造处理器(Advanced RISC Machines,ARM)架构、无内部互锁流水级微处理器(Microprocessorwithout Interlocked Piped Stages,MIPS)架构和PowerPC处理器(PerformanceOptimization With Enhanced RISC–Performance Computing,PPC)架构等。随着应用场景越来越复杂,LINUX系统加载的内核驱动模块也越来越多,难免会暴露出内核和/或内核模块故障。为了解决内核和/或内核模块故障,需要对存在缺陷的内核和/或内核模块进行打补丁操作,传统的解决方法均是通过“冷补丁”方式解决内核故障和/或内核模块故障,即在更换内核和/或内核模块后重启系统,但这会大规模影响用户的生活和工作,降低LINUX系统的稳定性,造成用户体验差。因此,为了保障LINUX系统的稳定性,就需要在系统不重启的情况下,实现对内核和/或内核模块有缺陷函数的替换,即对内核和/或内核模块进行打“热补丁”操作。但是当前LINUX系统中,X86架构实现热补丁的方法效率较低、而其他架构又难以支持打“热补丁”的操作。
针对当前LINUX系统在实现打“热补丁”操作时的缺陷,本实施例公开一种LINUX内核热补丁实现方法,该方法应用于补丁管理模块,该补丁管理模块是在进行打补丁操作之前安装到内核中的。
其中,安装补丁管理模块的流程包括:首先确认处理器架构相关的编译检查通过,其次确认处理器架构相关的中继区域初始化成功、确认处理器相关的断点异常注册成功并使内核模块状态变迁回调注册,关注补丁模块的安装和卸载,最后进行补丁sysfs根节点创建。
在补丁管理模块中进行不同补丁模块的编译和安装,就可以实现对内核和/或内核模块的打补丁操作。其中,补丁模块中存储有补丁描述信息,该补丁描述信息包括被补丁函数名称、补丁函数地址、补丁模式等。需要说明的是,补丁管理模块可以提供补丁接口进行补丁模块的编译,还可以使用Shel l命令对编译好的补丁模块进行安装或卸载。调用该补丁管理模块的补丁接口进行补丁模块的编译后,在补丁模块中先后调用注册补丁接口、激活补丁接口就可以安装该补丁模块并解析补丁模块中存储的补丁描述信息,待返回正常时,表示补丁模块的功能已经生效。还需要说明的是,由于热补丁管理系统在sysfs文件系统中进行创建,因此,手动操作sysfs文件,就可进行补丁模块中补丁函数的激活、去激活和卸载等操作,其中,激活接口、去激活接口和卸载接口分别为:echo 1>/sys/kernel/补丁管理模块名称/补丁模块名称/enabled、echo 0>/sys/kernel/补丁管理模块名称/补丁模块名称/enabled和echo 0>/sys/kernel/补丁管理模块名称/补丁模块名称/installed。
本公开实施例提供的一种LINUX内核热补丁实现方法,包括以下步骤:
通过原子操作方式修改被补丁函数的头部指令码,由被补丁函数地址直接或间接跳转至补丁函数地址,实现补丁函数的激活。
其中,原子操作方式是一种操作过程不中断的操作方式,原子操作操作包括一个或者多个操作步骤,该操作步骤在操作过程中顺序不可以被打乱。即原子操作方式要求操作步骤被连续且完整的执行,不出现操作过程被中断或异常打断的情况。在本实施例中,原子操作包括物理原子操作和逻辑原子操作。
另外,被补丁函数是LINUX系统内核或内核模块中存在缺陷的函数,而补丁函数是该被补丁函数的替换函数。在内核或内核模块的线程调用过程中,补丁函数可以实现被补丁函数的功能,同时又可以弥补被补丁函数中存在的缺陷。被补丁函数地址是被补丁函数所在的代码段空间的地址;补丁函数地址是补丁函数所在的代码段空间的地址,该代码段空间位于内核和/或内核模块中。
需要说明的是,被补丁函数的头部指令码包括被补丁函数的第一条指令码和/或第二条指令码。通过修改被补丁函数的头部指令码,能实现由被补丁函数地址直接或间接跳转至补丁函数地址,实现补丁函数的激活。在一个实施方式中,如果已经激活的补丁函数不能满足线程调用的需求,还需要去除激活的补丁函数,即将被补丁函数已经修改的头部指令码还原为修改前的头部指令码。在另一个实施方式中,为了便于去除激活的补丁函数,在通过原子操作方式修改被补丁函数的头部之前,还要备份被补丁函数的头部指令码,以实现被修改的被补丁函数的头部指令码准确、快速地还原为修改前的头部指令码。
图1a为本发明实施例提供的一种LINUX内核热补丁实现方法的流程图。该LINUX内核热补丁实现方法是在被补丁函数的头部增加固定长度字节的固定指令码,从而实现补丁函数的跳转。
在一些实施例中,如图1a所示,LINUX内核热补丁实现方法包括:
步骤11,在被补丁函数的第一条指令码前增加X字节的固定指令码。
其中,X为大于4的整数。需要说明的是,在被补丁函数的第一条指令码前增加X字节的固定指令码是为了对被补丁函数进行打补丁操作,实现补丁函数的激活。因此,在一些实施例中,在增加X字节的固定指令码之前,判断被补丁函数是否已经存在其他被激活的补丁函数。
在一个实施方式中,在被补丁函数的第一条指令码前增加X字节的固定指令码之前,判断被补丁函数的第一条指令码前是否设置有固定指令码,若有,说明被补丁函数已经存在被激活的补丁函数,则停止修改被补丁函数的头部指令码。若没有,说明被补丁函数不存在被激活的补丁函数,该被补丁函数可以进行打补丁操作,即可以在被补丁函数的第一条指令码前增加X字节的固定指令码以进行补丁函数的激活。
在一个实施方式中,当因被补丁函数的第一条指令码前设置有固定指令码而停止修改被补丁函数的头部指令码时,可以修改已经激活的补丁函数的头部指令码,以对已经激活的补丁函数进行打补丁操作。
步骤12,将该固定指令码的第一字节修改为断点指令码。
其中,断点指令码可以截取内核调用栈调用被补丁函数的线程,使线程无法执行断点指令码之后的指令码。
步骤13,在线程执行过程中根据断点指令码执行断点异常。
其中,该线程执行过程是内核调用栈调用被补丁函数的调用过程。断点异常是该线程在执行过程中由断点触发的操作,该操作在补丁管理模块中进行注册。该操作在注册时,通过修改相应的寄存器上下文挂接相应的操作流程;其中,修改相应的寄存器上下文包括将补丁函数写入寄存器。
在一个实施方式中,如图2所示,挂接的操作流程包括:
步骤21,判断当前被补丁函数是否处于修改指令码的过程,如果当前被补丁函数不处于修改指令码的过程,则执行步骤23;如果当前被补丁函数处于修改指令码的过程,则执行步骤22。
步骤22,判断当前被补丁函数是否正在进行打补丁操作,如果当前被补丁函数没有进行打补丁操作,则执行步骤23;如果当前被补丁函数正在进行打补丁操作,则执行步骤24。
步骤23,进行原有断点标准内核流程。
步骤24,跳转写入补丁函数的寄存器。
内核调用栈调用被补丁函数时,通过断点指令码执行断点异常,需要说明的是,在在线程执行过程中,遇到断点属于小概率事件。因此,在短时间内,可以通过在相关寄存器中挂接操作流程进行断点异常的处理,使线程执行过程不中断,进而方便进行后续激活补丁函数的步骤。
步骤14,将断点指令码的返回执行地址修改为跳转地址。
其中,跳转地址根据补丁函数与被补丁函数的地址差值确定,该跳转地址存储在固定指令码的后(X-1)字节中。
步骤15,将断点指令码修改为跳转指令。
其中,断点指令码处于固定指令码的第一字节,因此,由断点指令码修改得到的跳转指令也固定指令码的第一字节。另外,由于该固定指令码的后(X-1)字节中存储着跳转地址,因此该跳转指令码与固定指令码的后(X-1)字节共同组成一条长度为X字节的完整的跳转指令码。由于X是大于4的整数,因此,后(X-1)字节既可以存储实现短跳转所需的地址的长度、也可以存储实现长跳转所需的地址的长度,根据该长度为X字节的跳转指令码,被补丁函数可以直接跳转至补丁函数,实现补丁函数的激活。
以图1b为例,对图1a中LINUX内核热补丁实现方法的步骤进行具体说明。首先,在被补丁函数的第一条指令码INSN_1之前,增加一条长度为5字节的空指令Nop指令,并将该Nop指令的第一字节修改为断点指令码BRK(cc),使线程执行过程中根据该断点指令码BRK(cc)执行断点异常;其次,按照无条件转移指令(jmpq)格式通过offset指令计算offset值,该offset值为被补丁函数到补丁函数之间的跳转地址;然后,将断点指令码的返回执行地址,即Nop指令的后4字节修改为该offset值;最后,将断点指令码BRK(cc)修改为跳转指令jumpq(e9),该跳转指令jumpq(e9)与Nop指令的后4字节中的offset值共同组成一个完整的跳转指令码,实现完整的jump调用,由被补丁函数地址可以直接跳转至补丁函数地址,实现补丁函数的激活。
在一个实施方式中,如图3a所示,去除图1a对应的激活的补丁函数的步骤包括:
步骤31,将被补丁函数的第一字节修改为断点指令码。
步骤32,在线程执行过程中根据断点指令码执行断点异常。
步骤33,将断点指令码的返回执行地址恢复为原固定指令码的后(X-1)字节,X为大于4的整数。
步骤34,将断点指令码恢复为原固定指令码的第一字节。
具体地,以图3b为例,对去除图1b中激活的补丁函数的步骤进行对应说明。首先,将被补丁函数的第一字节修改为断点指令码BRK(cc),在线程执行过程中根据断点指令码执行断点异常,需要说明的是,此时被补丁函数的第一字节为跳转指令jumpq(e9);其次,利用ORI指令将断点指令码的返回执行地址,即offset值,恢复为增加的Nop指令的后4字节;最后,将断点指令码恢复为Nop指令的第一字节。此时,被补丁函数增加的长度为5字节的Nop指令已经全部被还原,且该Nop指令并不影响线程对被补丁函数的调用,因此,图1b中激活的补丁函数去除成功。
本公开实施例提供的LINUX内核热补丁实现方法,首先在被补丁函数的第一条指令码前增加X字节的固定指令码,并将该固定指令码的第一字节修改为断点指令码,使线程执行过程中根据该断点指令码执行断点异常。其次,将断点指令码的返回执行地址修改为跳转地址、将断点指令码修改为跳转指令,由被补丁函数地址可以直接跳转至补丁函数地址,实现补丁函数的激活。
需要说明的是,由于在修改被补丁函数的头部指令之前注册了断点异常,因此,在将固定指令码的第一字节修改为断点指令码后,线程执行过程即使遇到该断点指令码,也可以根据断点指令码执行断点异常,线程不会中断。即本公开实施例中被补丁函数的头部指令修改过程实现了逻辑原子操作,LINUX系统在不重启的情况下也可以激活补丁函数,实现LINUX内核热补丁,保障LINUX系统的稳定性。
还需要说明的是,本公开实施例中被补丁函数的头部指令修改过程只涉及到一条指令码的修改,修改过程简单,而且修改过程不涉及内核调用栈的回溯,提高了实现LINUX内核热补丁的效率。
图4a为本发明实施例提供的LINUX内核热补丁实现方法的流程图。该LINUX内核热补丁实现方法针对RISC架构中的短跳转模式,即被补丁函数与补丁函数的距离较近,修改被补丁函数的一条指令码即可实现跳转。
具体地,如图4a所示,LINUX内核热补丁实现方法包括:
步骤41,将被补丁函数的第一条指令码修改为跳转指令码。
其中,跳转指令码是通过补丁函数和被补丁函数计算得到的指令码,该跳转指令码包含跳转地址,该跳转地址根据补丁函数地址和被补丁函数地址的差值确定。根据该跳转指令码,被补丁函数可以直接跳转至补丁函数,实现补丁函数的激活。
需要说明的是,将被补丁函数的第一条指令码修改为跳转指令码是为了对被补丁函数进行打补丁操作,实现补丁函数的激活。因此,在一些实施例中,将被补丁函数的第一条指令码修改为跳转指令码之前,判断被补丁函数能否执行打补丁操作。
在一个实施方式中,解析被补丁函数的汇编指令码,判断该汇编指令码中是否存在跳转到被补丁函数开头的指令码序列,若存在跳转到被补丁函数开头的指令码序列,说明被补丁函数不能执行打补丁操作,停止修改补丁函数的头部指令码;若不存在跳转到被补丁函数开头的指令码序列,说明被补丁函数能够执行打补丁操作,即可以将被补丁函数的第一条指令码修改为跳转指令码进行补丁函数的激活。需要说明的是,在全部函数中,汇编指令码中存在跳转到被补丁函数开头的指令码序列的概率极低。
在一个实施方式中,当因被补丁函数存在跳转到被补丁函数开头的指令码序列而停止修改被补丁函数的头部指令码时,补丁管理模块可以给出提示:建议对被补丁函数中存在的调用函数进行打补丁操作。
以图4b为例,对图4a中LINUX内核热补丁实现方法的步骤进行具体说明。将被补丁函数的第一条指令码INSN_0修改为跳转指令码J_XXX。其中,跳转指令码J_XXX是通过补丁函数和被补丁函数计算得到的指令码,该跳转指令码包含跳转地址,该跳转地址根据补丁函数地址和被补丁函数地址的差值确定。根据该跳转指令码J_XXX,被补丁函数可以直接跳转至补丁函数,实现补丁函数的激活。
在一个实施方式中,去除图4a对应的激活的补丁函数的步骤包括:
将跳转指令码还原为被补丁函数修改前的第一条指令码。
本公开实施例提供的LINUX内核热补丁实现方法,通过将被补丁函数的第一条指令码修改为跳转指令码实现补丁函数的激活。需要说明的是,被由于补丁函数的头部指令修改过程不会使线程中断,修改过程实现了物理原子操作。因此,LINUX系统在不重启的情况下也可以激活补丁函数,实现LINUX内核热补丁,保障了LINUX系统的稳定性。
还需要说明的是,本公开实施例中被补丁函数的头部指令修改过程只涉及到一条指令码的修改,修改过程简单,而且修改过程不涉及内核调用栈的回溯,提高了实现LINUX内核热补丁的效率。
图5a为本发明实施例提供的LINUX内核热补丁实现方法的流程图。该LINUX内核热补丁实现方法针对RISC架构中的长跳转模式,即被补丁函数与补丁函数的距离较远,无法通过一条指令直接由被补丁函数跳转地址至补丁函数地址。为了尽量减少修改被补丁函数所涉及的指令,在修改被补丁函数的头部指令之前,为被补丁函数申请一个中继空间,该中继空间是内核和/或内核模块中预留的可与被补丁函数通过一条指令实现跳转的代码段空间,该中继空间通过补丁管理模块进行初始化。
具体地,如图5a所示,LINUX内核热补丁实现方法包括:
步骤51,将被补丁函数的第一条指令码修改为跳转指令码。
其中,该跳转指令码是根据被补丁函数与中继空间计算得到的指令码。根据该跳转指令码,被补丁函数可以跳转至中继空间。另外,该跳转指令码包含跳转地址,该跳转地址根据补丁函数地址和中继空间地址的差值确定,该中继空间设置有由中继空间地址跳转至补丁函数地址的目标跳转指令码。
需要说明的是,将被补丁函数的第一条指令码修改为跳转指令码是为了对被补丁函数进行打补丁操作,实现补丁函数的激活。因此,在一些实施例中,将被补丁函数的第一条指令码修改为跳转指令码之前,判断被补丁函数能否执行打补丁操作。
在一个实施方式中,解析被补丁函数的汇编指令码,判断该汇编指令码中是否存在跳转到被补丁函数开头的指令码序列,若存在跳转到被补丁函数开头的指令码序列,说明被补丁函数不能执行打补丁操作,停止修改补丁函数的头部指令码;若不存在跳转到被补丁函数开头的指令码序列,说明被补丁函数能够执行打补丁操作,即可以将被补丁函数的第一条指令码修改为跳转指令码进行补丁函数的激活。需要说明的是,在全部函数中,汇编指令码中存在跳转到被补丁函数开头的指令码序列的概率极低。
在一个实施方式中,当因被补丁函数存在跳转到被补丁函数开头的指令码序列而停止修改被补丁函数的头部指令码时,补丁管理模块可以给出提示:建议对被补丁函数中存在的调用函数进行打补丁操作。
步骤52,在中继空间实现由中继空间跳转至补丁函数。
其中,中继空间需要提前通过补丁管理模块进行设置。设置中继空间时,在中继空间写入目标跳转指令码,该目标跳转指令码是根据中继空间和补丁函数计算得到的指令码。该目标跳转指令码包含目标跳转地址,该目标跳转地址根据中继空间地址和补丁函数地址的差值确定。还需要说明的是,如图5b所示,中继空间可以根据该目标跳转指令的种类划分为相应长度的小块空间,其中,目标跳转指令的种类包括长跳转指令和短跳转指令。另外,该小块空间中包含存储若干个存储指令代码或指令代码地址的位置。
以图5c为例,对图5a中LINUX内核热补丁实现方法的步骤进行具体说明。首先,将被补丁函数的第一条指令码INSN_0修改为跳转指令码J_XXX,需要说明的是,该跳转指令码是根据被补丁函数与中继空间计算得到的指令码,根据该跳转指令码,被补丁函数可以跳转至中继空间。该中继空间中包含跳转寄存器,跳转寄存器中写有目标跳转指令码,该目标跳转指令码是根据中继空间和补丁函数计算得到的指令码,因此,在中继空间可以实现由中继空间跳转至补丁函数,实现补丁函数激活。
在一个实施方式中,如图6a所示,去除图5a对应的激活的补丁函数的步骤包括:
步骤61,还原被补丁函数的第一条指令码。
步骤62,回收中继空间。
具体地,以图6b为例,对去除图4b和图5c中激活的补丁函数的步骤进行对应说明。还原被补丁函数的第一条指令码。需要说明的是,当前被补丁函数的第一条指令码为跳转指令码J_XXX,还原被补丁函数的第一条指令码就是将该跳转指令码J_XXX还原为被补丁函数原来的第一条指令码INSN_0。此时,线程恢复对被补丁函数的调用,图4b和图5b中激活的补丁函数去除成功。
需要说明的是,步骤61中还原被补丁函数的第一条指令码后,对补丁函数的调用已经断开,但是,中继空间可能还在继续使用,因此,在一些实施例中,在回收中继空间之前进行中继空间回溯,在回溯时以被补丁函数地址作为关键值进行查找,以判断中继空间是否在继续使用。如图7所示,进行中继空间回溯的步骤包括:
步骤71,查找当前程序寄存器并累计第一查找次数,确定是否有线程在使用该中继空间,如果有线程在使用该中继空间,执行步骤72;如果没有线程在使用该中继空间,执行步骤73。
步骤72,判断第一查找次数是否超过预设第一查找次数,如果超过预设第一查找次数,则停止回收中继空间;如果没有超过预设第一查找次数,则返回步骤71。
步骤73,回收中继空间。
步骤74,停止回收中继空间。
本公开实施例提供的LINUX内核热补丁实现方法,通过将被补丁函数的第一条指令码修改为跳转指令码实现补丁函数的激活。需要说明的是,由于被补丁函数的头部指令修改过程不会使线程中断,修改过程实现了物理原子操作。因此,LINUX系统在不重启的情况下也可以激活补丁函数,实现LINUX内核热补丁,保障了LINUX系统的稳定性。
还需要说明的是,本公开实施例中被补丁函数的头部指令修改过程只涉及到一条指令码的修改,修改过程简单,而且修改过程不涉及内核调用栈的回溯,提高了实现LINUX内核热补丁的效率。
图8a为本发明实施例提供的LINUX内核热补丁实现方法的流程图。该LINUX内核热补丁实现方法针对具有分支延时槽属性的RISC架构,即被补丁函数的指令包含延时槽且在线程执行过程中优先执行延时槽内的指令。另外,为了尽量减少修改被补丁函数所涉及的指令,在修改被补丁函数的头部指令之前,为被补丁函数申请一个中继空间,该中继空间是内核和/或内核模块中预留的可与被补丁函数通过一条指令实现跳转的代码段空间,该中继空间通过补丁管理模块进行初始化。
具体地,如图8a所示,LINUX内核热补丁实现方法,适用于被补丁函数的首条指令包含延时槽的情况,该方法包括:
步骤81,将被补丁函数的第二条指令码修改为断点指令码。
该断点指令码可以截取内核调用栈调用被补丁函数的线程。
需要说明的是,由于当前被补丁函数首条指令包含延时槽,内核调用栈调用该被补丁函数时,会首先执行延时槽内的指令码,其次执行被补丁函数的第二条指令码。因此,为了截取内核调用栈调用被补丁函数的线程,将被补丁函数的第二条指令码修改为断点指令码。该断点指令码可以使线程无法执行断点指令码之后的指令码,并在线程执行过程中根据断点指令码执行断点异常。
该断点异常是该线程在执行过程中由断点触发的操作,该操作在补丁管理模块中进行注册。该操作在注册时,通过修改相应的寄存器上下文挂接相应的操作流程;其中,修改相应的寄存器上下文包括将补丁函数写入寄存器。
在一个实施方式中,挂接的操作流程包括:判断当前是否处于修改指令码的过程中,如果没有处于修改指令码的过程,则进行原有断点标准内核流程;如果处于修改指令码的过程,则判断当前出现断点的函数是否正在进行打补丁操作,如果没有进行打补丁操作,则进行原有断点标准内核流程;如果当前正在进行打补丁操作,则跳转写入补丁函数的寄存器。
需要说明的是,将被补丁函数的第二条指令码修改为跳转指令码是为了对被补丁函数进行打补丁操作,实现补丁函数的激活。因此,在一些实施例中,将被补丁函数的第二条指令码修改为跳转指令码之前,判断被补丁函数能否执行打补丁操作。
在一个实施方式中,解析被补丁函数的汇编指令码,判断该汇编指令码中是否存在跳转到被补丁函数开头的指令码序列,若存在跳转到被补丁函数开头的指令码序列,说明被补丁函数不能执行打补丁操作,停止修改补丁函数的头部指令码;若不存在跳转到被补丁函数开头的指令码序列,说明被补丁函数能够执行打补丁操作,即可以将被补丁函数的第二条指令码修改为跳转指令码进行补丁函数的激活。需要说明的是,在全部函数中,汇编指令码中存在跳转到被补丁函数开头的指令码序列的概率极低。
在一个实施方式中,当因被补丁函数存在跳转到被补丁函数开头的指令码序列而停止修改被补丁函数的头部指令码时,补丁管理模块可以给出提示:建议对被补丁函数中存在的调用函数进行打补丁操作。
步骤82,将被补丁函数的第一条指令码修改为跳转指令码,该跳转指令码是通过被补丁函数与中继空间计算得到的指令码。
其中,跳转指令码包含跳转地址,该跳转地址根据补丁函数地址和中继空间地址的差值确定。该中继空间提前通过补丁管理模块进行设置。设置中继空间时,在中继空间写入目标跳转指令码,该目标跳转指令码是根据中继空间和补丁函数计算得到的指令码;该目标跳转指令码包含目标跳转地址,该目标跳转地址根据中继空间地址和补丁函数地址的差值确定。
步骤83,将被补丁函数的第二条指令码修改为空指令码。
其中,当前的被补丁函数的第二条指令码是断点指令码。由于步骤82中将包含延时槽的被补丁函数的第一条指令码修改为跳转指令码,因此,当内核调用栈调用该被补丁函数时,会首先执行跳转指令码,该断点指令码将不再被执行。
步骤84,在中继空间实现由中继空间跳转至补丁函数。
其中,中继空间设置有由中继空间地址跳转至补丁函数地址的目标跳转指令码。当内核调用栈调用该被补丁函数时,经过被补丁函数的第一条指令码即跳转指令码跳转至中继空间,在中继空间实现由中继空间跳转至补丁函数。
以图8b为例,对图8a中LINUX内核热补丁实现方法的步骤进行具体说明。首先,将被补丁函数的第二条指令码INSN_1修改为断点指令码BRK,使线程执行过程中根据该断点指令码BRK执行断点异常;其次,将被补丁函数的第一条指令码INSN_0修改为跳转指令码J_XXX,该跳转指令码J_XXX是通过被补丁函数与中继空间计算得到的指令码。根据该跳转指令码J_XXX,被补丁函数可以跳转至中继空间,该中继空间中包含跳转寄存器,跳转寄存器中写有目标跳转指令码,该目标跳转指令码是根据中继空间和补丁函数计算得到的指令码。因此,在中继空间可以实现由中继空间跳转至补丁函数,实现补丁函数激活。最后,将被补丁函数的第二条指令码修改为Nop指令码。
本公开实施例提供的LINUX内核热补丁实现方法,适用于具有分支延时槽属性的被补丁函数,首先将被补丁函数的第二条指令码修改为断点指令码,并在线程执行过程中根据该断点指令码执行断点异常。其次,将被补丁函数的第一条指令码修改为跳转指令码,由被补丁函数地址可以间接跳转至补丁函数地址,实现补丁函数的激活。
需要说明的是,由于在修改被补丁函数的头部指令之前注册了断点异常,因此,在将固定指令码的第一字节修改为断点指令码后,线程执行过程即使遇到该断点指令码,也可以根据断点指令码执行断点异常,线程不会中断。即本公开实施例中被补丁函数的头部指令修改过程实现了逻辑原子操作,LINUX系统在不重启的情况下也可以激活补丁函数,实现LINUX内核热补丁,保障LINUX系统的稳定性。
还需要说明的是,该修改被补丁函数头部指令的过程涉及到两条指令码的修改,修改过程简单,而且修改过程不涉及内核调用栈的回溯,提高了实现LINUX内核热补丁的效率。
图9a为本发明实施例提供的LINUX内核热补丁实现方法的流程图。该LINUX内核热补丁实现方法针对具有分支延时槽属性的RISC架构,即被补丁函数的指令包含延时槽且在线程执行过程中优先执行延时槽内的指令。为了尽量减少修改被补丁函数所涉及的指令,在修改被补丁函数的头部指令之前,为被补丁函数申请一个中继空间,该中继空间是内核和/或内核模块中预留的可与被补丁函数通过一条指令实现跳转的代码段空间,该中继空间通过补丁管理模块进行初始化。
具体地,如图9a所示,LINUX内核热补丁实现方法,适用于被补丁函数的首条指令不包含延时槽的情况,该方法包括:
步骤91,将被补丁函数的第一条指令码修改为断点指令码。
该断点指令码可以截取内核调用栈调用被补丁函数的线程。
需要说明的是,由于当前被补丁函数首条指令不包含延时槽,内核调用栈调用该被补丁函数时,会首先执行延时槽内的指令码,其次执行被补丁函数的第一条指令码。因此,为了截取内核调用栈调用被补丁函数的线程,将被补丁函数的第一条指令码修改为断点指令码。
需要说明的是,将被补丁函数的第一条指令码修改为跳转指令码是为了对被补丁函数进行打补丁操作,实现补丁函数的激活。因此,在一些实施例中,将被补丁函数的第一条指令码修改为跳转指令码之前,判断被补丁函数能否执行打补丁操作。
在一个实施方式中,解析被补丁函数的汇编指令码,判断该汇编指令码中是否存在跳转到被补丁函数开头的指令码序列,若存在跳转到被补丁函数开头的指令码序列,说明被补丁函数不能执行打补丁操作,停止修改补丁函数的头部指令码;若不存在跳转到被补丁函数开头的指令码序列,说明被补丁函数能够执行打补丁操作,即可以将被补丁函数的第一条指令码修改为跳转指令码进行补丁函数的激活。需要说明的是,在全部函数中,汇编指令码中存在跳转到被补丁函数开头的指令码序列的概率极低。
在一个实施方式中,当因被补丁函数存在跳转到被补丁函数开头的指令码序列而停止修改被补丁函数的头部指令码时,补丁管理模块可以给出提示:建议对被补丁函数中存在的调用函数进行打补丁操作。
步骤92,在线程执行过程中根据断点指令码执行断点异常。
该断点异常是该线程在执行过程中由断点触发的操作,该操作在补丁管理模块中进行注册。该操作在注册时,通过修改相应的寄存器上下文挂接相应的操作流程;其中,修改相应的寄存器上下文包括将补丁函数写入寄存器。
在一个实施方式中,挂接的操作流程包括:判断当前是否处于修改指令码的过程中,如果没有处于修改指令码的过程,则进行原有断点标准内核流程;如果处于修改指令码的过程,则判断当前出现断点的函数是否正在进行打补丁操作,如果没有进行打补丁操作,则进行原有断点标准内核流程;如果当前正在进行打补丁操作,则跳转写入补丁函数的寄存器。
步骤93,将被补丁函数的第二条指令码修改为空指令码。
需要说明的是,如果存在一个内核调用栈,该内核调用栈正在调用被补丁函数,且调用被补丁函数的线程已经执行完成补丁函数未修改时的第一条指令码。此时将被补丁函数的第二条指令码修改为空指令码就会导致指令码序列不兼容,即该内核调用栈的线程执行的第一条指令码为被补丁函数的原指令码,执行的第二条指令码为修改后的指令码。为了防止出现指令码序列不兼容的情况,在将被补丁函数的第二条指令码修改为空指令码之前,确定该第二条指令码的地址是否被内核栈穿过,即确定第二条指令码是否正在被执行,当第二条指令码没有被执行时,将将被补丁函数的第二条指令码修改为空指令码。
在一个实施方式中,如图10所示,确定被补丁函数的第二条指令码的地址是否被内核栈穿过的步骤包括:
步骤101,查找所有线程栈的当前的程序寄存器确定该程序寄存器中是否存储被补丁函数的第二条指令码的地址;如果任意一个线程栈的程序寄存器中存储有第二条指令码的地址,执行步骤103;如果所有线程栈的程序寄存器中没有存储第二条指令码的地址,则执行步骤102。
步骤102,查找所有中断栈确定该中断栈中是否存储第二条指令码的地址;如果任意一个中断栈中存储有第二条指令码的地址,执行步骤103;如果所有程序寄存器中没有存储第二条指令码的地址,则执行步骤104。
步骤103,返回当前第二条指令码正在被执行的信息。
步骤104,返回当前第二条指令码没有被执行的信息。
步骤94,将被补丁函数的第一条指令码修改为跳转指令码,该跳转指令码是通过被补丁函数与中继空间计算得到的指令码。
其中,在中继空间设置有由中继空间地址跳转至补丁函数地址的目标跳转指令码;该目标跳转指令码包含目标跳转地址,该目标跳转地址根据中继空间地址和补丁函数地址的差值确定。
以图9b为例,对图9a中LINUX内核热补丁实现方法的步骤进行具体说明。首先,将被补丁函数的第一条指令码INSN_0修改为断点指令码BRK,使线程执行过程中根据该断点指令码BRK执行断点异常;其次,将被补丁函数的第二条指令码INSN_1修改为Nop指令码。然后,将断点指令码BRK修改为跳转指令码J_XXX,该跳转指令码J_XXX是通过被补丁函数与中继空间计算得到的指令码。根据该跳转指令码J_XXX,被补丁函数可以跳转至中继空间,该中继空间中包含跳转寄存器,跳转寄存器中写有目标跳转指令码,该目标跳转指令码是根据中继空间和补丁函数计算得到的指令码。因此,在中继空间可以实现由中继空间跳转至补丁函数,实现补丁函数激活。
在一个实施方式中,如图11a所示,去除上述图8a和图9a对应的激活的补丁函数的步骤包括:
步骤111,将被补丁函数的第一字节修改为断点指令码。
步骤112,还原被补丁函数的第二条指令码。
步骤113,还原被补丁函数的第一条指令码。
步骤114,回收中继空间。
具体的,以图11b为例,对去除图8b和图a9b中激活的补丁函数的步骤进行对应说明。首先,将被补丁函数的第一字节修改为断点指令码BRK,在线程执行过程中根据断点指令码执行断点异常,需要说明的是,此时被补丁函数的第一字节为跳转指令J_XXX。其次,还原被补丁函数的第二条指令码,此时被补丁函数的第二条指令码为Nop指令码,还原被补丁函数的第二条指令码就是将Nop指令码还原为INSN_1指令码。最后,还原被补丁函数的第一条指令码,即将断点指令码BRK修改为INSN_0指令码。此时,线程恢复对被补丁函数的调用,图8b和图9b中激活的补丁函数去除成功。
需要说明的是,步骤113中还原被补丁函数的第一条指令码后,对补丁函数的调用已经断开,但是,中继空间可能还在继续使用,因此,在一些实施例中,在回收中继空间之前进行中继空间回溯,在回溯时以被补丁函数地址作为关键值进行查找,以判断中继空间是否在继续使用。如图12所示,进行中继空间回溯的步骤包括:
步骤121,查找当前程序寄存器并累计第一查找次数,确定是否有线程在使用该中继空间,如果有线程在使用该中继空间,执行步骤122;如果没有线程在使用该中继空间,执行步骤123。
步骤122,判断第一查找次数是否超过预设第一查找次数,如果超过预设第一查找次数,则执行步骤126;如果没有超过预设第一查找次数,则返回步骤121。
步骤123,查找内核中断栈并累计第二查找次数,确定是否有中断栈在使用该中继空间,如果有线程在使用该中继空间,执行步骤124;如果没有线程在使用该中继空间,执行步骤125。
步骤124,判断第二查找次数是否超过预设第二查找次数,如果超过预设第二查找次数,则执行步骤126;如果没有超过预设第二查找次数,则返回步骤123。
步骤125,回收中继空间。
步骤126,停止回收中继空间。
本公开实施例提供的LINUX内核热补丁实现方法,适用于具有分支延时槽属性的被补丁函数,首先将被补丁函数的第一条指令码修改为断点指令码,并在线程执行过程中根据该断点指令码执行断点异常。其次,将被补丁函数的第一条指令码修改为跳转指令码,由被补丁函数地址可以间接跳转至补丁函数地址,实现补丁函数的激活。
需要说明的是,由于在修改被补丁函数的头部指令之前注册了断点异常,因此,在将固定指令码的第一字节修改为断点指令码后,线程执行过程即使遇到该断点指令码,也可以根据断点指令码执行断点异常,线程不会中断。即本公开实施例中被补丁函数的头部指令修改过程实现了逻辑原子操作,LINUX系统在不重启的情况下也可以激活补丁函数,实现LINUX内核热补丁,保障LINUX系统的稳定性。
还需要说明的是,该修改被补丁函数头部指令的过程涉及到两条指令码的修改,修改过程简单。而且修改过程仅仅只涉及程序寄存器和中断栈的回溯,不涉及全部内核栈的回溯,提高了实现LINUX内核热补丁的效率。
第二方面,本公开实施例提供一种电子设备,其包括:
一个或多个处理器;
存储装置,其上存储有一个或多个程序,当一个或多个程序被一个或多个处理器执行,使得一个或多个处理器实现上述任意一种LINUX内核热补丁实现方法。
第三方面,本公开实施例提供一种计算机可读介质,其上存储有计算机程序,程序被处理器执行时实现上述任意一种LINUX内核热补丁实现方法。
本领域普通技术人员可以理解,上文中所公开方法中的全部或某些步骤、系统、装置中的功能模块/单元可以被实施为软件、固件、硬件及其适当的组合。在硬件实施方式中,在以上描述中提及的功能模块/单元之间的划分不一定对应于物理组件的划分;例如,一个物理组件可以具有多个功能,或者一个功能或步骤可以由若干物理组件合作执行。某些物理组件或所有物理组件可以被实施为由处理器,如中央处理器、数字信号处理器或微处理器执行的软件,或者被实施为硬件,或者被实施为集成电路,如专用集成电路。这样的软件可以分布在计算机可读介质上,计算机可读介质可以包括计算机存储介质(或非暂时性介质)和通信介质(或暂时性介质)。如本领域普通技术人员公知的,术语计算机存储介质包括在用于存储信息(诸如计算机可读指令、数据结构、程序模块或其它数据)的任何方法或技术中实施的易失性和非易失性、可移除和不可移除介质。计算机存储介质包括但不限于RAM、ROM、EEPROM、闪存或其它存储器技术、CD-ROM、数字多功能盘(DVD)或其它光盘存储、磁盒、磁带、磁盘存储或其它磁存储装置、或者可以用于存储期望的信息并且可以被计算机访问的任何其它的介质。此外,本领域普通技术人员公知的是,通信介质通常包含计算机可读指令、数据结构、程序模块或者诸如载波或其它传输机制之类的调制数据信号中的其它数据,并且可包括任何信息递送介质。
本文已经公开了示例实施例,并且虽然采用了具体术语,但它们仅用于并仅应当被解释为一般说明性含义,并且不用于限制的目的。在一些实例中,对本领域技术人员显而易见的是,除非另外明确指出,否则可单独使用与特定实施例相结合描述的特征、特性和/或元素,或可与其它实施例相结合描述的特征、特性和/或元件组合使用。因此,本领域技术人员将理解,在不脱离由所附的权利要求阐明的本公开的范围的情况下,可进行各种形式和细节上的改变。

Claims (10)

1.一种LINUX内核热补丁实现方法,其包括:
通过原子操作方式修改被补丁函数的头部指令码,由被补丁函数地址直接或间接跳转至补丁函数地址,实现补丁函数的激活。
2.根据权利要求1所述的方法,其中,还包括:
在所述被补丁函数的第一条指令码前增加X字节的固定指令码;其中,X为大于4的整数;所述第一条指令码为所述头部指令码;
将所述固定指令码的第一字节修改为断点指令码;
在线程执行过程中根据所述断点指令码执行断点异常;
将所述断点指令码的返回执行地址修改为跳转地址;
将所述断点指令码修改为跳转指令。
3.根据权利要求2所述的方法,其中,所述在所述被补丁函数的第一条指令码前增加X字节的固定指令码之前,还包括:
判断所述被补丁函数的第一条指令码前是否设置有固定指令码,若有,则停止修改所述被补丁函数的头部指令码。
4.根据权利要求1所述的方法,其中,还包括:
将所述被补丁函数的第一条指令码修改为跳转指令码,其中,所述第一条指令码为所述头部指令码;所述跳转指令码是通过所述补丁函数和所述被补丁函数计算得到的指令码。
5.根据权利要求1所述的方法,其中,还包括:
将所述被补丁函数的第一条指令码修改为跳转指令码;其中,所述第一条指令码为所述头部指令码;所述跳转指令码是根据所述被补丁函数与中继空间计算得到的指令码;所述中继空间是内核和/或内核模块中预留的可与被补丁函数通过一条指令实现跳转的代码段空间;所述中继空间设置有由中继空间地址跳转至补丁函数地址的目标跳转指令码;
在所述中继空间实现由所述中继空间跳转至补丁函数。
6.根据权利要求1所述的方法,其中,还包括:
将所述被补丁函数的第二条指令码修改为断点指令码;
将所述被补丁函数的第一条指令码修改为跳转指令码;其中,所述第一条指令码和所述第二条指令码为所述头部指令码;所述跳转指令码是通过被补丁函数与中继空间计算得到的指令码;所述中继空间是内核和/或内核模块中预留的可与被补丁函数通过一条指令实现跳转的代码段空间;而且,在所述中继空间设置有由所述中继空间地址跳转至补丁函数地址的目标跳转指令码;
将所述被补丁函数的第二条指令码修改为空指令码;
在所述中继空间实现由所述中继空间跳转至补丁函数。
7.根据权利要求1所述的方法,其中,还包括:
将所述被补丁函数的第一条指令码修改为断点指令码;
在线程执行过程中根据所述断点指令码执行断点异常;
将所述被补丁函数的第二条指令码修改为空指令码;所述第二条指令码和所述第一条指令码为所述头部指令码;
将所述被补丁函数的第一条指令码修改为跳转指令码;其中,所述跳转指令码是通过所述被补丁函数与中继空间计算得到的指令码;所述中继空间是内核和/或内核模块中预留的可与被补丁函数通过一条指令实现跳转的代码段空间;而且,在所述中继空间设置有由所述中继空间地址跳转至补丁函数地址的目标跳转指令码。
8.根据权利要求5-7任意一项所述的方法,其中,所述将所述被补丁函数的第一条指令码修改为跳转指令码之前,还包括:
设置所述中继空间;
在所述中继空间写入所述目标跳转指令码;其中,所述目标跳转指令码是根据所述中继空间和所述补丁函数计算得到的指令码。
9.一种电子设备,其包括:
一个或多个处理器;
存储装置,其上存储有一个或多个程序,当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现根据权利要求1-8任意一项所述的方法。
10.一种计算机可读介质,其上存储有计算机程序,所述程序被处理器执行时实现根据权利要求1-8任意一项所述的方法。
CN201911283684.XA 2019-12-13 2019-12-13 Linux内核热补丁实现方法、电子设备及计算机可读介质 Pending CN112988182A (zh)

Priority Applications (3)

Application Number Priority Date Filing Date Title
CN201911283684.XA CN112988182A (zh) 2019-12-13 2019-12-13 Linux内核热补丁实现方法、电子设备及计算机可读介质
US17/783,015 US11868763B2 (en) 2019-12-13 2020-11-16 Method for implementing Linux kernel hot patch, electronic device, and computer readable medium
PCT/CN2020/129031 WO2021115036A1 (zh) 2019-12-13 2020-11-16 Linux内核热补丁实现方法、电子设备及计算机可读介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201911283684.XA CN112988182A (zh) 2019-12-13 2019-12-13 Linux内核热补丁实现方法、电子设备及计算机可读介质

Publications (1)

Publication Number Publication Date
CN112988182A true CN112988182A (zh) 2021-06-18

Family

ID=76329587

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201911283684.XA Pending CN112988182A (zh) 2019-12-13 2019-12-13 Linux内核热补丁实现方法、电子设备及计算机可读介质

Country Status (3)

Country Link
US (1) US11868763B2 (zh)
CN (1) CN112988182A (zh)
WO (1) WO2021115036A1 (zh)

Family Cites Families (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7472384B1 (en) 2003-12-02 2008-12-30 Swsoft Holdings, Ltd. System, method and computer program product for on-the-fly patching of executable code
CN101799763B (zh) * 2009-02-10 2013-01-30 华为技术有限公司 内核在线补丁的方法、装置和系统
CN102156661B (zh) * 2010-02-11 2013-06-12 华为技术有限公司 在线补丁的激活方法、装置及系统
CN101882094A (zh) * 2010-06-10 2010-11-10 中兴通讯股份有限公司 嵌入式系统制作补丁的方法和系统
CN102982277A (zh) * 2012-12-24 2013-03-20 广东威创视讯科技股份有限公司 一种实现嵌入式系统软件补丁的方法和系统
US10310863B1 (en) 2013-07-31 2019-06-04 Red Hat, Inc. Patching functions in use on a running computer system
CN103399775A (zh) * 2013-08-05 2013-11-20 北京华为数字技术有限公司 一种热补丁方法及设备
US9164754B1 (en) * 2013-12-18 2015-10-20 Amazon Technologies, Inc. Runtime patching of native-code programs
CN105988798B (zh) * 2015-02-12 2020-07-31 南京中兴软件有限责任公司 补丁处理方法及装置
CN105138341A (zh) * 2015-09-24 2015-12-09 上海斐讯数据通信技术有限公司 基于MIPS架构和vxworks系统实现热补丁长跳转的方法

Also Published As

Publication number Publication date
US20230016250A1 (en) 2023-01-19
WO2021115036A1 (zh) 2021-06-17
US11868763B2 (en) 2024-01-09

Similar Documents

Publication Publication Date Title
US7207047B2 (en) System and method for recovering applications
US8499289B2 (en) Method, device and system for realizing kernel online patching
CN107783776B (zh) 固件升级包的处理方法及装置、电子设备
US20040049669A1 (en) Firmware architecture supporting safe updates and multiple processor types
US8799716B2 (en) Heap dump occurrence detection
CN111090546B (zh) 一种操作系统重启方法、装置、设备及可读存储介质
CN106997313B (zh) 一种应用程序的信号处理方法、系统及终端设备
CN114860291A (zh) 一种引导及应用程序灵活储存与升级的方法
CN107967192B (zh) 一种智能终端的系统崩溃处理方法和装置
KR20190108458A (ko) 함수 결함을 복구하는 방법, 장치 및 서버
CN112988182A (zh) Linux内核热补丁实现方法、电子设备及计算机可读介质
CN116795408A (zh) Ecu的软件升级方法、系统及车辆
JP2005284902A (ja) 端末装置、その制御方法及び制御プログラム、ホスト装置、その制御方法及び制御プログラム、遠隔更新システム、方法及びプログラム
CN111949290B (zh) 一种热补丁管理方法、装置、电子设备及存储介质
CN112395137B (zh) 一种linux内核异常的处理方法、设备及装置
CN114546455A (zh) 一种双分区的mcu软件升级方法及装置
US9804932B2 (en) Method and device for processing data and electronic apparatus
CN110543322A (zh) 一种针对龙芯平台的热补丁方法及装置
CN110806917A (zh) 一种防脑裂的虚拟机高可用的管理装置及方法
US20120185686A1 (en) Method, Apparatus and Computer Program for Loading Files During a Boot-Up Process
US20230401069A1 (en) Exception handling method and related apparatus
CN112783547A (zh) 软件更新的版本回溯方法、计算机设备及存储介质
CN115658152A (zh) 固件升级方法、固件、电子设备和计算机可读存储介质
CN114265603A (zh) 基于不对称分区的系统升级方法、装置和电子设备
CN116974600A (zh) 智能电能表iap升级方法、装置及相关设备

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