函式分析方法与内存装置与流程

文档序号:11250725阅读:370来源:国知局
函式分析方法与内存装置与流程

本发明有关于一种函式分析方法与内存装置,特别有关于一种能够分析普通函式与api函式之间的对应关系、普通函式之间的呼叫关系、以及检视是否有循环发生的函式分析方法与内存装置。



背景技术:

一般而言,内存装置会储存许多内部储存程序(isp,internalstoredprogram)。在一块内存中通常储存了使用于不同功能模块的内部储存程序。当用户要使用某个功能模块时,则上述功能模块的内部储存程序的程序代码会被加载到此内存,以执行被加载的程序代码并且指定应用程序编程接口(api,applicationprogramminginterface)函式(function)所对应的普通函式。然而,内存的储存容量是有限的。如果上述普通函式之间的呼叫关系具有循环(loop),就会影响内存装置的访问时间与效能。

然而,搜寻上一层函式的字符串来找出循环会耗费许多时间。此外,现行的函式管理方法无法直接藉由api函式分析出内部储存程序中的普通函式之间的上下呼叫关系而找出循环。因此,需要一种能够分析普通函式与api函式之间的对应关系、普通函式之间的呼叫关系以找出循环的函式分析方法,以提升内存装置的效能。



技术实现要素:

为了解决上述问题,本发明提出一种藉由编译程序(compiler)的映像档案(mapfile)分析普通函式与api函式之间的对应关系、以及分析普通函式之间的呼叫关系是否具有循环的函式管理方法,以提升内存装置的效能。此外,本发明所提出的函式分析方法以二维数组来仿真普通函式的呼叫以及数状搜寻,让使用者与研发人员能够快速且有效率的找出函数调用关系中的循环,避免因为循环而影响效能。

本发明的一实施例提供了一种应用于内存装置的函式分析方法,包括分析内存装置之至少一api(applicationprogramminginterface)函式与至少一普通函式的对应关系;藉由对应关系分析至少一普通函式之间的呼叫关系;建立二维数组以分析呼叫关系中是否具有循环(loop)。当至少一普通函式中的一普通函数调用另一普通函式时,检查被呼叫的普通函式的名称,是否相同于普通函式的名称,以及是否相同于所有呼叫普通函式的普通函式的名称。在分析呼叫关系中是否具有循环的步骤中,当被呼叫的普通函式的名称,相同于普通函式的名称,或是相同于所有呼叫普通函式的普通函式的名称,则表示呼叫关系具有循环。

此外,上述二维数组的第一维数组是用以记录具有呼叫关系的普通函式以及被呼叫的普通函式,二维数组的第二维数组用以分别记录普通函式可呼叫的全部普通函式,以及记录被呼叫的普通函式可呼叫的全部普通函式。再者,二维数组更记录普通函式以及被呼叫的普通函式可呼叫的全部普通函式的数量,并且记录被呼叫的普通函式是普通函式所呼叫的全部普通函式中的第几个普通函式。

在分析内存装置的至少一api函式与至少一普通函式的对应关系中,当至少一api函式中的任一者对应到至少一普通函式,从普通函式数据库以及api函式数据库中取得具有对应关系的普通函式以及api函式,于普通函式数据库中标记普通函式对应api函式,并且将普通函式与api函式的对应关系记录于一对应关系数据库。在分析至少一普通函式之间的呼叫关系的步骤中,当普通函式所呼叫的函式为普通函式时,将普通函式与被普通函数调用的普通函式之间的呼叫关系记录于一呼叫关系数据库。当普通函式所呼叫的函式为api函式时,藉由对应关系数据库取得被呼叫的api函式所对应的普通函式,将普通函式与api函式所对应的普通函式之间的呼叫关系记录于呼叫关系数据库。

本发明的一实施例提供了一种具有函式分析功能的内存装置,包括语法分析(parsing)模块、数组模块与分析模块。语法分析模块分析内存装置的至少一api函式与至少一普通函式的对应关系,并且藉由对应关系分析至少一普通函式之间的呼叫关系。数组模块建立二维数组以记录呼叫关系。分析模块分析呼叫关系中是否具有循环。当至少一普通函式中的一普通函数调用另一普通函式时,检查被呼叫的普通函式的名称,是否相同于普通函式的名称,以及是否相同于所有呼叫普通函式的普通函式的名称。

关于本发明其他附加的特征与优点,此领域的熟悉技术人士,在不脱离本发明的精神和范围内,当可根据本案实施方法中所揭示的内存装置及其函式分析方法。

附图说明

图1是显示根据本发明一实施例所述的内存装置的示意图;

图2是显示根据本发明一实施例所述的各种数据库的示意图;

图3是显示根据本发明一实施例所述的函式分析方法的流程图;

图4是显示根据本发明一实施例所述的二维数组的示意图;

图5是显示根据本发明一实施例所述的函式分析方法的流程图;

图6a与6b是显示根据本发明一实施例所述的寻找循环的流程图。

符号说明

10~内存装置;

110~映像档案;

120~原始码;

130~语法分析模块;

140~数据库模块;

150a、150b、150c、150d、150e~数据库;

160~数组目标;

170~数组模块;

180~分析模块;

s500-s510、s600-s622~步骤

具体实施方式

以下的揭示内容提供许多不同的实施例或范例以实施本发明的不同特征。以下的揭示内容叙述各个构件及其排列方式的特定范例,以简化说明。当然,这些特定的范例并非用以限定。例如,若是本揭露书叙述了一第一特征形成于一第二特征之上或上方,即表示其可能包含上述第一特征与上述第二特征是直接接触的实施例,亦可能包含了有附加特征形成于上述第一特征与上述第二特征之间,而使上述第一特征与第二特征可能未直接接触的实施例。另外,以下揭露书不同范例可能重复使用相同的参考符号及/或标记。这些重复为了简化与清晰的目的,并非用以限定所讨论的不同实施例及/或结构之间有特定的关系。

图1是显示根据本发明一实施例所述的内存装置10的示意图。内存装置10可以是随机存取内存(randomaccessmemory,ram)、只读存储器(readonlymemory,rom)、闪存(flash)、硬盘、软盘、磁性内存等。如图1所示,内存装置10包括映像档案(mapfile)110、原始码(sourcecode)120、语法分析(parsing)模块130、数据库(database)模块140、多个数据库150a~150e、数组目标160、数组模块170以及分析模块180。上述语法分析模块130、数据库模块140、数组模块170以及分析模块180可以利用电路硬件或嵌入式软件码加以实现,该嵌入式软件码可以由一处理器存取以及执行。此外,内存装置10可配置于一电子装置中。举例而言,上述电子装置可以为手机、平板计算机、笔记本电脑或是pda等行动电子装置,或是桌面计算机、服务器等电子装置。因此,内存装置10可用以储存电子装置的各种功能所需要的函式及其原始码等。

在一实施例中,映像档案110来自一编译程序(compiler)。语法分析模块130藉由映像档案110取得多个函式(function),以及藉由映像档案110对该内存装置10中的至少一原始码120进行语法分析。此外,上述函式包括至少一普通函式与至少一应用程序编程接口(api,applicationprogramminginterface)函式。详细而言,api函式主要是作为沟通中介之用,不干涉原始码120的执行动作。api函式的优点在于让程序开发人员利用例程功能取代底层的原始码120,加速开发流程。相对于api函式,普通函式则是真实函式(realfunction)。一般而言,一个api函式可以对应一个或多个api函式。因此,记录与分析普通函式与api函式之间的对应关系,有助于研发人员进行开发并且提升内存装置10的效能。

值得注意的是,映像档案110包括至少一api函式与至少一普通函式的名称。在一实施例中,可藉由不同的命名方式来区别api函式以及普通函式。举例来说,如果函式名称以api作为开头者就是api函式,如果函式名称不是以api作为开头者就是普通函式。因此,语法分析模块130能够藉由映像档案110,对内存装置10会使用到的api函式与普通函式的原始码120进行语法分析。在一实施例中,实际上不会被使用的函式就不需要进行语法分析,以增加语法分析模块130的分析效力。

此外,数据库模块140系藉由该映射档案110建立至少一普通函式的普通函式数据库(数据库150a)、以及至少一api函式的api函式数据库(数据库150b)。图2是显示根据本发明一实施例所述的各种数据库150a~150d的示意图。如图2所示,普通函式数据库150a记录普通函式的索引(index字段)、普通函式的名称(name字段)、普通函式所呼叫的函式数量(calling字段)、呼叫该普通函式的函式数量(called字段)、及/或普通函式是否对应api函式等(alternative字段)。此外,api函式数据库150b系记录api函式的名称(name字段)。

在图2所示的普通函式数据库中,每个普通函式都有一个索引编号。举例而言,索引编号122的函式名称为isp_nf_ftl_cleanpart2n3,并且此普通函数调用了3个普通函式(calling字段为3)、被6个普通函式所呼叫(called字段为6)、以及具有对应的api函式(alternative字段为1)。再者,索引编号124的函式名称为isp_nf_ftl_erase_trim_modeentry,并且此普通函数调用了1个普通函式(calling字段为1)、被7个普通函式所呼叫(called字段为7)、以及没有对应的api函式(alternative字段为0)。此外,图2所示的api函式数据库记录了api函式的名称(name字段)。举例而言,索引编号0的api函式名称为api_ctl_errhandle,索引编号1的api函式名称为api_ctl_funcsel。

在一实施例中,语法分析模块130进行第一次语法分析找出普通函式与api函式的对应关系,并且数据库模块140建立该至少一api函式与该至少一普通函式的对应关系数据库(数据库150c)。在图2所示的对应关系数据库中,记录了api函式的名称(name字段)及其所对应的一个以上的普通函式(f-index字段)。每个索引编号代表一个对应关系。举例而言,索引编号0的字段记录了名称为api_nf_ftl_reportexe的api函式对应到编号为128的普通函式,索引编号1的字段记录了名称为api_nf_ftl_reportexe的api函式对应到编号为130的普通函式。由此可知,api_nf_ftl_reportexe的api函式系对应到多个普通函式。此外,索引编号4的字段记录了名称为api_nf_pftl_read_syspage_retry的api函式对应到编号210的普通函式。由此可知,api_nf_pftl_read_syspage_retry之api函式系对应到1个普通函式。

在一实施例中,语法分析模块130进行第二次语法分析以找出普通函式之间的上下呼叫关系,并且数据库模块140建立至少一普通函式之间的呼叫关系数据库(数据库150d)。图2所示的呼叫关系数据库所记录的是普通函式的编号。每个索引编号代表一个呼叫关系,包含了呼叫者以及被呼叫者的普通函式的编号。举例而言,索引编号0的字段记录了编号为138普通函数调用编号为113的普通函式,索引编号1的字段记录了编号为138普通函数调用编号为110的普通函式,索引编号2的字段记录了编号为105普通函数调用编号为103的普通函式。由此可知,编号138的普通函数调用了2个普通函式,而编号105的普通函数调用了1个普通函式。

详细而言,当语法分析模块130判断多个api函式中的任一者对应到一普通函式时,数据库模块140从普通函式数据库150a以及api函式数据库150b中取得具有对应关系的该普通函式以及该api函式。然后,数据库模块140于普通函式数据库150a之中标记该普通函式对应该api函式,并且将该普通函式与该api函式的对应关系记录于对应关系数据库150c。此外,当语法分析模块130判断原始码120的普通函式所呼叫的函式为普通函式时,数据库模块140将该普通函式与被该普通函数调用的普通函式之间的呼叫关系记录于呼叫关系数据库150d。

另一方面,当语法分析模块130判断原始码120的普通函式所呼叫的函式为apli函式时,数据库模块140会藉由对应关系数据库150c取得该呼叫的api函式所对应的普通函式,以及将该普通函式与该api函式所对应的普通函式之间的呼叫关系记录于呼叫关系数据库150d。本发明所提的之内存装置10及其函式管理方法,能够分析普通函式与api函式之间的对应关系、以及普通函式之间的呼叫关系的函式管理方法,因而提升内存装置10的效能并且方便管理内存装置10。

此外,数组模块170建立二维数组,并且依据数组目标160而分析二维数组。在一实施例中,数组目标160找出执行函式时所产生的循环。因此,数组模块170建立二维数组,并且藉由呼叫关系数据库150d分析呼叫关系中是否具有循环(loop)。详细而言,当至少一普通函式中的一普通函数调用另一普通函式时,分析模块180藉由二维数组检查该被呼叫的普通函式的名称,是否相同于该普通函式的名称,以及是否相同于所有呼叫该普通函式的普通函式的名称。当该被呼叫的普通函式的名称,相同于该普通函式的名称,或是相同于所有呼叫该普通函式的普通函式的名称,则表示普通函式的呼叫关系具有循环。值得注意的是,由于分析模块180比较的是普通函式的名称,不是比较字符串,因此能够具有较快速的比较速度,有效率的找出循环。

图3是显示根据本发明一实施例所述的函式管理方法的流程图。在步骤s300,语法分析模块130加载编译程序的映像档案110以取得多个普通函式与api函式,并且数据库模块140建立普通函式数据库150a与api函式数据库150b。在步骤s302中,语法分析模块130进行第一次语法分析,数据库模块140根据第一次语法分析的结果而建立api函式与普通函式之间的对应关系数据库150c。然后在步骤s304,语法分析模块130进行第二次语法分析,数据库模块140根据第二次语法分析的结果而建立普通函式之间的呼叫关系数据库150d。值得注意的是,上述各种数据库150a~150d系彼此关联并且实时更新的。当呼叫关系数据库150d新增一组普通函式的呼叫关系时,普通函式数据库150a中的上述普通函式的calling字段或called字段的数值也会同步更新。然后在步骤s306中,数组模块170建立二维数组以记录普通函式之间的呼叫关系。然后执行步骤s308,分析模块180藉由数组模块170所建立的二维数组,分析呼叫关系是否具有循环。

图4是显示根据本发明一实施例所述的二维数组的示意图。如图4所示,二维数组包括2个维度的数组,分别为x轴维度与y轴维度。二维数组的第一维数组(x轴方向)用以记录具有呼叫关系的普通函式以及被呼叫的普通函式。二维数组的第二维数组(y轴方向)用以分别记录该普通函式可呼叫的全部普通函式,以及记录该被呼叫的普通函式所呼叫的全部普通函式。再者,二维数组更记录该普通函式以及该被呼叫的普通函式可呼叫的全部普通函式的数量,并且记录该被呼叫的普通函式是该普通函式可呼叫的全部普通函式中的第几个普通函式。

详细而言,图4所示的f0、f1、f00、f02、f10等为普通函式的名称。f0函式、f1函式、f8函式和f9函式的阶层数值分别为0、1、8和9。换言之,f0函数调用f1函式,f1函式透过其他普通函数调用f8函式,然后f8函数调用f9函式。对于函式f0而言,其二维数组记录了f0可呼叫的f00函式、f01函式以及f02函式。对于函式f1而言,其二维数组记录了f1可呼叫的f10函式、f11函式、f12函式以及f13函式。此外,二维数组也记录了f0函式具有f00、f01、f02等3个普通函式,并且此3个普通函式分别具有其序号。在一实施例中,排序第1的f00函式实际上被函式f0所呼叫,则f00函式被记录于函式f1的字段中,表示f00函式被f0函式所呼叫。在一实施例中,二维数组也记录了f8函式具有f80、f81等多个普通函式,并且上述普通函式分别具有其序号。排序第2的f81函式实际上被函式f8所呼叫,则f81函式被记录于函式f9的字段中。因此,随着内存装置10进行数据的存取,此二维数组的内容是动态变动的。

值得注意的是,图4所示之f0、f1、f00、f02、f10也可以是表格150a~150d中的普通函式的索引编号(index)。在呼叫下一阶层的函式时,就可以检查二维数组上是否有相同的索引编号。如果发现相同的索引编号,则表示有循环发生。然后,分析模块180将具有循环的该普通函式的索引编号或名称传送给数据库模块140,并且数据库模块将该普通函式的索引编号或名称记录于循环数据库150e。因此,藉由本发明所提供的函式分析方法所建立的二维数组,能够快速找出会产生循环的函式,进而加以记录与管理,避免因为循环而影响到内存装置10的访问速度与效能。

图5是显示根据本发明一实施例所述的函式分析方法的流程图。图5所示的函式分析方法是由数组模块170及/或分析模块180所执行。在步骤s500中,加载源头函式并且设定阶层数值为-1。举例而言,源头函式为main函式。在步骤s502,设定指标数值为0。上述指标数值用以标示目前的普通函式。然后执行步骤s504,分析模块180判断指针数值是否小于普通函数的数量。如果指针数值并未小于普通函数的数量,则执行步骤s512结束流程。如果指针数值小于普通函数的数量,则执行步骤s506。

在步骤s506中,分析模块180判断目前的普通函式是否为源头函式。如果目前的普通函式不是源头函式,则执行步骤s510。如果目前的普通函式为源头函式,则执行步骤s508。在步骤s508中,数组模块170建立二维数组以记录普通函式之间的呼叫关系,递增阶层数值,并且检查是否具有循环。然后,执行步骤s510来递增指标数值,然后再执行步骤s504。

图6a与图6b是显示根据本发明一实施例所述的寻找循环的流程图。图6a与6b所示的函式分析方法是由数组模块170及/或分析模块180所执行。在步骤s600中,判断阶层数值是否大于或等于0。如果阶层数值没有大于或等于0,则执行步骤s622结束流程。如果阶层数值大于或等于0,则执行步骤s602判断是否新增目前普通函式的下一阶层的普通函式。如果没有新增目前普通函式的下一阶层的普通函式,执行步骤s612。如果新增目前普通函式的下一阶层的普通函式,则执行步骤s604。在步骤s604中,是否藉由检查目前普通函式的所有上阶层函式而找到循环。如果检查目前普通函式的所有上阶层函式而没有找到循环,则执行步骤s608。如果检查目前普通函式的所有上阶层函式而找到循环,则执行步骤s606。

在步骤s606中,将具有循环的该目前普通函式记录于循环数据库150e。然后执行步骤s612。在步骤s608中,准备取得目前普通函式可呼叫的普通函式,然后执行步骤s609判断是否具有可呼叫的普通函式。如果没有可呼叫的普通函式,则执行步骤s612。如果具有可呼叫的普通函式,则执行步骤s610,将被呼叫的普通函式加载二维数组的第二维数组,记录被呼叫的普通函式的数量,设定目前函式的现行数值为0。详细而言,现行数值系用以标示目前普通函式的下一阶层的普通函式是第几个普通函式。然后执行步骤s612,检视下一阶层的普通函式。

然后,执行步骤s614,判断现行数值是否小于被呼叫的普通函式的数量。如果现行数值没有小于被呼叫的普通函式的数量,执行步骤s618。如果现行数值小于被呼叫的普通函式的数量,执行步骤s616。在步骤s616中,将被呼叫的普通函式加载二维数组的第一维数组中的目前普通函式的下一阶层,递增阶层数值与目前普通函式的现行数值,设定下一阶层的普通函式的现行数值为0。然后,在步骤s618中,判断是否所有被呼叫的普通函式都载入目前普通函式的下一阶层。如果所有被呼叫的普通函式都加载目前普通函式的下一阶层,则执行步骤s620,递减阶层数值,设定目前普通函式的现行数值为0。如果并非所有被呼叫的普通函式都载入目前普通函式的下一阶层,则再次执行步骤s600。

本发明所提出的内存装置10及其函式分析方法,能够记录普通函式与api函式之间的对应关系、以及分析普通函式之间的呼叫关系是否具有循环,以提升内存装置10的效能。此外,本发明所提出的函式分析方法系以二维数组来仿真普通函式的呼叫以及数状搜寻,让使用者与研发人员能够快速且有效率的找出函数调用关系中的循环,避免因为循环而影响效能。

在本说明书以及申请专利范围中的序数,例如“第一”、“第二”、“第三”等等,彼此之间并没有顺序上的先后关系,其仅用于标示区分两个具有相同名字的不同组件。本发明虽以较佳实施例揭示如上,然其并非用以限定本发明的范围,任何熟悉本技术领域者,在不脱离本发明的精神和范围内,当可做些许的更动与润饰,因此本发明的保护范围当由权利要求书为准。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1