函数调用方法及装置与流程

文档序号:29971710发布日期:2022-05-11 11:35阅读:157来源:国知局
函数调用方法及装置与流程

1.本说明书实施例涉及计算机技术领域,特别涉及一种函数调用方法。


背景技术:

2.随着计算机技术的不断发展,许多操作系统中的模块之间能够通过调用函数来执行相应的功能,而在现有技术中,被调用模块能够通过将函数进行显示导出的方式,以便调用模块能够对该导出函数进行调用,但是该方式在调用模块对被调用模块进行显示导出的函数进行调用时,操作系统会建立调用模块和被调用模块之间的强耦合,从而导致被调用模块由于导出函数被依赖造成无法进行热升级等更新操作。


技术实现要素:

3.有鉴于此,本说明书实施例提供了一种函数调用方法。本说明书一个或者多个实施例同时涉及一种函数调用装置,一种计算设备,一种计算机可读存储介质,一种计算机程序,以解决现有技术中存在的技术缺陷。
4.根据本说明书实施例的第一方面,提供了一种函数调用方法,应用于函数调用模块,包括:
5.确定待调用函数对应的函数地址,其中,所述函数地址为基于所述待调用函数的属性信息从函数提供模块查询获得的地址;
6.基于所述函数地址确定所述函数提供模块中所述待调用函数的当前状态信息;
7.在所述当前状态信息满足预设调用条件的情况下,调用所述待调用函数。
8.根据本说明书实施例的第二方面,提供了一种函数调用装置,应用于函数调用模块,包括:
9.第一确定模块,被配置为确定待调用函数对应的函数地址,其中,所述函数地址为基于所述待调用函数的属性信息从函数提供模块查询获得的地址;
10.第二确定模块,被配置为基于所述函数地址确定所述函数提供模块中所述待调用函数的当前状态信息;
11.调用模块,被配置为在所述当前状态信息满足预设调用条件的情况下,调用所述待调用函数。
12.根据本说明书实施例的第三方面,提供了一种计算设备,包括:
13.存储器和处理器;
14.所述存储器用于存储计算机可执行指令,所述处理器用于执行所述计算机可执行指令,该计算机可执行指令被处理器执行时实现所述函数调用方法的步骤。
15.根据本说明书实施例的第四方面,提供了一种计算机可读存储介质,其存储有计算机可执行指令,该计算机可执行指令被处理器执行时实现所述函数调用方法的步骤。
16.根据本说明书实施例的第五方面,提供了一种计算机程序,其中,当所述计算机程序在计算机中执行时,令计算机执行所述函数调用方法的步骤。
17.本说明书提供的函数调用方法,应用于函数调用模块,包括确定待调用函数对应的函数地址,其中,所述函数地址为基于所述待调用函数的属性信息从函数提供模块查询获得的地址;基于所述函数地址确定所述函数提供模块中所述待调用函数的当前状态信息;在所述当前状态信息满足预设调用条件的情况下,调用所述待调用函数。
18.具体地,该方法中,函数调用模块主动通过待调用函数的属性信息,从函数提供模块查询获得的函数地址,并基于该函数地址调用该待调用函数。从而避免了函数调用模块与函数提供模块之间由于调用导出函数所导致的强耦合关系,进一步避免了函数提供模块由于导出函数被依赖导致的无法进行热升级等更新操作的问题。
附图说明
19.图1是本说明书一个实施例提供的一种函数调用方法的场景图;
20.图2是本说明书一个实施例提供的一种函数调用方法的流程图;
21.图3是本说明书一个实施例提供的一种函数调用方法的处理过程流程图;
22.图4是本说明书一个实施例提供的一种函数调用装置的结构示意图;
23.图5是本说明书一个实施例提供的一种计算设备的结构框图。
具体实施方式
24.在下面的描述中阐述了很多具体细节以便于充分理解本说明书。但是本说明书能够以很多不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本说明书内涵的情况下做类似推广,因此本说明书不受下面公开的具体实施的限制。
25.在本说明书一个或多个实施例中使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本说明书一个或多个实施例。在本说明书一个或多个实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本说明书一个或多个实施例中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
26.应当理解,尽管在本说明书一个或多个实施例中可能采用术语第一、第二等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本说明书一个或多个实施例范围的情况下,第一也可以被称为第二,类似地,第二也可以被称为第一。取决于语境,如在此所使用的词语“如果”可以被解释成为“在
……
时”或“当
……
时”或“响应于确定”。
27.随着计算机技术的不断发展,许多操作系统(例如linux操作系统)的模块之间能够进行函数调用,例如,在本说明书提供的一种模块间调用方法中,linux操作系统中的一个被调用模块需要导出符号(即显示导出函数),以便于调用模块使用。同时,调用模块在调用该被显示导出的方式所导出的函数的情况下,也即是调用模块加载的过程中,如果是一个模块调用另一个模块的导出符号,在加载模块时,操作系统会建立他们之间的依赖关系,并记录到模块依赖链表中。并且,会使得被调用模块的引用计数增加,导致引用计数变成非0,当被调用模块的引用计数为非0的情况下,被调用模块就无法被卸载。因此,虽然这种模块间调用方法使得模块间的调用更加安全,但是也会带来强耦合,导致模块间存在依赖关系,从而造成被调用模块无法进行热升级等更新操作。并且,模块调用导出符号的情况下,
模块之间的依赖关系一直存在,除非依赖模块被卸载掉。
28.同时,在实际应用中,linux操作系统中的每个模块,都会在内核有一个对应的结构体表示模块信息,这个结构体就是内核模块结构体,即模块对应的结构体元数据。而linux操作系统中一个模块内的函数地址,都会记录到它的内核模块结构体(struct module)的符号表(也即是函数地址表)中。这些函数可以进行显示导出也可以不进行显示导出,也即是,模块中的函数不一定都会被显示的导出给其他模块使用。而如果模块中的函数没有被显示导出,其他模块是无法直接调用该函数。
29.基于此,图1是本说明书一个实施例提供的一种函数调用方法的场景图,参见图1,在本说明书提供的函数调用方法中,函数调用模块102能够确定待调用函数对应的函数地址,其中,该函数地址是函数调用模块102基于待调用函数的属性信息从函数提供模块104查询获得的地址。并基于该函数地址确定出函数提供模块104中待调用函数的当前状态信息;并在当前状态信息满足预设调用条件的情况下,调用该待调用函数。
30.也即是说,本说明书提供的函数调用方法中的函数调用模块102能够根据基于待调用函数的属性信息查询到该待调用函数的函数地址。通过该函数地址调用对应函数。由于该函数不是显示导出的,两个模块之间并没有对应的依赖关系,也即是强耦合关系,从而避免了函数提供模块由于导出函数被调用导致的无法进行热升级等更新操作的问题。
31.具体地,在本说明书中,提供了一种函数调用方法,本说明书同时涉及一种函数调用装置,一种计算设备,一种计算机可读存储介质以及一种计算机程序,在下面的实施例中逐一进行详细说明。
32.图2示出了根据本说明书一个实施例提供的一种函数调用方法的流程图,该函数调用方法应用于函数调用模块,具体包括以下步骤。
33.步骤202:确定待调用函数对应的函数地址,其中,所述函数地址为基于所述待调用函数的属性信息从函数提供模块查询获得的地址。
34.在实际应用中,该函数调用模块以及该函数提供模块可以分别为操作系统中的模块,例如,该函数调用模块可以为linux操作系统需要调用函数的模块,该函数提供模块可以为linux操作系统提供被调用函数(即待调用函数)的模块。
35.其中,该待调用函数可以理解为函数调用模块需要调用的函数,在实际应用中,该待调用函数为函数提供模块所提供的函数;该待调用函数能够实现相应的功能,例如,数值计算函数、数据搜索函数等,对应的,该待调用函数的属性信息可以根据实际应用场景进行设置,例如,该待调用函数的属性信息可以为待调用函数的函数标识,该函数标识包括但不限于待调用函数的名称、编号、id等。
36.下面以函数调用方法在linux操作系统的模块间函数调用场景下为例,对确定待调用函数对应的函数地址做进一步说明,其中,待调用函数为函数x,该函数调用模块为linux操作系统中需要调用函数x的模块a,该函数提供模块为linux操作系统中包含函数x的模块b。该待调用函数的属性信息为函数x的函数名称。基于此,linux操作系统中的模块a能够确定该函数x对应的函数地址,其中,该函数地址是linux操作系统中的模块a基于该函数x的函数名称,从linux操作系统中模块b中查询获得该函数x的地址。
37.在本说明书提供的一实施例中,该函数调用模块能够基于linux操作系统的内核提供的函数kallsyms_lookup_name,根据函数名查询到函数的地址。通过该查询到的函数
地址可以调用对应函数功能。并且由于不是显示导出的,两个模块之间并没有对应的依赖关系,从而避免了后续函数提供模块由于导出函数被调用,导致的无法进行热升级等更新操作的问题,具体实现方式如下。
38.所述确定待调用函数对应的函数地址之前,还包括:
39.从信息存储对象中确定待调用函数;
40.基于待调用函数的属性信息,通过地址查询函数从函数提供模块查询所述待调用函数对应的函数地址;
41.将所述待调用函数对应的函数地址存储至所述信息存储对象。
42.其中,该信息存储对象可以理解为存储有该待调用函数的属性信息的对象,例如,该信息存储对象可以理解为存储有函数名的表、日志文件、缓存器等;在实际应用中,该信息存储对象可以设置在函数调用模块中。
43.该地址查询函数可以理解为能够实现基于待查询函数的属性信息查询到函数地址的功能的函数。例如,该地址查询函数可以理解为linux操作系统的内核所提供的函数kallsyms_lookup_name(一种函数)。
44.具体地,该函数调用模块能够从信息存储对象中确定出需要进行调用的待调用函数,并基于该待调用函数的属性信息,通过地址查询函数从函数提供模块中查询获得该待调用函数对应的函数地址,并将该函数地址存储在信息存储对象中。
45.沿用上例,其中,信息存储对象可以理解为函数地址表,该函数地址表中能够存储函数名称以及对应的函数地址。基于此,该模块a在调用函数之前,需要从该函数地址表中确定出需要调用的函数,并基于该函数对应的函数名称,通过linux操作系统的内核所提供的函数kallsyms_lookup_name,从linux操作系统中除了模块a之外的其他函数中,查找表中各个后续需要被调用的被调用函数的函数地址,并将查找到的函数地址记录到函数地址表中,其中,该函数地址表中的函数名称和函数地址之间具有对应关系。
46.本说明书实施例中,基于从信息存储对象中确定待调用函数的属性信息,通过地址查询函数从函数提供模块查询待调用函数对应的函数地址,并将该函数地址存储至信息存储对象。从而避免了后续函数提供模块由于导出函数被调用,导致的无法进行热升级等更新操作的问题。
47.在本说明书提供的一实施例中,由于模块之间没有依赖关系,因此当函数调用模块在调用函数加载的过程中,还需要注册一个模块通知链回调;以便当发生被调用模块(函数提供模块)进行更新操作时,及时更新该函数地址表中对应的函数地址,具体实现方式如下。
48.所述的函数调用方法,还包括:
49.确定所述待调用函数对应的函数提供模块,以及所述函数提供模块的属性信息;
50.基于所述函数提供模块的属性信息生成模块状态通知请求,并将所述模块状态通知请求发送的模块状态监测单元;
51.在接收到所述模块状态监测单元发送的模块状态变更通知的情况下,基于所述模块状态变更通知更新所述待调用函数对应的函数地址;
52.其中,所述模块状态变更通知为所述模块状态监测服务基于所述模块状态通知请求,在所述函数提供模块的模块状态发生变更的情况下生成的通知。该函数提供模块的属
性信息可以根据实际应用场景进行设置,例如,该函数提供模块的属性信息可以为函数提供模块的函数标识,该函数标识包括但不限于函数提供模块的名称、编号、id等。对应的,该模块状态通知请求可以理解为函数调用模块注册该模块通知链回调的请求;该模块状态监测单元可以理解为能够对被调用模块的当前状态进行检测、且实现模块通知链回调的单元,例如,模块通知链机制。对应的,模块状态发生变更的情况可以理解为对函数提供模块进行更新、移除、替换等操作的情况。
53.具体地,函数调用模块能够确定出待调用函数对应的函数提供模块,以及该函数提供模块的属性信息,函数调用模块基于该函数提供模块的属性信息生成一个模块状态通知请求,并将该模块状态通知请求发送的模块状态监测单元;当函数调用模块接收模块状态监测单元发送的模块状态变更通知的情况下,能够基于该模块状态变更通知更新所述待调用函数对应的函数地址;其中,该模块状态变更通知是模块状态监测单元基于所述模块状态通知请求,在函数提供模块的模块状态发生变更的情况下生成的通知。
54.沿用上例,该模块状态监测单元为模块通知链机制,基于此,模块a能够确定出该函数x所对应的模块b,并确定该模块b的模块标识;之后该模块a能够基于该模块b的模块标识,生成注册一个模块通知链回调的请求(即模块状态通知请求),并将该请求发送的模块通知链机制。在模块a完成注册之后,当模块b由于更新、移除等操作出现状态变更的情况下,该模块通知链机制能够基于生成一个通知(即模块状态变更通知),并将该通知发送至模块a,从而告知模块a该模块b的状态发生的变更,而该模块a能够基于该通知及时更新函数地址表中、与该模块b对应的函数地址,提高模块a的执行效率,节省了计算资源。
55.本说明书提供的一实施例中,所述确定待调用函数对应的函数地址,包括:
56.在接收到针对待调用函数的函数调用指令、且存在所述待调用函数对应的函数地址的情况下,从信息存储对象中查询所述待调用函数对应的函数地址。
57.其中,该函数调用指令可以理解为指示函数调用模块对该待调用函数进行调用的指示。例如,该函数调用指令可以理解为用户指示函数调用模块执行特定任务的指令,而该函数调用模块在执行特定任务的过程中需要调用特定的函数,用于完成该特定任务。
58.具体地,该函数调用模块在接收到针对该待调用函数的函数调用指令的情况下,从该信息存储对象中确定该待调用函数对应的函数地址,在该待调用函数对应的函数地址存在的情况下,该函数调用模块从该信息存储对象中查询该待调用函数对应的函数地址。
59.沿用上例,模块a在接收到针对该函数x的函数调用指令的情况下,基于该指令从该函数地址表中确定该函数x对应的函数地址是否存在,在该函数x对应的函数地址存在的情况下,该模块a能够从该函数地址表中查询获取到该函数x对应的函数地址。
60.进一步地,在模块a确定该函数地址表中不存在函数x对应的函数地址的情况下,该函数调用模块则会出错退出,并将函数调用失败的情况告知函数管理对象,具体实现方式如下。
61.所述函数调用方法,还包括:
62.在接收到针对待调用函数的函数调用指令、且不存在所述待调用函数对应的函数地址的情况下,基于所述待调用函数的属性信息生成函数调用失败通知;
63.将所述函数调用失败通知发送至函数管理对象。
64.其中,函数管理对象可以理解为能够对linux操作系统中的模块,以及模块中的函
数进行管理的对象,例如,智能机器人、程序、智能设备、神经模块模型等。
65.沿用上例,该模块a在接收到针对该函数x的函数调用指令的情况下,基于该指令从该函数地址表中确定该函数x对应的函数地址是否存在,在该函数x对应的函数地址不存在的情况下,该模块a则出错退出,并基于该函数x的函数名称生成函数调用失败通知,并将该将函数调用失败通知发送至函数管理对象。
66.本说明书实施例中,该调用对应功能函数前,先判断其该函数对应的函数地址是否存在,若是,则继续执行调用该待调用函数的操作;否则,出错退出,并通知该函数管理对象进行处理,从而进一步保证了模块的运行稳定性。
67.步骤204:基于所述函数地址确定所述函数提供模块中所述待调用函数的当前状态信息。
68.其中,该当前状态信息可以理解为表征该待调用函数当前是否存在的信息。
69.具体的,该函数调用模块在确定该待调用函数对应的函数地址之后,能够基于该函数地址确定出该函数提供模块中的该待调用函数的当前状态信息。
70.在本说明书提供的一实施例中,考虑到模块间没有显示的依赖关系,函数调用模块在基于函数地址调用对应的函数功能时,可能出现被调用函数被移除;为了保证安全调用,函数调用模块需要基于之前获得的函数地址,反查对应的被调用模块结构体,在该被调用模块结构体存在的情况下,基于该函数地址确定该被调用模块(函数提供模块)中待调用函数的当前状态信息,从而保证了函数的安全调用。具体实现方式如下。
71.所述基于所述函数地址确定所述函数提供模块中所述待调用函数的当前状态信息,包括:
72.基于所述函数地址确定所述待调用函数对应的函数提供模块的当前状态信息;
73.在基于所述当前状态信息确定存在所述函数提供模块的情况下,基于所述函数地址确定所述函数提供模块中所述待调用函数的当前状态信息。
74.其中,该函数提供模块的当前状态信息可以理解为,表征该函数提供模块当前是否存在的信息。
75.具体地,该函数调用模块在基于函数地址确定待调用函数的当前状态信息的过程中,首先需要基于该函数地址确定待调用函数对应的函数提供模块的当前状态信息,在基于该当前状态信息确定该函数提供模块当前存在的情况下,函数调用模块基于该函数地址确定函数提供模块中待调用函数的当前状态信息。在实际应用中,linux操作系统中的每个模块在其模块结构体中都有其代码段的范围,函数调用模块通过该被调用函数的函数地址,可以确定这个函数属于哪个模块的,而linux操作系统也提供支撑这种查询的接口。
76.在本说明书提供的一实施例中,为了保证安全调用,函数调用模块需要基于之前获得的函数地址,反查对应的被调用模块结构体,但是如果没有找到该被调用模块结构体的情况下,也即是在该被调用模块结构体不存在的情况下,则说明被调用模块被移除或更新,则重新根据函数名,对函数地址表中该被调用模块对应的函数地址进行更新;具体实现方式包括:
77.所述函数调用方法,还包括:
78.在基于所述当前状态信息确定不存在所述函数提供模块的情况下,对所述待调用函数对应的函数地址进行更新。
79.具体地,函数调用模块在基于当前状态信息确定不存在函数提供模块的情况下,则需要对待调用函数对应的函数地址进行更新;在实际应用中,该函数调用模块在确定函数提供模块不存在、或者该函数提供模块结构体不存在的情况下,该函数调用模块能够基于该待调用函数的属性信息,通过地址查询函数查询该待调用函数对应的更新函数地址,并基于该更新函数地址,对该待调用函数对应的函数地址进行更新,进一步保证后续基于该函数地址调用对应函数的实现,保证了函数调用模块的稳定性。具体实现方式如下。
80.所述对所述待调用函数对应的函数地址进行更新,包括:
81.确定所述待调用函数的属性信息;
82.在基于所述属性信息确定所述待调用函数存在对应的更新函数地址的情况下,基于所述待调用函数对应的更新函数地址替换所述待调用函数对应的函数地址。
83.具体的,该函数调用模块在确定该函数提供模块不存在的情况下,确定该待调用函数的属性信息,并基于该属性信息,通过地址查询函数查询确定该待调用函数存在对应的更新函数地址的情况下,获取该待调用函数对应的更新函数地址,并基于该更新函数地址替换掉该待调用函数对应的函数地址,从而完成对该函数地址的更新。
84.此外,该函数地址在确定该待调用函数不存在对应的更新函数地址的情况下,能够将函数更新失败的情况,告知该函数管理对象,具体实现方式如下。
85.所述函数调用方法,还包括:
86.在基于所述属性信息确定所述待调用函数不存在对应的更新函数地址的情况下,基于所述待调用函数的属性信息生成函数更新失败通知;
87.将所述函数更新失败通知发送至函数管理对象。
88.沿用上例,模块a没有找到该模块b的情况下,则说明模块b被移除或更新,则重新根据函数名,基于函数kallsyms_lookup_name查找该函数对应的新模块地址;在模块a没有找到该新函数地址的情况下,该模块a则出错退出,并基于该函数x的函数名称生成函数更新失败通知,并将该将函数更新失败通知发送至函数管理对象,从而基于该函数管理对象对函数调用失败的情况进行处理,保证后续函数调用模块顺利的进行函数调用。
89.步骤206:在所述当前状态信息满足预设调用条件的情况下,调用所述待调用函数。
90.其中,该预设调用条件可以根据实际应用场景进行设置,本说明书对此不做具体设置。例如,该预设调用条件可以是当前状态信息为表征待调用函数存在。在实际应用中,该在当前状态信息满足预设调用条件的情况下,调用该待调用函数,可以理解为,在基于所述当前状态信息确定存在所述待调用函数的情况下,调用所述待调用函数。
91.进一步地,该调用待调用函数可以理解为调用该函数来执行相应功能,例如数据计算功能、数据搜索功能等,在实际应用中,调用该函数来执行相应功能的过程中,函数调用模块能够获得该待调用函数返回对应的结果,例如,数据计算产生的结果、数据搜索的结果等。
92.本说明书提供的实施例中,由于函数调用模块所调用的函数并不是显示导出的,因此,直接调函数地址,不会记录到模块依赖链表中,导致两个模块之间并没有对应的依赖关系;如果在调用过程中,发生被调用模块移除的情况下,就会导致函数调用模块调用到一个非法地址,从而导致系统崩溃。但是,如果像本说明书提供的一种模块间调用方法中,强
制将模块之间加上依赖关系,又会导致被调用模块无法进行必要的升级维护。因此,函数调用模块在调用被调用模块的函数功能前,将被调用模块结构体引用计数加1,当模块的引用计数为非0的情况下,旧模块无法被移除,从而在两个模块之间建立一个临时的依赖关系,保证调用过程中不会发生被调用模块的移除;当通过被调用模块中的函数地址,调用该函数来执行相应功能,并返回对应的结果之后,函数调用模块将被调用函数的模块结构体的引用计数减1,解除显示保护(即解除临时依赖关系);这样只有在函数真正执行期间,对被调用模块有短暂依赖关系,其他时候被调用模块都可以进行正常移除或更新,保证了被依赖模块(被调用模块)的任何更新,比如新功能、bugfix(故障修复)等正常执行。需要注意的是,被调用模块的热升级的更新操作,需要用新模块替换旧模块。其中,函数调用模块在调用被调用模块的函数功能前,将被调用模块结构体引用计数加1的操作如下所示。
93.所述调用所述待调用函数,包括:
94.确定所述函数提供模块对应的初始函数调用计数,并基于预设计数规则对所述函数调用计数进行设置,获得所述函数提供模块对应的目标函数调用计数;
95.基于所述目标函数调用计数调用所述待调用函数,并获得所述待调用函数返回的函数执行结果。
96.其中,预设计数规则可以根据实际应用场景进行设置,本说明书对此不做具体设置,例如,将初始函数调用计数自增1、将初始函数调用计数自增0.1、将初始函数调用计数自增10等。下述以预设计数规则为将初始函数调用计数自增1进行说明。
97.该函数调用计数可以理解为被调用函数的引用计数,相应地,初始函数调用计数可以为没有被函数调用模块进行加1操作的引用计数;相应地,目标函数调用计数为被函数调用模块进行加1操作后的引用计数;
98.函数执行结果可以理解为该调用函数来执行相应功能的过程中,待调用函数返回的结果,例如,数据计算产生的结果、数据搜索的结果等。
99.沿用上例,模块a在调用模块b的函数功能前,确定该模块b对应的引用计数(0个),并基于预设计数规则将模块b对应的引用计数加1,从而获得模块b对应的调整后的引用计数(1个)。在将引用计数加1之后,从而保证了在调用过程中被调用模块不会移除,基于此,该模块a调用模块b提供的函数x执行对应的功能,从而获得该函数x对应的执行结果。
100.进一步地,函数调用模块将被调用函数的模块结构体的引用计数减1,解除显示保护的操作如下所示。
101.所述获得所述待调用函数返回的函数执行结果之后,还包括:
102.确定所述函数提供模块对应的目标函数调用计数,并基于预设恢复规则将所述目标函数调用计数恢复为所述初始函数调用计数。
103.其中,预设恢复规则可以根据实际应用场景进行设置,本说明书对此不做具体设置,例如,在预设计数规则为将初始函数调用计数自增1的情况下,该预设恢复规则为将初始函数调用计数自减1,在预设计数规则为将初始函数调用计数自增0.1的情况下,该预设恢复规则为将初始函数调用计数自减0.1。
104.沿用上例,模块在获得该函数x对应的执行结果之后,能够基于该预设恢复规则将模块b对应的引用计数减1,从而获得模块b对应的初始引用计数(0个)。通过将被调用函数的模块结构体的引用计数减1,从而解除显示保护;实现了在函数真正执行期间,调用模块
与被调用模块之间有短暂依赖关系,其他时候被调用模块都可以进行正常移除或更新。避免了函数调用模块与函数提供模块之间由于调用导出函数所导致的强耦合关系,进一步避免了函数提供模块由于导出函数被依赖导致的无法进行热升级等更新操作的问题。
105.本说明书提供的函数调用方法中,函数调用模块主动通过待调用函数的属性信息,从函数提供模块查询获得的函数地址,并基于该函数地址调用该待调用函数。从而避免了函数调用模块与函数提供模块之间由于调用导出函数所导致的强耦合关系,进一步避免了函数提供模块由于导出函数被依赖导致的无法进行热升级等更新操作的问题。
106.在具体实施过程中,linux操作系统的被调用模块包括单活被调用模块(同样模块,系统中只有一个)和多活被调用模块(同样模块,系统中会有多个)两种类型。其中,单活被调用模块的移除或更新过程包括步骤a1至步骤a5:
107.步骤a1:内核执行模块卸载操作;
108.步骤a2:如果卸载不成功,说明模块中函数正在被其他模块调用;间隔一段时间之后,重新尝试执行上述步骤a1;
109.步骤a2:如果卸载成功,则可以成功移除该模块;
110.步骤a3:移除操作会自动产生模块通知事件,用于通知调用模块,该调用模块在接收到该通知之后,如果确定已经不存在任何对应的被调用模块,该被调用模块相应的函数地址会清零;
111.步骤a4:如果需要更新,内核则插入更新后的新模块;
112.步骤a5:插入操作会自动产生模块通知事件,用于通知调用模块,该调用模块在接收到该通知之后,对该模块相应函数地址进行更新。
113.其中,多活被调用模块的移除或更新过程包括步骤b1至步骤b7:
114.步骤b1:内核插入一个新版本的多活模块;
115.步骤b2:插入操作会自动产生模块通知事件,用于通知调用模块,该调用模块在接收到该通知之后,对该模块相应函数地址进行更新;
116.步骤b3:如果需要的话,移除多活模块中的老版本模块;
117.步骤b4:移除操作会自动产生模块通知事件,通知调用模块中,会根据移除模块的版本进行相应处理;
118.步骤b5:如果移除的是当前最新的被调用模块,则相应函数地址会重新查找,更新为次新版本的模块中的地址;
119.步骤b6:如果移除的不是当前最新的被调用模块,且还存在任意新版本的被调用模块,则相应函数地址都不会进行更新;
120.步骤b7:如果是最后一个被移除的被调用模块,则调用模块中相应函数地址都会清零;
121.下述结合附图3,以本说明书提供的函数调用方法在linux操作系统的模块间函数调用场景的应用为例,对所述函数调用方法进行进一步说明。其中,图3示出了本说明书一个实施例提供的一种函数调用方法的处理过程流程图,具体包括以下步骤。
122.步骤302:调用模块需要将函数名称,记录到自身配置的一个函数地址表。
123.步骤304:调用模块基于函数名称查询函数地址并记录。
124.具体地,调用模块在调用函数加载的过程中,通过函数kallsyms_lookup_name,基
于函数地址表中各个被调用函数的函数名称,查找与该被调用函数对应的函数地址,并将函数地址记录到函数地址表中。
125.步骤306:调用模块在被调用函数存在对应的函数地址的情况下,执行调用函数的操作。
126.具体地,该调用模块在调用对应功能函数过程中,在从函数地址表中判断出该被调用函数存在对应的函数地址的情况下,执行调用函数的操作。
127.在实际应用中,当该调用模块在从函数地址表中,判断出该被调用函数不存在对应的函数地址的情况下,则出错退出,并告知该操作系统的运维管理对象。
128.步骤308:调用模块在确定内核中存在被调用模块结构体的情况下,执行调用函数的操作。
129.具体地,考虑到模块间没有显示的依赖关系,本说明书提供的函数调用方法中,调用模块在调用对应函数地址功能时,可能出现被调用函数被移除;为了保证安全调用,需要根据之前获得的函数地址,反查对应的被调用模块结构体;
130.在从内核中找到对应的被调用模块结构体的情况下,将模块结构体的引用计数加1,保证调用过程中不会发生被调用模块的移除。
131.在实际应用中,如果从内核中没有找到对应的被调用模块结构体,则说明被调用模块被移除或更新,调用模块则重新根据函数名,基于函数kallsyms_lookup_name查找新的模块对应的函数地址;如果能找到,则更新函数地址,并继续执行函数调用操作;否则,则出错退出,并告知该操作系统的运维管理对象。
132.步骤310:调用模块通过被调用模块中的函数地址,调用该函数来执行相应功能,并获得该函数返回的结果。
133.步骤312:调用模块将被调用函数的模块结构体的引用计数减1,解除显示保护。
134.这样,只有在函数真正执行期间,对被调用模块有短暂依赖关系,其他时候被调用模块都可以进行正常移除或更新;
135.在实际应用中,该调用模块在调用函数加载时,还需要注册一个模块通知链回调;以便发生模块更新时,及时更新对应函数地址表中的函数地址。
136.本说明书提供的函数调用方法,是一种解耦合的模块间函数调用方法,实现在被调用函数移除或更新情况下,实现对调用模块中相应函数地址进行更新,从而避免了函数调用模块与函数提供模块之间由于调用导出函数所导致的强耦合关系,进一步避免了函数提供模块由于导出函数被依赖导致的无法进行热升级等更新操作的问题。
137.与上述方法实施例相对应,本说明书还提供了函数调用装置实施例,图4示出了本说明书一个实施例提供的一种函数调用装置的结构示意图。如图4所示,该装置包括:
138.第一确定模块402,被配置为确定待调用函数对应的函数地址,其中,所述函数地址为基于所述待调用函数的属性信息从函数提供模块查询获得的地址;
139.第二确定模块404,被配置为基于所述函数地址确定所述函数提供模块中所述待调用函数的当前状态信息;
140.调用模块406,被配置为在所述当前状态信息满足预设调用条件的情况下,调用所述待调用函数。
141.可选地,所述函数调用装置还包括查询模块,被配置为:
142.从信息存储对象中确定待调用函数;
143.基于待调用函数的属性信息,通过地址查询函数从函数提供模块查询所述待调用函数对应的函数地址;
144.将所述待调用函数对应的函数地址存储至所述信息存储对象。
145.可选地,所述第一确定模块402,还被配置为:
146.在接收到针对待调用函数的函数调用指令、且存在所述待调用函数对应的函数地址的情况下,从信息存储对象中查询所述待调用函数对应的函数地址。
147.可选地,所述函数调用装置还包括第一发送模块,被配置为:
148.在接收到针对待调用函数的函数调用指令、且不存在所述待调用函数对应的函数地址的情况下,基于所述待调用函数的属性信息生成函数调用失败通知;
149.将所述函数调用失败通知发送至函数管理对象。
150.可以的,所述函数调用装置还包括监测模块,被配置为:
151.确定所述待调用函数对应的函数提供模块,以及所述函数提供模块的属性信息;
152.基于所述函数提供模块的属性信息生成模块状态通知请求,并将所述模块状态通知请求发送的模块状态监测单元;
153.在接收到所述模块状态监测单元发送的模块状态变更通知的情况下,基于所述模块状态变更通知更新所述待调用函数对应的函数地址;
154.其中,所述模块状态变更通知为所述模块状态监测单元基于所述模块状态通知请求,在所述函数提供模块的模块状态发生变更的情况下生成的通知。
155.可选地,所述第二确定模块404,还被配置为:
156.基于所述函数地址确定所述待调用函数对应的函数提供模块的当前状态信息;
157.在基于所述当前状态信息确定存在所述函数提供模块的情况下,基于所述函数地址确定所述函数提供模块中所述待调用函数的当前状态信息。
158.可以的,所述函数调用装置还包括更新模块,被配置为:
159.在基于所述当前状态信息确定不存在所述函数提供模块的情况下,对所述待调用函数对应的函数地址进行更新。
160.可选地,所述更新模块,还被配置为:
161.确定所述待调用函数的属性信息;
162.在基于所述属性信息确定所述待调用函数存在对应的更新函数地址的情况下,基于所述待调用函数对应的更新函数地址替换所述待调用函数对应的函数地址。
163.可以的,所述函数调用装置还包括第二发送模块,被配置为:
164.在基于所述属性信息确定所述待调用函数不存在对应的更新函数地址的情况下,基于所述待调用函数的属性信息生成函数更新失败通知;
165.将所述函数更新失败通知发送至函数管理对象。
166.可选地,所述调用模块404,还被配置为:
167.确定所述函数提供模块对应的初始函数调用计数,并基于预设计数规则对所述函数调用计数进行设置,获得所述函数提供模块对应的目标函数调用计数;
168.基于所述目标函数调用计数调用所述待调用函数,并获得所述待调用函数返回的函数执行结果。
169.可以的,所述函数调用装置还包括计数恢复模块,被配置为:
170.确定所述函数提供模块对应的目标函数调用计数,并基于预设恢复规则将所述目标函数调用计数恢复为所述初始函数调用计数。
171.本说明书提供的函数调用装置,基于函数调用模块主动通过待调用函数的属性信息,从函数提供模块查询获得的函数地址,并基于该函数地址调用该待调用函数。从而避免了函数调用模块与函数提供模块之间由于调用导出函数所导致的强耦合关系,进一步避免了函数提供模块由于导出函数被依赖导致的无法进行热升级等更新操作的问题。
172.上述为本实施例的一种函数调用装置的示意性方案。需要说明的是,该函数调用装置的技术方案与上述的函数调用方法的技术方案属于同一构思,函数调用装置的技术方案未详细描述的细节内容,均可以参见上述函数调用方法的技术方案的描述。
173.图5示出了根据本说明书一个实施例提供的一种计算设备500的结构框图。该计算设备500的部件包括但不限于存储器510和处理器520。处理器520与存储器510通过总线530相连接,数据库550用于保存数据。
174.计算设备500还包括接入设备540,接入设备540使得计算设备500能够经由一个或多个网络560通信。这些网络的示例包括公用交换电话网(pstn)、局域网(lan)、广域网(wan)、个域网(pan)或诸如因特网的通信网络的组合。接入设备540可以包括有线或无线的任何类型的网络接口(例如,网络接口卡(nic))中的一个或多个,诸如ieee802.11无线局域网(wlan)无线接口、全球微波互联接入(wi-max)接口、以太网接口、通用串行总线(usb)接口、蜂窝网络接口、蓝牙接口、近场通信(nfc)接口,等等。
175.在本说明书的一个实施例中,计算设备500的上述部件以及图5中未示出的其他部件也可以彼此相连接,例如通过总线。应当理解,图5所示的计算设备结构框图仅仅是出于示例的目的,而不是对本说明书范围的限制。本领域技术人员可以根据需要,增添或替换其他部件。
176.计算设备500可以是任何类型的静止或移动计算设备,包括移动计算机或移动计算设备(例如,平板计算机、个人数字助理、膝上型计算机、笔记本计算机、上网本等)、移动电话(例如,智能手机)、可佩戴的计算设备(例如,智能手表、智能眼镜等)或其他类型的移动设备,或者诸如台式计算机或pc的静止计算设备。计算设备500还可以是移动式或静止式的服务器。
177.其中,处理器520用于执行如下计算机可执行指令,该计算机可执行指令被处理器520执行时实现上述函数调用方法的步骤。
178.上述为本实施例的一种计算设备的示意性方案。需要说明的是,该计算设备的技术方案与上述的函数调用方法的技术方案属于同一构思,计算设备的技术方案未详细描述的细节内容,均可以参见上述函数调用方法的技术方案的描述。
179.本说明书一实施例还提供一种计算机可读存储介质,其存储有计算机可执行指令,该计算机可执行指令被处理器执行时实现上述函数调用方法的步骤。
180.上述为本实施例的一种计算机可读存储介质的示意性方案。需要说明的是,该存储介质的技术方案与上述的函数调用方法的技术方案属于同一构思,存储介质的技术方案未详细描述的细节内容,均可以参见上述函数调用方法的技术方案的描述。
181.本说明书一实施例还提供一种计算机程序,其中,当所述计算机程序在计算机中
执行时,令计算机执行上述函数调用方法的步骤。
182.上述为本实施例的一种计算机程序的示意性方案。需要说明的是,该计算机程序的技术方案与上述的函数调用方法的技术方案属于同一构思,计算机程序的技术方案未详细描述的细节内容,均可以参见上述函数调用方法的技术方案的描述。
183.上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
184.所述计算机指令包括计算机程序代码,所述计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。所述计算机可读介质可以包括:能够携带所述计算机程序代码的任何实体或装置、记录介质、u盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(rom,read-only memory)、随机存取存储器(ram,randomaccess memory)、电载波信号、电信信号以及软件分发介质等。需要说明的是,所述计算机可读介质包含的内容可以根据司法管辖区内立法和专利实践的要求进行适当的增减,例如在某些司法管辖区,根据立法和专利实践,计算机可读介质不包括电载波信号和电信信号。
185.需要说明的是,对于前述的各方法实施例,为了简便描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本说明书实施例并不受所描述的动作顺序的限制,因为依据本说明书实施例,某些步骤可以采用其它顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定都是本说明书实施例所必须的。
186.在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其它实施例的相关描述。
187.以上公开的本说明书优选实施例只是用于帮助阐述本说明书。可选实施例并没有详尽叙述所有的细节,也不限制该发明仅为所述的具体实施方式。显然,根据本说明书实施例的内容,可作很多的修改和变化。本说明书选取并具体描述这些实施例,是为了更好地解释本说明书实施例的原理和实际应用,从而使所属技术领域技术人员能很好地理解和利用本说明书。本说明书仅受权利要求书及其全部范围和等效物的限制。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1