CN114528141A - 一种嵌入式系统内核态下程序缺陷修复的方法和装置 - Google Patents

一种嵌入式系统内核态下程序缺陷修复的方法和装置 Download PDF

Info

Publication number
CN114528141A
CN114528141A CN202210142015.6A CN202210142015A CN114528141A CN 114528141 A CN114528141 A CN 114528141A CN 202210142015 A CN202210142015 A CN 202210142015A CN 114528141 A CN114528141 A CN 114528141A
Authority
CN
China
Prior art keywords
segment
patch
address
memory
kernel
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
CN202210142015.6A
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.)
Fiberhome Telecommunication Technologies Co Ltd
Original Assignee
Fiberhome Telecommunication Technologies 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 Fiberhome Telecommunication Technologies Co Ltd filed Critical Fiberhome Telecommunication Technologies Co Ltd
Priority to CN202210142015.6A priority Critical patent/CN114528141A/zh
Publication of CN114528141A publication Critical patent/CN114528141A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
    • G06F11/0706Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation the processing taking place on a specific hardware platform or in a specific software environment
    • G06F11/0736Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation the processing taking place on a specific hardware platform or in a specific software environment in functional embedded systems, i.e. in a data processing system designed as a combination of hardware and software dedicated to performing a certain function
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
    • G06F11/0793Remedial or corrective actions

Abstract

本发明涉及嵌入式软件领域,特别是涉及一种嵌入式系统内核态下程序缺陷修复的方法和装置。主要包括:将进程需要使用的补丁段所在的共享库传递给内核模块,内核模块将共享库加载到相应进程的进程空间;内核模块获取内存控制块中补丁段所对应的原内存段和补丁段的地址,将内存控制块中原内存段的地址替换为补丁段的地址。本发明可以在任意进程需要修复或者修改、新增程序功能时,方便的进行替换和修复,而不需要提前让进程做好初始化等相关操作,也不用在操作后重启进程,可以实现在线修复、修改或者新增功能,增强程序的健壮性。

Description

一种嵌入式系统内核态下程序缺陷修复的方法和装置
【技术领域】
本发明涉及嵌入式软件领域,特别是涉及一种嵌入式系统内核态下程序缺陷修复的方法和装置。
【背景技术】
在嵌入式软件技术领域,进程运行的状态分为内核态和用户态。在内核态下运行用户进程时,cpu可以访问内存的所有数据,包括外围设备,例如硬盘,网卡,cpu也可以将自己从一个程序切换到另一个程序。在用户态下运行用户进程时,进程只能受限的访问内存,且不允许访问外围设备,占用cpu的能力被剥夺,cpu资源可以被其他程序获取。
在目前的系统进程调度方法中,当某个正在运行的内核态进程出现缺陷或者需要修改、增加某些功能时,必须关闭该进程,进行修改后再次启动进程。但是,在某些场景中,一些重要进程必须保持持续运行,不能关闭或中断,因此,造成了程序缺陷修复较为困难。
鉴于此,如何克服现有技术所存在的缺陷,解决内核态下程序缺陷修复困难的现象,是本技术领域待解决的问题。
【发明内容】
针对现有技术的以上缺陷或改进需求,本发明解决了内核态下不关闭进程对程序进行缺陷修复的问题。
本发明实施例采用如下技术方案:
第一方面,本发明提供了一种嵌入式系统内核态下程序缺陷修复的方法,具体为:将进程需要使用的补丁段所在的共享库传递给内核模块,内核模块将共享库加载到相应进程的进程空间;内核模块获取内存控制块中补丁段所对应的原内存段和补丁段的地址,将内存控制块中原内存段的地址替换为补丁段的地址。
优选的,内核模块将共享库加载到相应进程的进程空间,具体包括:获取共享库中需使用的补丁段的段信息,将补丁段读入进程对应的虚地址空间;内核模块根据进程的进程控制信息获取对应的内存控制块,将补丁段的虚地址写入对应的内存控制块中;根据补丁段的虚地址,对需修复的函数进行重定位。
优选的,将补丁段的虚地址写入对应的内存控制块中,具体包括:在进程的内存控制块中增加补丁段的段信息,将补丁段的虚地址写入内存控制块内对应的段信息中。
优选的,还包括:获取共享库中需使用的补丁段的段信息之前,进程暂停执行;对需修复的函数进行重定位之后,进程继续执行。
优选的,内核模块获取内存控制块中补丁段所对应的原内存段和补丁段的地址,具体包括:获取原内存段和补丁段的虚拟地址,将原内存段和补丁段的虚拟地址转换为内核线性地址。
优选的,获取原内存段和补丁段的虚拟地址,具体包括:解析原内存段和补丁段所在文件,分别获取原内存段和补丁段在文件中的偏移地址;解析进程的maps文件,分别获取原内存段和补丁段所在模块的运行基地址;以原内存段所在模块的运行基地址为起点根据原内存段的偏移地址进行偏移获取原内存段运行时的虚拟地址,以补丁段所在模块的运行基地址为起点根据补丁段的偏移地址进行偏移获取补丁段运行时的虚拟地址。
优选的,将原内存段和补丁段的虚拟地址转换为内核线性地址,具体包括:通过进程的进程控制信息和内存控制块中补丁段的地址,获取进程对应的内核虚拟页表;根据内存控制块中补丁段的地址和内核虚拟页表的信息,获取补丁段的物理地址;将补丁段的物理地址转换为内核线性地址。
优选的,还包括:根据原内存段的内核线性地址读取原内存段的汇编指令备份;将原内存段的汇编指令替换为补丁段的汇编指令。
优选的,还包括:内核模块获取进程的进程ID,根据进程ID获取进程的进程控制块和内存管理单元。
另一方面,本发明提供了一种嵌入式系统内核态下程序缺陷修复的装置,具体为:包括至少一个处理器和存储器,至少一个处理器和存储器之间通过数据总线连接,存储器存储能被至少一个处理器执行的指令,指令在被处理器执行后,用于完成第一方面中的嵌入式系统内核态下程序缺陷修复的方法。
与现有技术相比,本发明实施例的有益效果在于:将用户修复的补丁段加载入进程空间中,并通过地址转换和地址替换将内核的调用地址由原内存段地址重定向至补丁段内存地址,达到程序修复的效果。利用本发明中的技术方案,可以在任意进程需要修复或者修改、新增程序功能时,方便的进行替换和修复,而不需要提前让进程做好初始化等相关操作,也不用在操作后重启进程,可以实现在线修复、修改或者新增功能,增强程序的健壮性。
【附图说明】
为了更清楚地说明本发明实施例的技术方案,下面将对本发明实施例中所需要使用的附图作简单地介绍。显而易见地,下面所描述的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的一种嵌入式系统内核态下程序缺陷修复的方法流程图;
图2为本发明实施例提供的另一种嵌入式系统内核态下程序缺陷修复的方法流程图;
图3为本发明实施例提供的一种嵌入式系统内核态下程序缺陷修复的方法流程图;
图4为本发明实施例提供的一种嵌入式系统内核态下程序缺陷修复的方法流程图;
图5为本发明实施例提供的一种嵌入式系统内核态下程序缺陷修复的方法流程图;
图6为本发明实施例提供的一种嵌入式系统内核态下程序缺陷修复的装置结构示意图。
【具体实施方式】
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
本发明是一种特定功能系统的体系结构,因此在具体实施例中主要说明各结构模组的功能逻辑关系,并不对具体软件和硬件实施方式做限定。
此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。下面就参考附图和实施例结合来详细说明本发明。
实施例1:
在进行程序缺陷修复时,需要将补丁代码或补丁数据载入内存中,使用补丁代码或补丁数据替换原进程中的代码或数据。在现有技术方案中,用户态运行时,由于用户态权限的限制,不便于直接获取外部数据,需要关闭进程修复后再重启;内核态运行时,由于内核模块不能直接操作用户态进程的虚拟地址,因此也无法直接进行替换。在本实施例中,虚拟地址也简称为虚地址。本发明提供了一种程序缺陷修复方法,适用于用户态进程和内核态进程,可以在不关闭进程的情况下进行代码或数据的替换,完成程序修复。
如图1所示,本发明实施例提供的嵌入式系统内核态下程序缺陷修复的方法具体步骤如下:
步骤101:将进程需要使用的补丁段所在的共享库传递给内核模块,内核模块将共享库加载到相应进程的进程空间。
在进程的运行过程中,可以通过共享库获取外部代码或数据。在本实施例提供的方案中,进程修复或者修改、新增的程序功能或数据,也使用共享库来提供。在进程中如果要使用某个共享库,需要将其加载到该进程的进程空间中。在嵌入式系统中,共享库具体为动态链接库so。当第一个需要共享库中的模块的程序启动时,共享库的单个副本就会在运行时被加载进内存。当后续使用同一共享库的其他程序启动时,会使用已经被加载进内存的库的副本。基于共享库的这一特性,可以通过共享库对程序进行修复,首先通过共享库获取到用于修复的代码或数据,再在步骤102中进行调用地址的重定位,使得进程运行时可以使用共享库中的代码或数据,而不使用原进程的代码或数据,达到修复的效果。
以代码修复为例,当代码中首次调用该so代码段中修复后需使用的补丁函数时,操作系统在执行至该函数时,会根据进程控制块中的函数调用信息去获取函数虚地址对应的物理地址中的函数指令并执行。此时,物理地址中会标记该物理地址对应的磁盘数据是否载入了物理内存,如果没有载入则将磁盘中对应的数据载入物理内存,再读取物理内存中相应的函数指令进行执行。当再次调用该函数时,由于上述过程中函数指令已经载入物理内存中,所以直接获取相应数据并执行。当进行数据修复时,也通过同样的过程,根据进程控制块中的数据虚地址,由共享库中将相应的数据读入物理内存中使用。
通过上述过程,能够在内核态把指定so加载到指定用户进程中,执行后的结果与该用户态进程自己调用dlopen加载so结果相同。在具体的实施场景中,若在用户态dlopen一个so,只是在内存管理中增加一些项建立起映射关系。用户态进程自己调用dlopen加载so的也仅是进行了虚拟内核和物理内存的映射。当实际调用到该so中的函数时,操作系统才会真正把so中的东西载入物理内存中。步骤101中,相当于在内核态中完成了上述用户态所进行的so载入工作。
步骤102:内核模块获取内存控制块(Process Control Block,简写为PCB)中补丁段所对应的原内存段和补丁段的地址,将内存控制块中原内存段的地址替换为补丁段的地址。
共享库在编译时必须要使用独立的地址段对代码或数据进行存储,因此,无法直接使用代码或数据替换的方式,在进程运行时,必须要处理调用关系,执行符号重定位,即将原进程中的函数调用或数据调用地址替换为已加载进内存中的共享库中的代码段或数据段地址。当新代码所在的共享库被加载到指定进程中后,需要获取该进程需要被修改或者修复的函数所在地址,然后将内存控制块中原代码段或数据段的地址修改为步骤101中加载进内存中的共享库中的补丁代码段或补丁数据段地址,使用进程在调用时可以调用加载进内存的补丁代码段或补丁数据段。进一步的,由于内核模块不能直接操作用户态进程的虚拟地址,因此还需要将指定进程的虚拟地址转为物理地址,并进一步将物理地址转换为内核能操作的内核线性地址。由于用户态和内核态的虚地址转物理地址的转换方式不同,使用内核线性地址的转换步骤可以保证转换后的物理地址相同。
经过本实施例中提供的步骤101-步骤102后,即可在内核态下将共享库so加载到指定的用户态进程的地址空间中,并通过修改进程控制块中的调用映射关系,找到需替换的代码段或数据段,获取用于修改的代码或数据。由于共享库加载和调用地址重定位都在内核模块中进行,不会影响到进程的运行,因此,可以在进程无需关闭的情况下完成程序缺陷修复。
进一步的,由于每个进程都有唯一的进程ID(process ID,简写为PID),每个进程的内存控制块以内存管理结构的形式放在内核中,内核模块获取进程的进程ID,根据进程ID获取进程的进程控制块和内存管理单元,内存管理单元中包含每个进程的内存管理信息,包括各代码段或数据段的调用地址信息。
在步骤101中,如图2所示,内核模块将共享库加载到相应进程的进程空间,具体包括以下步骤。
步骤201:获取共享库中需使用的补丁段的段信息,将补丁段读入进程对应的虚地址空间。
为了将需要使用的补丁段加载进内存并传递给内核模块,需要解析共享库,并获取共享库的段信息,再将需要载入内存的代码段或数据段读入进程的虚地址空间中。在实际使用中,需要载入内存的段信息主要包括属性为LOAD的段,这些段包括代码段,数据段,BSS段等。在该过程中,使用的地址数据为进程所管理的虚拟地址空间,而不是实际的物理内存地址。在进行数据存取时,进程所管理的和操作的都是自身所能管理的虚拟内存,虚拟内存的读写地址为虚地址,在读写这些虚拟内存时,由操作系统根据进程的内存管理单元中的相应信息获取实际的物理内存,然后读写物理内存。
步骤202:内核模块根据用户态进程的进程控制信息获取对应的内存控制块,将补丁段的虚地址写入对应的内存控制块中。
在进行代码或数据调用时,内核模块根据相应进程的内存控制块中的内存管理信息,即mm_struct中保存的地址进行调用。为了使进程运行时内核模块能够调用补丁段的代码或数据以替换原代码或原数据,需要对用户态内存空间进行手动映射,把补丁段的虚地址写入内存控制块中相应的位置。内存控制块中仅保存内存地址相关内容,例如通过代码段的写入起始地址结束地址等记录代码段信息,在调用时直接根据地址信息在内存中进行查找即可。
步骤203:根据补丁段的虚地址,对需修复的函数进行重定位。
共享库被加载到进程的地址空间,并且补丁段的地址写入内存控制块相应的位置后,内核模块即通过该地址对共享库中的补丁代码或补丁数据进行重定位,在执行时调用修复后的补丁代码或补丁数据。
经过本实施例中提供的步骤201-步骤203后,即可完成补丁段的重定位,使得内核模块可以对补丁段或补丁数据进行调用。
步骤202中,将补丁段的虚地址写入对应的内存控制块中时,需要在进程的内存控制块中增加补丁段的段信息,将补丁段的虚地址写入内存控制块内对应的段信息中。具体的,在内存管理单元中添加记录补丁段或补丁数据地址信息的数据,例如代码段的起始地址,结束地址,还有地址到物理内存地址的映射关系。其中,写入的地址信息为虚地址信息。
进一步的,在步骤102中,由于内核模块和用户态进程所使用的虚地址向物理地址转换的方式不同,因此内核模块在进行地址替换时不能直接使用用户态进程的虚地址,需要将虚地址转换为内核线性地址后再进行替换。具体的,可以获取原内存段和补丁段的虚拟地址,将原内存段和补丁段的虚拟地址转换为内核线性地址。在实际使用场景中,可以通过用户态进程的maps文件获取相应段的虚地址,解析原内存段和补丁段所在文件,分别获取原内存段和补丁段在文件中的偏移地址。解析用户态进程的maps文件,分别获取原内存段和补丁段所在模块的运行基地址。以原内存段所在模块的运行基地址为起点根据原内存段的偏移地址进行偏移获取原内存段运行时的虚拟地址,以补丁段所在模块的运行基地址为起点根据补丁段的偏移地址进行偏移获取补丁段运行时的虚拟地址。获取到虚拟地址后,通过进程的进程控制信息和内存控制块中补丁段的地址,获取进程对应的内核虚拟页表。根据内存控制块中补丁段的地址和内核虚拟页表的信息,获取补丁段的物理地址。将补丁段的物理地址转换为内核线性地址。通过上述步骤,即可将内核模块不能直接操作的用户进程的虚地址转换为内核模块能够使用的一致的内核线性地址,使内核模块能够通过替换后的地址准确对补丁段进行重定义。
进一步的,为了避免在进行修补时,由于代码或数据的替换出现执行错误,在进行替换时,需要将进程暂停,使进程处于sleep状态。获取共享库中需使用的补丁段的段信息之前,修改进程的控制信息的状态,进程暂停执行。对需修复的函数进行重定位之后,修改进程的控制信息的状态,进程继续执行。由于本实施例提供的方法仅对进程中的部分代码或数据进行重定位,而不更改原代码或数据,因此无需关闭进程。
进一步的,除了直接使用共享库的重定位进行程序修复之外,本实施例提供的方案还可以根据共享库中的补丁代码或补丁数据直接完成进程原代码或原数据进行修改,完成程序的重新发布。具体的,可以根据原内存段的内核线性地址读取原内存段的汇编指令备份,将原内存段的汇编指令替换为补丁段的汇编指令。进行指令替换后,进程的原代码或原数据完成了修复,可以按照正常的流程进行执行,无需再次利用共享库进行重定位调用共享库中的代码或数据。
在具体实施场景中,本实施例提供的程序修复方法,可以直接编译到内核代码中由内核模块执行,也可以作为内核模块的形式在需要的时候加载到内核中。当需要修改或者修复、新增程序功能时,将需要修改或者修复的用户态进程的进程ID和新代码所在的共享库信息传递给该内核模块,内核模块在接收到这些信息后再使用本发明涉及的技术处理。
本实施例提供的嵌入式系统内核态下程序缺陷修复的方法,能够。
实施例2:
本实施例中,基于实施例1提供的嵌入式系统内核态下程序缺陷修复的方法,以通过热补丁方式为进程替换补丁函数为例,提供了一个具体场景中的使用过程。
按照步骤101,将需要打补丁的用户态进程pid和新代码所在的热补丁so信息传递给内核模块。具体实现方式可以采用如下2种方式进行。
方法1:用户态提供一个接口,将进程的pid和热补丁so所在路径传递给内核模块。
方法2:通过proc文件系统,将进程的pid和热补丁so所在路径传递给内核模块。例如要给进程ID为1234的进程加载补丁libpatch.so,使用proc文件系统传递参数如下:echo1234/dev/shm/libpatch.so>/proc/hotpatch。
具体的,如图3所示,将补丁so加载到需要打补丁的进程中,可以使用以下步骤。
步骤301:根据进程PID获取该进程的控制信息。
进程的控制信息即进程控制块PCB信息,也即是task_struct结构体管理的信息,该信息包含了进程所需的所有信息。
步骤302:修改进程的控制信息的状态,让进程暂停执行。
PCB中包含用来标记进程状态的状态位,直接修改该状态为TASK_INTERRUPTIBLE或者TASK_UNINTERRUPTIBLE即可让该进程挂起执行。
步骤303:根据进程控制信息获取该进程的内存管理单元。
PCB中保存有进程的内存管理单元信息,即mm_struct结构体管理的信息。该结构体记录了进程的整个虚地址空间信息。可以直接通过进程控制信息结构体task_struct中获取。
步骤304:解析热补丁so,获取该so的段信息,并将需要载入内存的段读入进程的虚地址空间中。
需要加载到进程虚地址空间的段,即通过命令readelf-l libpatch.so查看到的类型为LOAD的段,可以通过解析补丁so文件获取。
步骤305:在进程的内存管理单元中新增对应的段数据信息,并将步骤304中载入的段虚地址更新到段数据信息中。
步骤306:对热补丁so的函数进行重定位。
加载补丁so到进程地址空间后,还需要对该补丁so中的符号进行重定位之后,进程才能正确使用其中的函数。
步骤307:修改进程的控制信息的状态,让进程继续执行。
与步骤302对应,将进程控制信息中的状态位置为TASK_RUNNING即可。
依照步骤102,如图4所示,获取原内存段地址和补丁段地址的具体实施步骤如下。
步骤401:获取原内存段的偏移地址。
解析原内存段所在的模块文件,如果原内存段在进程对应的可执行文件中,则模块文件是指该可执行文件。若原内存段在某个共享库中,则模块文件是指该共享库。直接读取并解析该模块文件,即可获取原内存段在文件中的偏移地址。
步骤402:获取原内存段运行时的基地址。
原内存段运行时的基地址即该函数所在模块的运行时基地址。可以通过解析被打补丁进程的maps文件,获取函数所在模块的运行基地址。
步骤403:获取原内存段的运行时地址。
将步骤401中获取的偏移地址加上步骤402中获取的基地址,即可以得到原内存段的运行时地址。
步骤404:获取补丁段的运行时地址。
与获取原内存段的地址类似,可以使用步骤401-步骤403相似的步骤获取补丁段的运行时地址。
进一步的,还可以如图5所示,修改原内存段内容,进行函数缺陷修复,具体实施步骤如下。
步骤501:将原内存段地址转换为内核能直接读写的内核线性地址。
步骤502:将补丁段地址转换为内核能直接读写的内核线性地址。
步骤503:读取原内存段汇编指令备份。
步骤503:修改原内存段内容为补丁段内容。
通过本实施例提供的步骤,即可完成程序的修复过程。由此可见,实施例1中提供的程序修复方法能够在不关闭进程的情况下,简单有效的完成程序的修复,达到内核态中程序修复的效果。
实施例3:
在上述实施例1至实施例2提供的嵌入式系统内核态下程序缺陷修复的方法的基础上,本发明还提供了一种可用于实现上述方法的嵌入式系统内核态下程序缺陷修复的装置,如图6所示,是本发明实施例的装置架构示意图。本实施例的嵌入式系统内核态下程序缺陷修复的装置包括一个或多个处理器11以及存储器12。其中,图6中以一个处理器11为例。
处理器11和存储器12可以通过总线或者其他方式连接,图6中以通过总线连接为例。
存储器12作为一种嵌入式系统内核态下程序缺陷修复方法非易失性计算机可读存储介质,可用于存储非易失性软件程序、非易失性计算机可执行程序以及模块,如实施例1至实施例2中的嵌入式系统内核态下程序缺陷修复方法。处理器11通过运行存储在存储器12中的非易失性软件程序、指令以及模块,从而执行嵌入式系统内核态下程序缺陷修复的装置的各种功能应用以及数据处理,即实现实施例1至实施例2的嵌入式系统内核态下程序缺陷修复的方法。
存储器12可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实施例中,存储器12可选包括相对于处理器11远程设置的存储器,这些远程存储器可以通过网络连接至处理器11。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
程序指令/模块存储在存储器12中,当被一个或者多个处理器11执行时,执行上述实施例1至实施例2中的嵌入式系统内核态下程序缺陷修复的方法,例如,执行以上描述的图1-图5所示的各个步骤。
本领域普通技术人员可以理解实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(Read Only Memory,简写为:ROM)、随机存取存储器(Random AccessMemory,简写为:RAM)、磁盘或光盘等。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

Claims (10)

1.一种嵌入式系统内核态下程序缺陷修复的方法,其特征在于:
将进程需要使用的补丁段所在的共享库传递给内核模块,内核模块将共享库加载到相应进程的进程空间;
内核模块获取内存控制块中补丁段所对应的原内存段和补丁段的地址,将内存控制块中原内存段的地址替换为补丁段的地址。
2.根据权利要求1所述的嵌入式系统内核态下程序缺陷修复的方法,其特征在于,所述内核模块将共享库加载到相应进程的进程空间,具体包括:
获取共享库中需使用的补丁段的段信息,将补丁段读入进程对应的虚地址空间;
内核模块根据进程的进程控制信息获取对应的内存控制块,将补丁段的虚地址写入对应的内存控制块中;
根据补丁段的虚地址,对需修复的函数进行重定位。
3.根据权利要求2所述的嵌入式系统内核态下程序缺陷修复的方法,其特征在于,所述将补丁段的虚地址写入对应的内存控制块中,具体包括:
在进程的内存控制块中增加补丁段的段信息,将补丁段的虚地址写入内存控制块内对应的段信息中。
4.根据权利要求2所述的嵌入式系统内核态下程序缺陷修复的方法,其特征在于,还包括:
所述获取共享库中需使用的补丁段的段信息之前,进程暂停执行;
所述对需修复的函数进行重定位之后,进程继续执行。
5.根据权利要求1所述的嵌入式系统内核态下程序缺陷修复的方法,其特征在于,所述内核模块获取内存控制块中补丁段所对应的原内存段和补丁段的地址,具体包括:
获取原内存段和补丁段的虚拟地址,将原内存段和补丁段的虚拟地址转换为内核线性地址。
6.根据权利要求5所述的嵌入式系统内核态下程序缺陷修复的方法,其特征在于,所述获取原内存段和补丁段的虚拟地址,具体包括:
解析原内存段和补丁段所在文件,分别获取原内存段和补丁段在文件中的偏移地址;
解析进程的maps文件,分别获取原内存段和补丁段所在模块的运行基地址;
以原内存段所在模块的运行基地址为起点根据原内存段的偏移地址进行偏移获取原内存段运行时的虚拟地址,以补丁段所在模块的运行基地址为起点根据补丁段的偏移地址进行偏移获取补丁段运行时的虚拟地址。
7.权利要求5所述的嵌入式系统内核态下程序缺陷修复的方法,其特征在于,所述将原内存段和补丁段的虚拟地址转换为内核线性地址,具体包括:
通过进程的进程控制信息和内存控制块中补丁段的地址,获取进程对应的内核虚拟页表;
根据内存控制块中补丁段的地址和内核虚拟页表的信息,获取补丁段的物理地址;
将补丁段的物理地址转换为内核线性地址。
8.根据权利要求1所述的嵌入式系统内核态下程序缺陷修复的方法,其特征在于,还包括:
根据原内存段的内核线性地址读取原内存段的汇编指令备份;
将原内存段的汇编指令替换为补丁段的汇编指令。
9.根据权利要求1所述的嵌入式系统内核态下程序缺陷修复的方法,其特征在于,还包括:
内核模块获取进程的进程ID,根据进程ID获取进程的进程控制块和内存管理单元。
10.一种嵌入式系统内核态下程序缺陷修复的装置,其特征在于:
包括至少一个处理器和存储器,所述至少一个处理器和存储器之间通过数据总线连接,所述存储器存储能被所述至少一个处理器执行的指令,所述指令在被所述处理器执行后,用于完成权利要求1-9中任一项所述的嵌入式系统内核态下程序缺陷修复的方法。
CN202210142015.6A 2022-02-16 2022-02-16 一种嵌入式系统内核态下程序缺陷修复的方法和装置 Pending CN114528141A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202210142015.6A CN114528141A (zh) 2022-02-16 2022-02-16 一种嵌入式系统内核态下程序缺陷修复的方法和装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210142015.6A CN114528141A (zh) 2022-02-16 2022-02-16 一种嵌入式系统内核态下程序缺陷修复的方法和装置

Publications (1)

Publication Number Publication Date
CN114528141A true CN114528141A (zh) 2022-05-24

Family

ID=81622681

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210142015.6A Pending CN114528141A (zh) 2022-02-16 2022-02-16 一种嵌入式系统内核态下程序缺陷修复的方法和装置

Country Status (1)

Country Link
CN (1) CN114528141A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117573417A (zh) * 2024-01-15 2024-02-20 麒麟软件有限公司 一种基于异位字段替换的kabi修复方法

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117573417A (zh) * 2024-01-15 2024-02-20 麒麟软件有限公司 一种基于异位字段替换的kabi修复方法
CN117573417B (zh) * 2024-01-15 2024-04-09 麒麟软件有限公司 一种基于异位字段替换的kabi修复方法

Similar Documents

Publication Publication Date Title
CN103227812B (zh) 智能设备中支持断点续传的下载方法和装置
CN111124550B (zh) 一种程序动态加载方法、装置及存储介质
WO2018157588A1 (zh) 固件烧录方法、系统、计算机设备和存储介质
KR102136906B1 (ko) Bpram을 이용한 운영체제의 레이아웃 및 실행
US20130125096A1 (en) Systems and Methods for Dynamic Collection of Probe Call Sites
JP2010500682A (ja) フラッシュメモリアクセス回路
CN102662714A (zh) 一种Linux操作系统及其启动方法
CN114528141A (zh) 一种嵌入式系统内核态下程序缺陷修复的方法和装置
US20200327052A1 (en) Compiling application with multiple function implementations for garbage collection
JP2007206933A (ja) 情報処理装置、情報処理装置におけるブートローダ生成方法およびプログラム転送方法
KR101950485B1 (ko) 안드로이드의 실시간 태스크 관리 방법
US20080052682A1 (en) Debug device and debug processing method
JPH0192856A (ja) アクセス及び欠陥論理信号を用いて主メモリユニットを保護する装置及び方法
CN108958795B (zh) 一种嵌入式系统中BootLoader代码重利用方法和开发板
CN109947407B (zh) 一种数据获取方法及装置
CN112486580A (zh) 一种实现VxWorks操作系统快速启动的方法及装置
CN115408064A (zh) 支持内核在线更新的方法、服务器和相关设备
CN112905474A (zh) 一种基于硬件的高级程序动态控制流追踪方法和装置
CN114765051A (zh) 内存测试方法及装置、可读存储介质、电子设备
CN104978227A (zh) 一种进程控制方法、装置,及系统
JP4701611B2 (ja) 動的変換方式のエミュレータ向けメモリ管理方法
JP2008140124A (ja) データ処理装置
CN113157432B (zh) 一种基于RISC处理器的firmware替换方法
CN117234953B (zh) 一种基于影子代码缓存的内核调试方法
JP5710547B2 (ja) 情報処理装置、監視方法および監視プログラム

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