构造动态组件的方法和系统转让专利

申请号 : CN200710063147.5

文献号 : CN101236491B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 吴涛

申请人 : 联芯科技有限公司大唐移动通信设备有限公司上海大唐移动通信设备有限公司

摘要 :

本发明提供一种构造动态组件的方法,预先设定内核各API与其所在地址的映射关系表,并设定应用所要调用的内核API标识到映射关系表相关记录的映射关系的胶合函数,该方法包括:设定应用调用内核中API的方式为通过胶合函数跳转到内核中的映射关系表,再通过该映射关系表跳转到内核中的API;设定应用导出可被调用的接口;将所述通过胶合函数跳转到内核中的映射关系表、再跳转到内核中的API的设定,和对导出接口方式的设定,和应用经编译、连接后生成动态组件。本发明还提供一种构造动态组件的系统。利用本发明,经过两次跳转即可实现动态组件进入内核,对API进行调用和执行,提高了动态组件进入内核的速度,有效提高了效率。

权利要求 :

1.一种构造动态组件的方法,其特征在于,预先设定内核各API与其所在地址的映射关系表,并设定胶合函数,所述胶合函数提供了API标识与映射关系表中记录API所在地址的记录信息的地址的映射关系,该方法包括:设定应用程序调用内核中API的方式为通过胶合函数跳转到内核中的映射关系表,再通过该映射关系表跳转到内核中的API;

设定应用程序导出的、且可被其他模块调用的应用接口;将所述通过胶合函数跳转到内核中的映射关系表、再跳转到内核中的API的设定、对应用接口的设定和应用程序经编译、连接后,生成动态组件。

2.如权利要求1所述的方法,其特征在于,所述设定胶合函数还包括:将每一胶合函数设定于不同的文件中的段中。

3.如权利要求1所述的方法,其特征在于,所述设定应用程序导出的、且可被其他模块调用的应用接口由以下方式实现:设定应用程序通过弱函数导出的、且可被其他模块调用的应用接口。

4.如权利要求3所述的方法,其特征在于,所述设定应用程序通过弱函数导出的、且可被其他模块调用的应用接口由以下方式实现:提供动态组件框架,设定加载器加载动态组件时向该动态组件框架发出请求,该动态组件框架使用协议中规定的所述弱函数应答;

其中,所述弱函数应答内容包括导出的、且可被其他模块调用的应用接口,所述请求/应答采用协议规定进行通信。

5.如权利要求4所述的方法,其特征在于,所述连接步骤中还包括:强制保留弱函数。

6.如权利要求1所述的方法,其特征在于,所述连接步骤包括:指定该动态组件执行时的入口与出口,并去除没有用到的胶合函数所在的文件中的段。

7.一种构造动态组件的系统,其特征在于,包括映射关系表模块、胶合函数模块、内核API的调用方式设定模块、组件框架模块、应用程序和连接器,其中,映射关系表用于在内核中保存映射关系;

胶合函数模块用于保存不同的胶合函数于不同的文件中的段中,这些胶合函数实现所要调用的内核API到映射关系表的跳转;

内核API的调用方式设定模块用于设定应用程序调用内核中API的方式为通过段中的胶合函数跳转到内核中的映射关系表,再通过该映射关系表跳转到内核中的API;

组件框架模块用于设定应用程序通过组件框架,使用协议规定的弱函数导出应用接口;

连接器用于将所述内核API的调用方式设定模块中对内核API调用方式的设定、组件框架模块中对应用接口的设定和应用程序经编译、连接后,生成动态组件。

8.如权利要求7所述的系统,其特征在于,所述胶合函数模块中包括不同的文件中的段,每个段保存不同的胶合函数,每个胶合函数实现所要调用的内核API到映射关系表的一条记录的跳转。

说明书 :

技术领域

本发明涉及计算机软件技术领域,特别涉及一种构造动态组件的方法和系统。

背景技术

随着第三代移动通信技术的不断成熟,可提供的传输带宽越来越宽。更宽的带宽能够提供给用户更加丰富的业务和应用,且用户对新业务的需求也不断提高,因此,需要开发更多的应用以满足需求。
目前较普遍的应用的开发模式为采用实时操作系统(Real Time OperatingSystem,RTOS)为开发环境,构造动态组件,使动态组件可以动态地加载到系统。其中,动态组件是按照一定的格式单独编译、连接好的应用,提供一定的功能,以文件的形式存在。该动态组件动态加载到系统上,具体的,是动态加载到系统内核上,成为可以执行的代码指令。所述的应用可以由用户自行开发,或由第三方开发,这样将应用的开发和动态组件的构造分为两个过程,利于开发应用的自由度,方便应用的单独开发。
动态组件需要加载在系统内核上,调用系统内核中的API(ApplicationProgramming Interface,应用程序接口),并提供接口到其它模块,使其它模块可以通过该接口使用该动态组件。基于此,一般的构造动态组件的方法如下:
编写应用;
设定应用通过内核接口对内核API的方式;
设定应用导出给其它模块使用的接口的方式;
将应用、设定的内核API调用方式和设定的导出接口方式经编译、连接后生成动态组件。
其中,设定应用通过内核接口对内核API调用的方式,和设定应用导出给其它模块使用的接口的方式,是构造动态组件过程中需要着重解决的两个问题。因为这两个问题的解决会影响到动态组件对内核调用的效率,还会涉及到在实时操作系统中构造动态组件的实现起来的难易度。
现有技术中的一种PIC/PID形式构造动态组件的方法中,解决上述两个问题的方式如下:
内核提供统一的调用接口,该接口采用宏重新定义,以使动态组件可以通过统一的内核接口,按照定义的宏来调用内核API;
导出一个接口给其它模块调用。
该方法中,由于内核提供的是统一的调用接口,因此动态组件通过该接口调用内核中不同API时,需要经过一定次数的比较对内核接口定义的宏才能得到真正调用的内核中API,这些对内核接口重新定义的宏位于头文件中,很多时候,如果宏很多,需要比较的次数可能很大,这样就影响了动态组件调用内核API的效率,同时,更改头文件也导致该方法实现过程较繁琐。此外,针对PIC/PID形式,需要修改实时操作系统中内核线程的调度,这也使该方法实现过程较困难。
另外,现有技术中还有一种Module形式的构造动态组件的方法。与前述方法不同,该方法中,内核提供所有接口的符号与API所在内核中的地址的对应表,动态组件对接口的引用通过符号进行引用,具体的,在内核加载过程中解析这些符号,同时,动态组件接口的导出也通过符号的形式导出。且方法最终生成的动态组件是未经连接的ELF文件。
该方法由于提供的接口是符号形式,则在内核加载过程和接口导出过程中,需要解析这些符号,这样会导致效率降低。而且,连接过程的作用是指定文件执行时的入口,该方法生成的则是未经连接的ELF文件,即不会指定该文件执行时的入口。本领域技术人员知道,文件中包括很多不同的段,可能执行时只需要使用其中的某一些段,则将需要的段保留,将不需要的段去除,这样可以精简组件。而本方法不指定入口与出口,就不会知道哪些段是需要使用的段,也就不会去除不需要的段,这样就使生成的文件体积很大,而在执行时需要将该文件全部调入内存中,这样,该方法占用了较大内存空间,会造成内存资源的浪费。

发明内容

本发明的目的是提供一种构造动态组件的方法和系统,以克服现有技术构造的动态组件调用内核接口效率不高的问题。
为解决上述技术问题,本发明提供一种构造动态组件的方法和系统是这样实现的:
一种构造动态组件的方法,预先设定内核各API与其所在地址的映射关系表,并设定胶合函数,所述胶合函数提供了API标识与映射关系表中记录API所在地址的记录信息的地址的映射关系,该方法包括:
设定应用程序调用内核中API的方式为通过胶合函数跳转到内核中的映射关系表,再通过该映射关系表跳转到内核中的API;
设定用于应用程序导出的、且可被其他模块调用的应用接口;
将所述通过胶合函数跳转到内核中的映射关系表、再跳转到内核中的API的设定、对导出接口方式的设定和应用程序经编译、连接后,生成动态组件。
所述设定胶合函数还包括:
将每一胶合函数设定于不同的文件中的段中。
所述设定用于应用程序导出的、且可被其他模块调用的应用接口由以下方式实现:
设定应用程序通过弱函数导出的、且可被其他模块调用的应用接口。
所述设定应用程序通过弱函数导出的、且可被其他模块调用的应用接口由以下方式实现:
提供动态组件框架,设定加载器加载动态组件时向该动态组件框架发出请求,该动态组件框架使用协议中规定的所述弱函数应答;
其中,所述弱函数应答内容包括导出的、且可被其他模块调用的应用接口,所述请求/应答采用协议规定进行通信。
所述连接步骤中还包括:强制保留弱函数。
所述连接步骤包括:指定该动态组件执行时的入口与出口,并去除没有用到的胶合函数所在的文件中的段。
一种构造动态组件的系统,包括映射关系表模块、胶合函数模块、内核API的调用方式设定模块、组件框架模块、应用程序和连接器,其中,
映射关系表用于在内核中保存映射关系;
胶合函数模块用于保存不同的胶合函数于不同的文件中的段中,这些胶合函数实现所要调用的内核API到映射关系表的跳转;
内核API的调用方式设定模块用于设定应用程序调用内核中API的方式为通过段中的胶合函数跳转到内核中的映射关系表,再通过该映射关系表跳转到内核中的API;
组件框架模块用于设定应用程序通过组件框架,使用协议规定的弱函数导出应用接口;
连接器用于将所述内核API的调用方式设定模块中对内核API调用方式的设定、组件框架模块中对应用接口的设定和应用程序经编译、连接后,生成动态组件。
所述胶合函数模块中包括不同的文件中的段,每个段保存不同的胶合函数,每个胶合函数实现所要调用的内核API到映射关系表的一条记录的跳转。
由以上本发明提供的技术方案可见,本发明预先提供内核各API与其所在地址的映射关系表,并提供胶合函数,设定通过段中的胶合函数跳转到内核中的映射关系表,再通过该映射关系表跳转到内核中的API,经过这两次跳转就可以实现动态组件进入内核,对内核的API进行调用和执行,这样提高了动态组件进入内核的速度,有效提高了效率。

附图说明

图1为本发明构造动态组件的原理图;
图2为本发明方法的流程图;
图3为本发明系统的框图;
图4为利用本发明构造的动态组件加载到系统内核上执行的过程。

具体实施方式

本发明在内核中预先设置内核各API与其所在地址的映射关系表,该映射关系表可以在加载动态组件时提供给所述动态组件,并在每一个段中设置一个胶合函数,在构造动态组件时,设定应用通过该胶合函数和映射关系表调用内核API;所述胶合函数提供动态组件执行时,跳转到调用的API相关的映射关系所在映射关系表中的地址;构造动态组件时,还要设定应用导出给其它模块使用的接口的方式,并将应用、胶合函数和对导出接口方式的设定经编译、连接后生成动态组件。其中,设定应用导出接口可以是提供一个动态组件框架,该动态组件框架使用弱函数导出接口。
为了使本技术领域的人员更好地理解本发明方案,下面结合附图和实施方式对本发明作进一步的详细说明。
本发明构造的动态组件的原理如图1所示。可见,与现有的PIC/PID形式类似的,本发明也需要设定应用通过内核接口对内核调用的方式和设定应用导出给其它模块使用的接口的方式。具体的,本发明中,在动态组件侧,设定对内核接口的调用是通过设定内核API对应的胶合函数实现的,设定导出接口的方式是通过设定动态组件框架实现的。之后,将所述的内核API对应胶合函数、应用和动态组件框架经连接器编译、连接后生成动态组件。
为了提高内核加载动态组件时动态组件进入内核以调用内核API的速度,即提高调用内核API的效率,本发明需要预先在内核中设置内核各API与其所在地址的映射关系表。
该映射关系表提供内核的所有API所在的地址,且该表可以在内核加载动态组件时提供给动态组件。这样,内核加载动态组件时,通过查询该表,跳转到内核中需要调用的API所在的地址,从而调用该API。
由于所述映射关系表中保存的是API所在系统内核中的地址,设所要调用内核中的API的标识为a,设保存的API所在系统内核的地址为a′,则得到了a′的地址后动态组件就可以调用所述的标识为a的API。但是生成的动态组件并不能直接知道要调用的内核中的API a所在的系统内核的地址a′,本发明据此还设定胶合函数,该胶合函数提供所要调用的内核API标识到映射关系表相关记录的映射关系,这样,胶合函数可以实现所要调用的内核API a到映射关系表的跳转。具体的,设映射关系表中保存地址a′信息的记录本身具有地址为a1,所述胶合函数是a到a1的映射。每个胶合函数放在不同的段中。
这样,当生成的动态组件执行时,由需要调用的内核API a找到需要保存在段中的胶合函数,根据该胶合函数跳转到映射关系表中保存该API记录的地址a1,再根据该映射关系表中该API所在内核中的地址a′跳转到该API,从而可以实现对该API的调用。
以下详细介绍本发明构造动态组件的方法。
图2示出了本发明方法的流程。
步骤201:设定应用调用内核中API的方式为通过段中的胶合函数跳转到内核中的映射关系表,再通过该映射关系表跳转到内核中的API。
前述预先设定的内核中的映射关系表和胶合函数是该步骤的前提,为该步骤的执行提供了基础。
现有的PIC/PID形式的构造动态组件的方法,生成的动态组件在执行时,需要在很多重新定义的宏中作多次比较。而按照本发明步骤201构造的动态组件,在执行时,由于给出了胶合函数和映射关系表,并且由于设定了跳转方式,因此只需要根据胶合函数进行一次跳转,再根据映射关系表进行一次跳转,即只需要两次跳转,就可以进入内核,调用内核中的API并执行,这样提高了动态组件进入内核的速度,有效提高了效率。
步骤202:设定应用导出给其它模块调用的接口。
该步骤是构造动态组件过程必要的一步。该步骤可以按照现有技术中的方式执行。
本发明在该步骤中给出一种新的方式,设定应用通过弱函数导出可被其它模块调用的接口。首先提供一个动态组件的框架。加载器加载动态组件时,加载器与该动态组件对框架之间按照规定的协议采用请求/应答方式进行通信。
具体的,当加载器加载动态组件时,发出请求初始化、反初始化、获取接口地址等命令,动态组件的框架使用协议中规定的弱函数应答这些请求,这些请求中包括导出的应用接口。由于弱函数具有可选择的实现通信协议中一个或多个功能的性质,因此,使用弱函数可以导出应用的接口之外,还可以有选择的实现一个或多个其它功能,即扩展了动态组件的功能。
另外,在动态组件连接时,可以使用强制保留的方式保留弱函数,这样可以避免应用程序和动态组件框架之间的连接失效。
步骤203:将所述通过胶合函数跳转到内核中的映射关系表、再跳转到内核中的API的设定,和对导出接口方式的设定,和应用经编译、连接后生成动态组件。
前面提到,每个胶合函数存在不同的段中。有很多不同的段,即有很多不同的胶合函数。一个构造动态组件的过程,应用可能只涉及一个或几个内核API的调用,而连接的过程包括指定应用执行时的入口的功能,这样,只需要在编译连接时使用相关的胶合函数,即仅连接相关的段,将不用到的胶合函数所在的段去除,这样可以减少生成的动态组件的体积,进而在执行时该动态组件占用内存的空间降低,从而提高了内存的利用率。
以下介绍本发明的系统。图3示出了该系统。
该系统包括映射关系表模块301、胶合函数模块302、内核API的调用方式设定模块303、组件框架模块304、应用305和连接器306。
映射关系表模块301用于在内核中保存映射关系表。如前所述,该映射关系表提供内核的所有API所在的地址,且该表可以在内核加载动态组件时提供给动态组件。这样,内核加载动态组件时,通过查询该表,跳转到内核中需要调用的API所在的地址,从而调用该API。
胶合函数模块302用于保存不同的胶合函数于不同的段中,这些胶合函数实现所要调用的内核API a到映射关系表中某一记录的跳转。具体为设映射关系表中保存地址a′信息的记录本身具有地址为a1,所述胶合函数是a到a1的映射。可以是对内核每个API接口构造一个相应的胶合函数,保存在一个唯一的段中。
内核API的调用方式设定模块303与映射关系表模块301和胶合函数模块302相连,用于设定应用调用内核中API的方式为通过段中的胶合函数跳转到内核中的映射关系表,再通过该映射关系表跳转到内核中的API。
组件框架模块304用于设定应用通过组件框架,并使用协议规定的弱函数导出接口。导出的这些接口可以提供给其它模块使用。
连接器306与内核API调用方式设定模块303、组件框架模块304和应用305相连,用于将所述内核API的调用方式设定模块303中对内核API调用方式的设定,和组件框架模块304中对导出接口方式的设定,和应用305经编译、连接后生成动态组件。
利用本系统构造动态组件的方法与前述方法类似,在此不再赘述。
以下介绍采用本发明方法和系统构造的动态组件在加载到系统内核上执行时的过程。
图4示出了该过程。
动态组件侧的应用通过胶合函数跳转到内核侧的映射关系表,再根据该映射关系表跳转到内核中的API,进而调用并执行该API。该过程只需经过两次跳转就可以进入内核,调用内核中的API并执行,这样提高了动态组件进入内核的速度,有效提高了效率。
该过程中,胶合函数经过连接器连接后,仅涉及所要调用内核API相关的胶合函数,前述提到每个胶合函数存在于不同的段中,这样,该过程中涉及的段的数量是很小的,从而构造的动态组件体积可以得到缩减,从而降低了加载过程中占用的内存空间,提高了内存利用率。
应用通过动态组件框架,采用弱函数返回提供给其它模块的接口。具体的,加载器通过内核侧的通信模块发出请求初始化、反初始化、获取接口地址等命令到动态组件框架,动态组件框架使用协议中规定的弱函数应答这些请求。
由以上实施例可见,本发明预先提供内核各API与其所在地址的映射关系表,并提供胶合函数,设定通过段中的胶合函数跳转到内核中的映射关系表,再通过该映射关系表跳转到内核中的API,经过这两次跳转就可以实现动态组件进入内核,对内核的API进行调用和执行,这样提高了动态组件进入内核的速度,有效提高了效率。
虽然通过实施例描绘了本发明,本领域普通技术人员知道,本发明有许多变形和变化而不脱离本发明的精神,希望所附的权利要求包括这些变形和变化而不脱离本发明的精神。