发明内容
本发明实施例提供了一种函数地址的获取方法以及电子设备,从而降低了函数跳转过程中内存的消耗,有效的保障了芯片固件的高性能要求,能够有效的解决在降低的平衡芯片固件高性能要求和较小的运行内存之间的冲突问题。
本发明实施例的第一方面提供了一种函数地址的获取方法,包括:
步骤A、获取目标函数的目标槽位号。
具体的,根据已创建的跳转表和跳转表段确定目标函数的目标槽位号。
本实施例所示的跳转表用于索引所述跳转表段。
所述跳转表段包括多个函数,本实施例所示的跳转表段用于对所述多个函数进行服务,更具体的,将所述多个函数整合在一起形成所述跳转表段。
所述目标函数为所述多个函数中的任一函数,所述跳转表段还包括多个槽位以及与所述多个槽位中的任一槽位对应的槽位号。
所述目标槽位号为与目标槽位对应的槽位号,所述目标槽位为所述目标函数的首地址所位于的槽位。
步骤B、根据所述目标槽位号获取目标函数地址。
在步骤A中可获取到目标函数的目标槽位号,本步骤中,能够根据已获取到的所述目标槽位号获取目标函数地址。
具体的,所述目标函数地址为所述目标函数位于所述跳转表段中的首地址。
更具体的,本实施例所示的目标函数地址为所述目标函数的物理地址。
采用本实施例所示的方法,已创建的跳转表能够根据目标槽位号对设置有目标函数的的跳转表段,从而减少跳转表段所占用的内存,进而使得本实施例所示的方法在保障快速获取函数地址的情况下,能够有效的减少内存所占用的开销,有效的提升了系统的性能和运行效率。
结合本发明实施例的第一方面,本发明实施例第一方面的第一种实现方式中,在所述步骤A之前,还包括步骤A01至步骤A02,具体的,本实施例所示的步骤A01至步骤A02用于执行对跳转表段的创建过程。
步骤A01、创建所述跳转表段。
在系统的程序段中实现跳转表段的创建,以使所述跳转表段包括M个大小相等的槽位,本实施例对所述M的具体数值不作限定,只要为大于一定阈值的正整数即可。
本实施例所示的电子设备能够接收用户输入的配置参数,所述配置参数可包括预设比特值,所述预设比特值为用户通过所述配置参数向所述电子设备输入的各槽位的大小,则电子设备即可根据用户已输入的所述槽位的大小对所述跳转表段进行划分,从而使得划分完成的各槽位的大小均为用户已输入的所述预设比特值。
具体的,所述预设比特值大于或等于所述多个函数中任一函数的对齐粒度。
步骤A02、对各所述槽位进行标号。
本实施例对所述槽位进行标号的具体方法不作限定,只要所述跳转表段所包含的M个槽位中任一槽位均对应有槽位号,且任意两个槽位号之间均不相同,从而使得能够获取到与所述跳转表段所包括的所述多个大小相等的槽位中的任一槽位对应的槽位号。
本实施例所示的方法,能够对跳转表段进行划分,且划分而成的槽位的大小由用户设定,则用户可根据本实施例所示的方法所应用的系统的不同而设定不同的槽位的大小,从而使得本实施例所示的方法能够以高性能应用于各种系统,而且本实施例所示对跳转表段进行划分,从而能够确定出目标函数的首地址所位于的目标槽位,进而获取目标槽位的槽位号,可见,采用本实施例所示的方法能够实现对目标函数的准确,快速的定位,从而提升了对目标函数的目标地址获取过程中的效率以及准确性。
结合本发明实施例的第一方面以及本发明实施例的第一方面的第一种实现方式,本发明实施例的第一方面的第二种实现方式中,在所述步骤A之前,还包括步骤A11,具体的,本实施例所示的步骤A11用于执行对跳转表的创建过程。
步骤A11、根据所述跳转表段创建所述跳转表。
本实施例所示的所述跳转表包括多个子表项和多个参数。
本实施例所示的跳转表建立了如下的对应关系:
一个,建立了参数和子表项之间的对应关系,另一个,建立了参数和所述跳转表段所包含的函数之间的对应关系。
本实施例所示的所述多个参数中包括与所述目标函数对应的目标参数,即可确定与目标参数对应的目标子表项,在所述目标子表项中设置与所述目标函数对应的所述目标槽位号。
本实施例所示的方法,能够根据已创建的所述跳转表段创建跳转表,从而使得跳转表通过所述跳转表中的槽位号实现对跳转表段的索引,采用本实施例所示的槽位号对跳转表段进行索引,相对于现有技术通过函数指针实现对函数的索引的技术方案,本实施例所示的方法能够在快速获取函数地址的情况下,节省跳转表所占用的内存,即有效的减少了内存所占用的开销。
结合本发明实施例的第一方面的第二种实现方式,本发明实施例的第一方面的第三种实现方式中,
所述步骤A具体包括:
步骤A21、读取跳转表的首地址。
本实施例中,在执行获取函数地址的过程中,可对跳转表进行读取,从而读取出跳转表的首地址。
步骤A22、获取所述目标子表项的目标比特数。
本实施例所示的目标子表项为与目标参数对应的子表项,所述目标参数为与函数对应的任一参数。
可见,本实施例所示的目标子表项为用于设置目标槽位号的子表项。
所述目标比特数为创建所述目标子表项所需的比特数。
步骤A23、计算所述目标槽位号。
具体的,本实施例根据第一公式计算所述目标槽位号,其中,所述第一公式为:
所述目标槽位号=所述跳转表的首地址+目标参数*所述目标比特数。
可见,将步骤A21所获取到的跳转表的首地址和步骤A22所获取到的所述目标比特数代入所述第一公式中,即可获取到所述目标槽位号,通过所述目标槽位号即可索引到位于所述跳转表项中的所述目标函数,从而能够实现对目标函数的目标地址的获取。
结合本发明实施例的第一方面的第三种实现方式,本发明实施例的第一方面的第四种实现方式中,所述步骤A22具体包括步骤A221;
步骤A221、根据第二公式计算所述目标比特数。
其中,所述第二公式为:
其中,Q为所述目标比特数,roundup为向上取整函数,N为所述跳转表段所包括的函数的数目,handler-sizei为所述目标函数的大小,所述目标函数为N个所述函数中的第i个函数,i为小于或等于N的正整数,size-of-slot为所述槽位的大小。
本实施例中,所述目标比特数会结合具体的应用场景进行确认。
具体的,在软件的解决方案中,因需要计算机系统为8为,16位或36位,则所述目标比特数只能在8、16以及32中进行取值。
更具体的,通过所述第二公式计算出的所述目标比特数小于8比特,则所述目标比特数取值为8,若通过所述第二公式计算出的所述目标比特数大于8小于16,则所述目标比特数的取值为16,若通过所述第二公式计算出的所述目标比特数大于16比特,则所述目标比特数为32。
在硬件解决方案中,所需要的所述目标比特数的具体数目不作限定。
通过所述第二公式可知,当handler-sizei等于size-of-slot时,所需的所述目标比特数达到最小值roundup(log2 N)。
因跳转表段使用的内存的大小受到size-of-slot的影响,即size-of-slot越大,则代表所述跳转表段中所设置的任意相邻的两个函数之间的间隙就越大,可见,在创建跳转表段的过程中,需要在跳转表段所使用的内存和所述目标比特数之间进行协调,从而通过对size-of-slot的调节,实现对内存使用效率的提升,减少在对函数地址进行获取的过程中所占用的内存。
还可见,因若所述size-of-slot越大,则所述跳转表段所设置的槽位的数目就越少,则减少了跳转表设置槽位号所需要的所述目标比特数的数目,从而进一步的减少了跳转表所占用的内存。
结合本发明实施例的第一方面的第三种实现方式或本发明实施例的第一方面的第四种实现方式,本发明实施例的第一方面的第五种实现方式中,
所述步骤B具体包括:
步骤B11、读取跳转表段的首地址。
本实施例中,需要对所述跳转表段进行读取,从而读取出所述跳转表段的首地址。
步骤B12、计算所述目标函数地址。
具体的,根据第三公式计算所述目标函数地址,其中,所述第三公式为:
所述目标函数地址=所述跳转表段的首地址+所述目标槽位号*所述槽位的大小。
具体的,本实施例所示的目标函数的地址是指所述目标函数位于所述跳转表段中的首地址。
本发明实施例第二方面提供了一种电子设备,包括:
第一获取单元,具体的,本实施例所示的第一获取单元用于执行本发明实施例第一方面所示的步骤A,步骤A的具体执行过程请详见本发明实施例的第一方面所示,具体在本实施例第二方面中不作赘述;
更具体的,所述第一获取单元用于根据跳转表获取目标函数的目标槽位号,所述跳转表用于索引跳转表段,所述跳转表段包括多个函数,所述目标函数为所述多个函数中的任一函数,所述跳转表段还包括多个槽位以及与所述多个槽位中的任一槽位对应的槽位号,所述目标槽位号为与目标槽位对应的槽位号,所述目标槽位为所述目标函数的首地址所位于的槽位;
第二获取单元,具体的,本实施例所示的第二获取单元用于执行本发明实施例第一方面所示的步骤B,步骤B的具体执行过程请详见本发明实施例的第一方面所示,具体在本实施例第二方面中不作赘述;
更具体的,所述第二获取单元用于根据所述目标槽位号获取目标函数地址,所述目标函数地址为所述目标函数位于所述跳转表段中的首地址。
结合本发明实施例第二方面,发明实施例第二方面的第一种实现方式中,所述电子设备还包括:
第一创建单元,具体的,本实施例所示的第一创建单元用于执行本发明实施例第一方面第一种实现方式所示的步骤A01,步骤A01的具体执行过程请详见本发明实施例的第一方面第一种实现方式所示,具体在本实施例第二方面中不作赘述;
更具体的,所述第一创建单元用于创建所述跳转表段,所述跳转表段包括多个大小相等的槽位,且各所述槽位的大小为预设比特值,所述预设比特值大于或等于所述多个函数中任一函数的对齐粒度;
第三获取单元,具体的,本实施例所示的第三获取单元用于执行本发明实施例第一方面第一种实现方式所示的步骤A02,步骤A02的具体执行过程请详见本发明实施例的第一方面第一种实现方式所示,具体在本实施例第二方面中不作赘述;
更具体的,所述第三获取单元用于对各所述槽位进行标号,以获取与所述跳转表段所包括的所述多个大小相等的槽位中的任一槽位对应的槽位号。
结合本发明实施例第一方面或本发明实施例第一方面第一种实现方式,本发明实施例第一方面第二种实现方式中,所述电子设备还包括:
第二创建单元,具体的,本实施例所示的第二创建单元用于执行本发明实施例第一方面第二种实现方式所示的步骤A11,步骤A11的具体执行过程请详见本发明实施例的第一方面第二种实现方式所示,具体在本实施例第二方面中不作赘述;
更具体的,所述第二创建单元用于根据所述跳转表段创建所述跳转表,所述跳转表包括多个子表项和多个参数,所述多个参数中包括与所述目标函数对应的目标参数,与所述目标参数对应的目标子表项用于设置所述目标槽位号。
结合本发明实施例第一方面第二种实现方式,本发明实施例第一方面第三种实现方式,所述第一获取单元包括:
第一读取模块,具体的,本实施例所示的第一读取模块用于执行本发明实施例第一方面第三种实现方式所示的步骤A21,步骤A21的具体执行过程请详见本发明实施例的第一方面第三种实现方式所示,具体在本实施例第二方面中不作赘述;
更具体的,所述第一读取模块用于读取跳转表的首地址。
获取模块,具体的,本实施例所示的获取模块用于执行本发明实施例第一方面第三种实现方式所示的步骤A22,步骤A22的具体执行过程请详见本发明实施例的第一方面第三种实现方式所示,具体在本实施例第二方面中不作赘述;
更具体的,用于获取所述目标子表项的目标比特数,所述目标比特数为创建所述目标子表项所需的比特数;
第一计算模块,具体的,本实施例所示的第一计算模块用于执行本发明实施例第一方面第三种实现方式所示的步骤A23,步骤A23的具体执行过程请详见本发明实施例的第一方面第三种实现方式所示,具体在本实施例第二方面中不作赘述;
更具体的,所述第一计算模块用于根据第一公式计算所述目标槽位号,其中,所述第一公式为:
所述目标槽位号=所述跳转表的首地址+目标参数*所述目标比特数。
结合本发明实施例第一方面第三种实现方式,本发明实施例第一方面第四种实现方式中,所述第一获取模块还可执行本发明实施例第一方面第四种实现方式所示的步骤A221,步骤A221的具体执行过程请详见本发明实施例的第一方面第四种实现方式所示,具体在本实施例第二方面中不作赘述
更具体的,所述第一获取模块还用于,根据第二公式计算所述目标比特数,其中,所述第二公式为:
其中,Q为所述目标比特数,roundup为向上取整函数,N为所述跳转表段所包括的函数的数目,handler-sizei为所述目标函数的大小,所述目标函数为N个所述函数中的第i个函数,i为小于或等于N的正整数,size-of-slot为所述槽位的大小。
结合本发明实施例第一方面第三种实现方式或本发明实施例第一方面第四种实现方式,本发明实施例第一方面第五种实现方式中,所述第二获取单元包括:
第二读取模块,具体的,本实施例所示的第二读取模块用于执行本发明实施例第一方面第四种实现方式所示的步骤B11,步骤B11的具体执行过程请详见本发明实施例的第一方面第四种实现方式所示,具体在本实施例第二方面中不作赘述;
更具体的,所述第二读取模块用于读取跳转表段的首地址;
第二计算模块,具体的,本实施例所示的第二计算模块用于执行本发明实施例第一方面第四种实现方式所示的步骤B12,步骤B12的具体执行过程请详见本发明实施例的第一方面第四种实现方式所示,具体在本实施例第二方面中不作赘述;
更具体的,所述第二计算模块用于根据第三公式计算所述目标函数地址,其中,所述第三公式为:
所述目标函数地址=所述跳转表段的首地址+所述目标槽位号*所述槽位的大小。
从以上技术方案可以看出,本发明实施例具体以下优点:
能够根据跳转表获取到目标函数的目标槽位号,所述目标函数为跳转表段所包含的任一函数,所述跳转表用于索引所述跳转表段,所述目标槽位号为与目标槽位对应的槽位号,所述目标槽位为所述目标函数的首地址所位于的槽位,根据所述目标槽位号获取目标函数地址,可见,本发明实施例所创建的跳转表通过目标槽位号索引设置有所述目标函数的跳转表段,相对于现有技术通过函数指针实现对函数的索引的技术方案,本实施例所示的方法能够在快速获取函数地址的情况下,节省跳转表所占用的内存,即有效的减少了内存所占用的开销。
具体实施方式
首先结合图1所示对能够实现本发明实施例所示的函数地址的获取方法的电子设备的具体结构进行说明。
图1是本发明实施例提供的一种电子设备结构示意图,该电子设备100可因配置或性能不同而产生比较大的差异,可以包括一个或一个以上中央处理器(centralprocessing units,CPU)122(例如,一个或一个以上处理器)和存储器132,一个或一个以上存储应用程序142或数据144的存储介质130(例如一个或一个以上海量存储设备)。其中,存储器132和存储介质130可以是短暂存储或持久存储。存储在存储介质130的程序可以包括一个或一个以上模块(图示没标出),每个模块可以包括对电子设备中的一系列指令操作。更进一步地,中央处理器122可以设置为与存储介质130通信,在电子设备100上执行存储介质130中的一系列指令操作。
电子设备100还可以包括一个或一个以上电源126,一个或一个以上有线或无线网络接口150,一个或一个以上输入输出接口158,和/或,一个或一个以上操作系统141,例如Windows ServerTM,Mac OS XTM,UnixTM,LinuxTM,FreeBSDTM等等。
上述实施例中由电子设备所执行的步骤可以基于该图1所示的电子设备结构。
基于图1所示的电子设备,以下结合图2所示对本实施例所提供的函数地址的获取方法的具体执行流程进行说明。
步骤201、创建跳转表段。
本实施例中,在所述电子设备的所述存储器上创建所述跳转表段。
本实施例所述的跳转表段用于对N个函数进行服务,具体的,本实施例所示的跳转表段用于设置N个函数。
本实施例对N的具体数值不作限定。
更具体的,将N个函数整合在一起就是所述跳转表段,即所述跳转表段是N个函数在程序段中的示例。
在具体应用中,可在所述存储器上设置署名名字为“text”段的跳转表段,即可将N个函数放到署名为“text”段的跳转表段里。
本实施例对跳转表段在程序段中的具体名称不作限定。
在本实施例中,如图3所示,需要对跳转表段进行划分,以使划分后的所述跳转表300包括M个大小相等的槽位。
具体的,本实施例所示的电子设备能够接收用户输入的配置参数,所述配置参数可包括预设比特值,所述预设比特值为用户通过所述配置参数向所述电子设备输入的各槽位的大小,则电子设备即可根据用户已输入的所述槽位的大小对所述跳转表段进行划分,从而使得划分完成的各槽位的大小均为用户已输入的所述预设比特值。
具体的,本实施例对M的大小的不作限定。
可选的,本实施例所划分的M个槽位为连续的,即M个槽位中任意相邻的两个为彼此相互连接的。
需明确的是,本实施例所示的各槽位的所述预设比特值大于或等于所述N个函数中任一函数的对齐粒度。
继续如图3所示,对各所述槽位进行标号,以获取与所述跳转表段所包括的所述多个大小相等的槽位中的任一槽位对应的槽位号。
例如,与第一槽位301对应的为槽位号0,与第二槽位302对应的为槽位号1,以此类推,直至与第N槽位303对应的为槽位号M。
以图3所示为例,可所述跳转表段所包含的槽位进行连续的标号,当然,在其他实施例中,也可对所述跳转表段所包含的槽位进行非连续的标号,只要通过所述跳转表段能够建立槽位号与槽位的一一对应的关系即可。
可见,通过本实施例所划分的所述跳转表段能够获取到与所述跳转表段所包括的N个大小相等的槽位中的任一槽位对应的槽位号。
具体的,以下对本实施例所述的所述跳转表段具体是如何设置函数的进行说明。
以下结合图4所示为例进行示例性说明,本示例中,以所述跳转表段设置有N=5个函数为例,需明确的是,在具体应用中,本实施例对所述跳转表段所能够服务的函数的具体数目不作限定。
在本示例中,函数1的首地址位于槽位号0的槽位中,且所述函数1共占用3个槽位,即槽位号0的槽位,槽位号1的槽位以及槽位号2的槽位。
函数2的首地址位于槽位号3的槽位中,且所述函数2共占用1个槽位,即槽位号3的槽位。
函数3的首地址位于槽位号4的槽位中,且所述函数1共占用4个槽位,即槽位号4的槽位,槽位号5的槽位,槽位号6的槽位以及槽位号7的槽位。
函数4的首地址位于槽位号8的槽位中,且所述函数4共占用1个槽位,即槽位号8的槽位。
本示例中函数5所占用的槽位不作限定。
本实施例中,内存等于跳转表段所划分出的槽位的个数与各槽位大小的乘积。
可见,采用本实施例所示的对跳转表段的划分方法,能够快速的确定在跳转表段中各函数的首地址所位于的槽位,以及各函数所占用的槽位数目,从而能够准确的将函数的具体位置在内存中进行定位。
步骤202、根据所述跳转表段创建跳转表。
具体的,本实施例所示的跳转表用于索引所述跳转表段。
本实施例所示的跳转表的具体结构请参见图5所示进行示例性说明。
所述跳转表500包括多个子表项和多个参数。
本示例中,所述跳转表500还设置用于配置所述参数的区域501,在区域501内可配置有多个参数,且建立参数与子表项的对应关系。
需明确的是,本实施例对所述多个参数的具体配置方式不作限定,即所述多个参数可连续进行配置,也可非连续进行配置。
为更好的体现参数与子表项的对应关系,则本实施例所配置的参数可从数值0开始进行连续配置,直至配置到数值X,且参数1对应第一个子表项,参数2对应第二个子表项,可见,配置完成后,所述跳转表一共包括有X+1个子表项。
在具体配置中,若所述参数的开始数值不为0,则可减去一个参数,从而使得参数从0开始进行连续配置。
具体的,本实施例所示的多个参数还建立了与跳转表段所包含的函数的对应关系,可选的,多个参数可与函数一一对应,可选的,多个参数中的一部分可与函数一一对应,本实施例具体不作限定。
还以所述跳转表段包括5个函数为例,则本实施例中,参数1可对应函数1,参数3可对应函数2,参数5可对应函数3,参数7可对应函数4,参数8可对应函数5。
更具体的,本实施例所示的表项用于设置与表项对应的函数的首地址所位于的槽位的槽位号。
具体的,本实施例以所述跳转表段设置有目标函数为例,本实施例所示的目标函数为所述跳转表段所包含的多个函数中的任一个函数。
本实施例所示的跳转表所包括的多个参数中包括与所述目标函数对应的目标参数,与所述目标参数对应的子表项为目标子表项,在所述目标子表项中设置有所述目标函数的目标槽位号。
例如,结合图4和图5所示,若目标函数为图4所示的函数1为例,函数1的首地址所位于槽位号为目标槽位号0,与函数1对应的为目标参数为参数1,与目标参数1对应的目标子表项中设置函数1的目标槽位号0。
若目标函数为图4所示的函数2为例,函数2的首地址所位于槽位号为目标槽位号3,与函数2对应的参数为目标参数3,与目标参数3对应的目标子表项中设置函数2的目标槽位号3。
本实施例中,因参数2并没有设置有对应的函数,则参数2所对应的子表项为无效的。
可见,本实施例所示中,若参数没有建立与函数的对应关系,则该参数对应的子表项为无效的。
若目标函数为图4所示的函数3为例,函数3的首地址所位于槽位号为目标槽位号4,与函数3对应的参数为目标参数5,与目标参数5对应的目标子表项中设置函数3的目标槽位号4。
若目标函数为图4所示的函数4为例,函数4的首地址所位于槽位号为目标槽位号8,与函数4对应的参数为目标参数7,与目标参数7对应的目标子表项中设置函数4的目标槽位号8。
可见,采用本实施例所示的跳转表,可使得跳转表所设置的参数中与有效的参数对应的子表项能够配置有与函数对应的槽位号,有效的参数是指建立了与函数对应关系的参数。
在执行步骤201和步骤202后,以下结合步骤203至步骤205具体说明本实施例所示是如何获取目标函数的目标槽位号的,需明确的是,本实施例所示的步骤201至步骤202为可选的步骤,若在执行本实施例所示的函数地址的获取过程中,所述跳转表以及所述跳转表段已配置完成,则无需执行步骤201至步骤202。
步骤203、读取跳转表的首地址。
本实施例中,在执行获取函数地址的过程中,可对跳转表进行读取,从而读取出跳转表的首地址。
步骤204、获取所述目标子表项的目标比特数。
本实施例所示的目标子表项为与目标参数对应的子表项,所述目标参数为与函数对应的任一参数。
可见,本实施例所示的目标子表项为用于设置目标槽位号的子表项。
所述目标比特数为创建所述目标子表项所需的比特数。
具体的,本实施例中根据第二公式计算所述目标比特数。
所述第二公式为:
其中,Q为所述目标比特数,roundup为向上取整函数,N为所述跳转表段所包括的函数的数目,handler-sizei为所述目标函数的大小,所述目标函数为N个所述函数中的第i个函数,i为小于或等于N的正整数,size-of-slot为所述槽位的大小。
本实施例中,所述目标比特数会结合具体的应用场景进行确认。
具体的,在软件的解决方案中,因需要计算机系统为8为,16位或36位,则所述目标比特数只能在8、16以及32中进行取值。
更具体的,通过所述第二公式计算出的所述目标比特数小于8比特,则所述目标比特数取值为8,若通过所述第二公式计算出的所述目标比特数大于8小于16,则所述目标比特数的取值为16,若通过所述第二公式计算出的所述目标比特数大于16比特,则所述目标比特数为32。
在硬件解决方案中,所需要的所述目标比特数的具体数目不作限定。
通过所述第二公式可知,当handler-sizei等于size-of-slot时,所需的所述目标比特数达到最小值roundup(log2 N)。
因跳转表段使用的内存的大小受到size-of-slot的影响,即size-of-slot越大,则代表所述跳转表段中所设置的任意相邻的两个函数之间的间隙就越大,可见,在创建跳转表段的过程中,需要在跳转表段所使用的内存和所述目标比特数之间进行协调,从而通过对size-of-slot的调节,实现对内存使用效率的提升,减少在对函数地址进行获取的过程中所占用的内存。
还可见,因若所述size-of-slot越大,则所述跳转表段所设置的槽位的数目就越少,则减少了跳转表设置槽位号所需要的所述目标比特数的数目,从而进一步的减少了跳转表所占用的内存。
步骤205、计算所述目标槽位号。
具体的,根据第一公式计算所述目标槽位号,其中,所述第一公式为:
所述目标槽位号=所述跳转表的首地址+目标参数*所述目标比特数。
本实施例所示的目标参数为与目标函数对应的参数,以图5所示为例,在计算目标槽位号时,可分别将目标参数1、3、5以及7代入所述第一公式中,从而分别算出当目标参数为1时,与目标参数1对应的目标子表项内所设置的目标槽位号,与目标参数3对应的目标子表项内所设置的目标槽位号,与目标参数5对应的目标子表项内所设置的目标槽位号以及与目标参数7对应的目标子表项内所设置的目标槽位号。
可见,通过步骤203至步骤205能够计算出目标函数的首地址所位于的目标槽位号,从而实现对目标函数的迅速定位。
以下结合步骤206至步骤207所示对如何获取所述目标函数的具体地址进行说明,需明确的是,通过步骤206至步骤207所获取到的为目标函数的物理地址,即所述目标函数的绝对地址。
步骤206、读取跳转表段的首地址。
本实施例中,需要对所述跳转表段进行读取,从而读取出所述跳转表段的首地址。
步骤207、计算所述目标函数地址。
具体的,根据第三公式计算所述目标函数地址,其中,所述第三公式为:
所述目标函数地址=所述跳转表段的首地址+所述目标槽位号*所述槽位的大小。
本实施例中,所述目标槽位号为在步骤205所计算出的槽位号,所述槽位的大小为在对所述跳转表段进行配置的过程中所预先设置的。
可见,通过本实施例所示的步骤207能够计算出所述目标函数的地址。
具体的,本实施例所示的目标函数的地址是指所述目标函数位于所述跳转表段中的首地址。
为更好的理解本发明实施例所示的方法,以下对在C语言的环境下如何实现本发明实施例所示的方法进行说明。
声明跳转表:unsigned char jump_table[ARRAY_SIZE];——unsigned char用于子表项需要8bit的情况
声明函数:RC_type handler_Y(…)__attribute__((section("jump_table_section")aligned(size-of-slot)))
初始化:jump_table[idx_Y]=(handler_Y-jump_table_section_address)>>LOG_2(size-of-slot);
第1步:slot-number=jump_table[idx_Y];
第2步:address_of_handler=jump_table_section_address+slot-number<<LOG_2(size-of-slot)。
采用本实施例所示的方法的有益效果在于:
本发明实施例所创建的跳转表通过子表项所设置的槽位号实现对跳转表段的索引,从而使得跳转表的大小也只是传统的函数指针数组方法的跳转表大小的四分之一。并且通过分析汇编结果可以发现本实施例所提供的跳转表仅仅比传统的函数指针数组的方法多2条汇编指令,对性能几乎没有影响,但是本实施例所示的方法能够在快速获取函数地址的情况下,节省跳转表所占用的内存,即有效的减少了内存所占用的开销。
为实现本发明实施例所示的函数地址的获取方法,则本发明实施例还提供了一种能够实现上述方法的电子设备,所述电子设备的实体结构请参见图1所示,以下结合图6所示从功能模块角度对所述电子设备的具体结构进行说明。
如图6所示,所述电子设备包括:
第一创建单元601,用于创建所述跳转表段,所述跳转表段包括多个大小相等的槽位,且各所述槽位的大小为预设比特值,所述预设比特值大于或等于所述多个函数中任一函数的对齐粒度;
第三获取单元602,用于对各所述槽位进行标号,以获取与所述跳转表段所包括的所述多个大小相等的槽位中的任一槽位对应的槽位号。
第二创建单元603,用于根据所述跳转表段创建所述跳转表,所述跳转表包括多个子表项和多个参数,所述多个参数中包括与所述目标函数对应的目标参数,与所述目标参数对应的目标子表项用于设置所述目标槽位号。
第一获取单元604,用于根据跳转表获取目标函数的目标槽位号,所述跳转表用于索引跳转表段,所述跳转表段包括多个函数,所述目标函数为所述多个函数中的任一函数,所述跳转表段还包括多个槽位以及与所述多个槽位中的任一槽位对应的槽位号,所述目标槽位号为与目标槽位对应的槽位号,所述目标槽位为所述目标函数的首地址所位于的槽位;
具体的,所述第一获取单元604包括:
第一读取模块6041,用于读取跳转表的首地址;
获取模块6042,用于获取所述目标子表项的目标比特数,所述目标比特数为创建所述目标子表项所需的比特数;
第一计算模块6043,用于根据第一公式计算所述目标槽位号,其中,所述第一公式为:
所述目标槽位号=所述跳转表的首地址+目标参数*所述目标比特数。
其中,所述第一获取模块还用于,根据第二公式计算所述目标比特数,其中,所述第二公式为:
其中,Q为所述目标比特数,roundup为向上取整函数,N为所述跳转表段所包括的函数的数目,handler-sizei为所述目标函数的大小,所述目标函数为N个所述函数中的第i个函数,i为小于或等于N的正整数,size-of-slot为所述槽位的大小。
第二获取单元605,用于根据所述目标槽位号获取目标函数地址,所述目标函数地址为所述目标函数位于所述跳转表段中的首地址。
具体的,所述第二获取单元605包括:
第二读取模块6051,用于读取跳转表段的首地址;
第二计算模块6052,用于根据第三公式计算所述目标函数地址,其中,所述第三公式为:
所述目标函数地址=所述跳转表段的首地址+所述目标槽位号*所述槽位的大小。
本实施例所示的电子设备执行函数地址的获取的具体执行流程,请详见上述流程所示,具体在本实施例中不作限定,且本实施例所示的电子设备在执行上述实施例所示的方法所取得的有益效果请详见上述实施例所示,具体在本实施例中不作赘述。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。