System.ArgumentOutOfRangeException: 索引和长度必须引用该字符串内的位置。 参数名: length 在 System.String.Substring(Int32 startIndex, Int32 length) 在 zhuanliShow.Bind() 一种热补丁方法以及相关设备技术_技高网

一种热补丁方法以及相关设备技术

技术编号:40609943 阅读:2 留言:0更新日期:2024-03-12 22:17
本申请实施例公开了一种热补丁方法和可编程设备,用于为协程异步函数实现热补丁。在本申请中,获取第一代码对应的第一poll函数及其对应的第一结构体的入参信息,以及,第二代码对应的第二poll函数及其对应的第二结构体的内存分布信息。接着,通过在第一poll函数的第一行汇编指令之前插入跳转指令,跳转指令用于指示跳转到中转函数,并基于第二结构体的内存布局信息为第二结构体分配内存,以及,基于第一结构体的入参信息为第二结构体定义入参,最后通过中转函数用于调用第二poll函数,则可以跳过第一结构体,且使得第二结构体具有与第一结构体相同的入参信息,且第二poll函数就可以与第二结构体相匹配,避免了不可预期的错误。

【技术实现步骤摘要】

本申请涉及计算机,尤其涉及一种热补丁方法以及相关设备


技术介绍

1、rust语言是一门新兴的编程语言,致力于解决高并发和高安全性的系统问题。rust语言通过future函数提供了协程异步能力,使得程序可以完成异步的运行和切换。随着rust语言的应用愈加广泛,对于基于rust语言的程序也需要热补丁进行修复。热补丁机制是一种可以在可编程设备不中断运行的情况下对程序打补丁,不影响程序的正常运行且完成动态升级,是一种快速且低成本的代码修复方式。

2、示例性的,如图1-1所示,左图为future函数的正常执行流程,其中,func_a函数中调用func_b函数后结束。右图则为future函数的热补丁执行流程,当func_b函数需要修改时,程序员首先将新的func_b加载进内存,在旧的func_b的第一条汇编指令之前插入跳转指令(jump instruction),跳转指令指向新的func_b函数,在进行热补丁后会直接执行新的func_b函数,而跳过旧的func_b函数,实现了从旧的func_b函数到新的func_b函数的替换。

3、在rust语言中,对于每一个future函数(如图1-2所示,带有async关键字的函数即为future函数)包括多个任务(mission 1~4().await),编译器会生成一个结构体generator。如图1-3所示,future函数会生成一个generator和函数poll(&self),poll(&self)表示方法,用于调用generator执行future函数中的各个任务。

4、假设存在future_old和future_new两个future函数,现在需要用热补丁机制用future_new来替换future_old。那么,程序员可以修改poll_old的汇编指令,使之直接跳转至poll_new。但是在poll_new执行过程中,它使用的依然是generator_old,不同的generator内存布局完全不同,例如,generator_old需要50字节,但是generator_new需要100字节,可能会引起不可预期的错误。

5、综上所述,由于rust语言的特殊的机制,现有的热补丁无法直接应用于rust的future函数。


技术实现思路

1、本申请实施例提供了一种热补丁方法和可编程设备,用于为协程异步函数实现热补丁。

2、本申请第一方面提供了一种热补丁方法,用于协程异步函数。在本申请中,通过获取第一代码和第二代码,并获取第一代码对应的第一poll函数及其对应的第一结构体的入参信息,以及,第二代码对应的第二poll函数及其对应的第二结构体的内存分布信息,其中,第一代码为对协程异步函数进行热补丁之前需要执行的代码,第二代码为对协程异步函数进行热补丁之后需要执行的代码。接着,通过在第一poll函数的第一行汇编指令之前插入跳转指令,跳转指令用于指示跳转到中转函数,并基于第二结构体的内存布局信息为第二结构体分配内存,以及,基于第一结构体的入参信息为第二结构体定义入参,最后通过中转函数用于调用第二poll函数,则可以跳过第一结构体,且使得第二结构体具有与第一结构体相同的入参信息,且第二poll函数就可以与第二结构体相匹配,避免了不可预期的错误。

3、在一些可能的实现方式中,所述基于所述第二结构体的内存布局信息为所述第二结构体分配内存,以及,基于所述第一结构体的入参信息为所述第二结构体定义入参之前,还包括:若所述第一结构体的状态为基准状态,则执行所述基于所述第二内存布局信息为所述第二结构体分配内存,以及,基于所述第一入参信息为所述第二结构体定义入参的步骤;若所述第一结构体的状态为非基准状态,则执行第三poll函数,所述第三poll函数为所述第一poll函数未插入所述跳转指令之前的poll函数的副本。使得若原来执行第三poll函数,在进行热补丁后还可以继续执行,这会导致不可预料的错误。

4、在一些可能的实现方式中,基于所述第一结构体的入参信息和所述第二结构体的内存分布信息生成热补丁;所述在所述中转函数中调用所述第二poll函数之前,基于所述第二结构体的内存布局信息为所述第二结构体分配内存,以及,基于所述第一结构体的入参信息为所述第二结构体定义入参之前,还包括:从所述热补丁中读取所述第二结构体的内存布局信息和所述第一结构体的入参信息。实现了热补丁的存储和读取。

5、在一些可能的实现方式中,所述协程异步函数为基于rust语言的future函数。

6、在一些可能的实现方式中,对所述第一代码进行编译,得到第一可执行与可链接格式elf文件,以及,对所述第二代码进行编译,得到第二elf文件;通过调用编译选项rustflags=[“-g”]获取所述第一elf文件中名为.debug_info的项,得到所述第一结构体的入参信息,以及,获取所述第二elf文件中名为.debug_info的项,得到所述第二结构体的内存分布信息。从而可以得到所述第二结构体的内存分布信息。

7、在一些可能的实现方式中,基于编译命令的方式调用所述编译选项rustflags=[“-g”],或,基于配置文件的方式调用所述编译选项rustflags=[“-g”]。从而可以得到所述第二结构体的内存分布信息。

8、在一些可能的实现方式中,所述所述第一结构体的入参信息包括实参arg,所述第二结构体的内存布局信息包括所述第二结构体占用的总字节数。从而可以得到所述第二结构体的内存分布信息。

9、在一些可能的实现方式中,所述基于所述第二结构体的内存布局信息为所述第二结构体分配内存,以及,基于所述第一结构体的入参信息为所述第二结构体定义入参之后,可以执行所述协程异步函数,可以跳过第一结构体,且使得第二结构体具有与第一结构体相同的入参信息,且第二poll函数就可以与第二结构体相匹配,避免了不可预期的错误。

10、第二方面,本申请提供一种可编程设备,用于执行前述第一方面中任一项所述的方法。

11、第三方面,本申请提供了一种计算机可读存储介质,所述计算机可读存储介质中存储有指令,当其在计算机上运行时,使得计算机执行上述第一方面中任一项所述的方法。

12、本申请第四方面提供一种计算机程序产品,该计算机程序产品包括计算机执行指令,该计算机执行指令存储在计算机可读存储介质中;设备的至少一个处理器可以从计算机可读存储介质读取该计算机执行指令,至少一个处理器执行该计算机执行指令使得设备实施上述第一方面或者第一方面的任一种可能的实现方式所提供的方法。

13、本申请第五方面提供一种通信装置,该通信装置可以包括至少一个处理器、存储器和通信接口。至少一个处理器与存储器和通信接口耦合。存储器用于存储指令,至少一个处理器用于执行该指令,通信接口用于在至少一个处理器的控制下与其他通信装置进行通信。该指令在被至少一个处理器执行时,使至少一个处理器执行第一方面或第一方面的任意可能的实本文档来自技高网...

【技术保护点】

1.一种热补丁方法,其特征在于,用于协程异步函数,所述方法包括:

2.根据权利要求1所述方法,其特征在于,所述基于所述第二结构体的内存布局信息为所述第二结构体分配内存,以及,基于所述第一结构体的入参信息为所述第二结构体定义入参之前,还包括:

3.根据权利要求1或2所述方法,其特征在于,所述方法还包括:

4.根据权利要求1-3中任一项所述方法,其特征在于,所述协程异步函数为基于rust语言的future函数。

5.根据权利要求4所述方法,其特征在于,所述获取所述第一代码对应的第一poll函数及其对应的第一结构体的入参信息,以及,所述第二代码对应的第二poll函数及其对应的第二结构体的内存分布信息,包括:

6.根据权利要求5所述方法,其特征在于,所述方法还包括:

7.根据权利要求1-6中任一项所述方法,其特征在于,所述所述第一结构体的入参信息包括实参arg,所述第二结构体的内存布局信息包括所述第二结构体占用的总字节数。

8.根据权利要求1-7中任一项所述方法,其特征在于,所述基于所述第二结构体的内存布局信息为所述第二结构体分配内存,以及,基于所述第一结构体的入参信息为所述第二结构体定义入参之后,还包括:

9.一种可编程设备,其特征在于,用于协程异步函数,包括:

10.根据权利要求9所述可编程设备,其特征在于,

11.根据权利要求9或10所述可编程设备,其特征在于,还包括:

12.根据权利要求9-11中任一项所述可编程设备,其特征在于,所述协程异步函数为基于rust语言的future函数。

13.根据权利要求12所述可编程设备,其特征在于,所述处理模块,还用于:

14.根据权利要求13所述可编程设备,其特征在于,所述处理模块,具体用于:

15.根据权利要求9-14中任一项所述可编程设备,其特征在于,所述所述第一结构体的入参信息包括实参arg,所述第二结构体的内存布局信息包括所述第二结构体占用的总字节数。

16.根据权利要求9-15中任一项所述可编程设备,其特征在于,所述处理模块,具体用于:

17.一种计算机可读存储介质,其特征在于,该计算机可读存储介质存储有程序,所述程序使得计算机设备执行如权利要求1-8中任一项所述的方法。

18.一种计算机程序产品,其特征在于,所述计算机程序产品包括计算机执行指令,所述计算机执行指令存储在计算机可读存储介质中;设备的至少一个处理器从所述计算机可读存储介质中读取所述计算机执行指令,所述至少一个处理器执行所述计算机执行指令使得所述设备执行如权利要求1-8中任一项所述的方法。

19.一种通信装置,其特征在于,所述通信装置包括至少一个处理器、存储器和通信接口;

20.一种芯片系统,其特征在于,所述芯片系统包括处理器和存储器,所述存储器和所述处理器通过线路互联,所述存储器中存储有指令,所述处理器用于执行如权利要求1-8中任一项所述的方法。

...

【技术特征摘要】

1.一种热补丁方法,其特征在于,用于协程异步函数,所述方法包括:

2.根据权利要求1所述方法,其特征在于,所述基于所述第二结构体的内存布局信息为所述第二结构体分配内存,以及,基于所述第一结构体的入参信息为所述第二结构体定义入参之前,还包括:

3.根据权利要求1或2所述方法,其特征在于,所述方法还包括:

4.根据权利要求1-3中任一项所述方法,其特征在于,所述协程异步函数为基于rust语言的future函数。

5.根据权利要求4所述方法,其特征在于,所述获取所述第一代码对应的第一poll函数及其对应的第一结构体的入参信息,以及,所述第二代码对应的第二poll函数及其对应的第二结构体的内存分布信息,包括:

6.根据权利要求5所述方法,其特征在于,所述方法还包括:

7.根据权利要求1-6中任一项所述方法,其特征在于,所述所述第一结构体的入参信息包括实参arg,所述第二结构体的内存布局信息包括所述第二结构体占用的总字节数。

8.根据权利要求1-7中任一项所述方法,其特征在于,所述基于所述第二结构体的内存布局信息为所述第二结构体分配内存,以及,基于所述第一结构体的入参信息为所述第二结构体定义入参之后,还包括:

9.一种可编程设备,其特征在于,用于协程异步函数,包括:

10.根据权利要求9所述可编程设备,其特征在于,

11.根据权利要求9或10所述可编程设备,其特征在于,还包括:

...

【专利技术属性】
技术研发人员:楼智豪周紫鹏薛磊
申请(专利权)人:北京华为数字技术有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1