CN112130926B - 应用程序运行的方法、装置、终端设备及存储介质 - Google Patents
应用程序运行的方法、装置、终端设备及存储介质 Download PDFInfo
- Publication number
- CN112130926B CN112130926B CN202010978033.9A CN202010978033A CN112130926B CN 112130926 B CN112130926 B CN 112130926B CN 202010978033 A CN202010978033 A CN 202010978033A CN 112130926 B CN112130926 B CN 112130926B
- Authority
- CN
- China
- Prior art keywords
- address
- application program
- memory
- running
- target
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 66
- 230000006870 function Effects 0.000 claims description 178
- 230000008569 process Effects 0.000 claims description 17
- 238000004590 computer program Methods 0.000 claims description 14
- 238000004364 calculation method Methods 0.000 claims description 7
- 238000010586 diagram Methods 0.000 description 10
- 230000000694 effects Effects 0.000 description 4
- 230000003068 static effect Effects 0.000 description 4
- 230000005856 abnormality Effects 0.000 description 2
- 230000008901 benefit Effects 0.000 description 2
- 230000003993 interaction Effects 0.000 description 2
- 206010033799 Paralysis Diseases 0.000 description 1
- 230000002159 abnormal effect Effects 0.000 description 1
- 230000000903 blocking effect Effects 0.000 description 1
- 230000000295 complement effect Effects 0.000 description 1
- 238000004883 computer application Methods 0.000 description 1
- 230000001419 dependent effect Effects 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000011084 recovery Methods 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44536—Selecting among different versions
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/0223—User address space allocation, e.g. contiguous or non contiguous base addressing
- G06F12/023—Free address space management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本申请适用于信息技术领域,提供了一种应用程序运行的方法、装置、终端设备及存储介质,该方法包括:从应用程序的多个版本中确定目标版本,并确定目标版本中的第一参数信息;获取加载器传递的应用程序的第二参数信息;根据第一参数信息和第二参数信息,计算目标版本中脚本文件的目标元素,在运行时的目标存储地址;运行目标存储地址中的脚本文件的目标元素,以运行目标版本的应用程序。采用上述方法,可以实现应用程序在终端设备内部的实际运行地址即使与应用程序链接时指定的链接地址不同时,也可以正常运行应用程序。
Description
技术领域
本申请属于信息技术领域,尤其涉及一种应用程序运行的方法、装置、终端设备及存储介质。
背景技术
目前,对于终端设备内部已安装的应用程序,链接器通常在链接应用程序时,便已经指定应用程序在终端设备中的链接运行地址。终端设备在运行应用程序时,便可根据终端设备的链接运行地址运行应用程序。然而,若终端设备内部存储了两个及以上版本的的应用程序,则编译器需为每个应用程序指定相应的链接运行地址。但是终端设备很难区分每个版本的应用程序之间的差异,无法确定当前启动的应用程序正确的链接运行地址。因此,将会导致应用程序的链接运行地址,和实际使用的运行地址不一致,使得应用程序无法正常运行。
发明内容
本申请实施例提供了一种应用程序运行的方法、装置、终端设备及存储介质,可以解决应用程序的链接运行地址和实际使用的运行地址不一致时,应用程序无法正常运行的问题。
第一方面,本申请实施例提供了一种应用程序运行的方法,包括:
从应用程序的多个版本中确定目标版本,并确定所述目标版本中的第一参数信息;
获取加载器传递的所述应用程序的第二参数信息;
根据所述第一参数信息和所述第二参数信息,计算所述目标版本中脚本文件的目标元素在运行时的目标存储地址;
运行所述目标存储地址中所述脚本文件的目标元素,以运行所述目标版本的应用程序。
在一实施例中,所述从应用程序的多个版本中确定目标版本,包括:
通过终端设备中的所述加载器加载运行环境,并获取所述运行环境中预设存储位置下的所述多个版本的应用程序;
分别解析所述多个版本的应用程序的文件头信息,得到所述应用程序的多个版本信息;
根据所述多个版本信息,从所述应用程序的多个版本中,确定所述目标版本。
在一实施例中,所述脚本文件的目标元素包括全局偏移表,所述目标存储地址包括全局偏移表地址,所述第一参数信息包括所述目标版本的应用程序在链接时,由链接器指定存储在内存中的第一内存起始地址,和所述目标版本的应用程序中全局偏移表在链接后在内存中进行存储的第一内存地址,所述第二参数信息包括所述目标版本的应用程序运行时在内存中实际使用的第二内存起始地址;
所述根据所述第一参数信息和所述第二参数信息,计算所述目标应用程序中脚本文件的目标元素在运行时的目标存储地址,包括:
获取所述第一参数信息中的第一内存起始地址和第一内存地址,以及获取所述第二参数信息中的第二内存起始地址;
根据所述第一内存起始地址以及所述第二内存起始地址,计算所述目标版本的应用程序在运行时所述全局偏移表在所述内存中的第一偏移值;
通过所述第一内存地址和所述第一偏移值,确定所述目标版本的应用程序在运行时,所述全局偏移表存储在所述内存中的全局偏移表地址。
在一实施例中,所述脚本文件的目标元素包括多个全局变量,所述目标存储地址还包括目标全局变量地址,所述全局偏移表中存储有所述多个全局变量的多个变量存储地址;
在所述通过所述第一内存地址和所述第一偏移值,确定所述目标版本的应用程序在运行时,所述全局偏移表存储在所述内存中的第二目标存储地址之后,还包括:
获取所述多个全局变量在链接时,所述链接器分别为所述多个全局变量分配的第二内存地址;
根据所述第二内存地址和所述第一偏移值,计算所述多个全局变量分别存储在所述内存中的多个变量存储地址;
在所述目标版本的应用程序运行时,从所述全局偏移表中的所述多个变量存储地址中确定目标全局变量地址。
在一实施例中,所述脚本文件的目标元素还包括多个全局函数,所述全局偏移表地址还包括目标函数运行地址,所述全局偏移表中存储有所述多个全局函数分别对应的多个函数运行地址,所述第一参数信息还包括所述目标版本的应用程序在链接时,由所述链接器在闪存中指定所述目标版本的应用程序运行时的第一运行地址,以及所述多个全局函数在链接时,所述链接器分别为所述多个全局函数分配的第二运行地址,所述第二参数信息还包括所述目标版本的应用程序运行时在闪存中实际使用的第三运行地址;
在所述通过所述第一内存地址和所述第一偏移值,计算所述目标版本的应用程序在运行时,所述全局偏移表存储在内存中的全局偏移表地址之后,还包括:
获取所述第一参数信息中的第一运行地址和第二运行地址,以及获取所述第二参数信息中的第三运行地址;
根据所述第一运行地址和所述第三运行地址,计算所述目标版本的应用程序在运行时所述全局函数在闪存中的第二偏移值;
根据所述第二运行地址和所述第二偏移值,分别计算所述多个全局函数在运行时处于所述闪存中的多个函数运行地址;
在所述目标版本的应用程序运行时,从所述全局偏移表中的所述多个函数运行地址中确定目标函数运行地址。
在一实施例中,所述脚本文件的目标元素还包括中断向量表中的多个中断处理函数,所述第一参数信息还包括所述链接器生成所述中断向量表时,所述链接器为所述多个中断处理函数分别分配的多个第四运行地址;所述方法还包括:
当所述目标版本的应用程序运行时,在所述闪存中划分闪存区域作为存储所述多个中断处理函数的所述中断向量表;
获取所述第一参数信息中的多个第四运行地址,并根据所述第二偏移值和所述多个第四运行地址,分别计算所述目标版本的应用程序运行时,所述多个中断处理函数在所述闪存中实际运行时的多个中断函数运行地址;
将所述多个中断函数运行地址及其对应的所述多个中断处理函数的关联信息存储至所述中断向量表;
若所述目标版本的应用程序在运行过程中发生异常中断,则根据所述关联信息,从所述中断向量表包含的所述多个中断函数运行地址中,确定目标中断函数运行地址,并运行所述目标中断函数运行地址下的中断处理函数。
在一实施例中,所述第二参数信息还包括所述目标版本的应用程序的可用内存长度,所述方法还包括:
获取所述终端设备中内存的内存剩余值;
若所述可用内存长度大于所述内存剩余值,则终止启动所述目标版本的应用程序;
若所述可用内存长度小于或等于所述内存剩余值,则启动所述目标版本的应用程序。
第二方面,本申请实施例提供了一种应用程序运行装置,包括:
确定模块,用于从应用程序的多个版本中确定目标版本,并确定所述目标版本中的第一参数信息;
第一获取模块,用于获取加载器传递的所述应用程序的第二参数信息;
计算模块,用于根据所述第一参数信息和所述第二参数信息,计算所述目标版本中脚本文件的目标元素在运行时的目标存储地址;
运行模块,用于运行所述目标存储地址中所述脚本文件的目标元素,以运行所述目标版本的应用程序。
第三方面,本申请实施例提供了一种终端设备,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现如上述第一方面任一项所述的方法。
第四方面,本申请实施例提供了一种计算机可读存储介质,所述计算机程序被处理器执行时实现如上述第一方面任一项所述的方法。
第五方面,本申请实施例提供了一种计算机程序产品,当计算机程序产品在终端设备上运行时,使得终端设备执行上述第一方面中任一项所述的方法。
在本申请实施例,通过从应用程序的多个版本中确定目标版本,以及目标版本中的第一参数信息,并获取加载器传递的应用程序的第二参数信息,计算目标版本中的脚本文件在运行时的目标存储地址,使得应用程序在终端设备内部的实际运行地址即使与应用程序链接时指定的链接地址不同时,也可计算出运行的脚本文件中目标元素的目标存储地址,进而在运行应用程序时,可实现应用程序运行的目标存储地址不受链接器指定的链接地址影响的效果,达到可在任意地址运行应用程序的目的。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本申请一实施例提供的一种应用程序的运行方法的实现流程图;
图2是本申请一实施例提供的一种应用程序的运行方法的S101的一种实现方式示意图;
图3是本申请一实施例提供的一种应用程序的运行方法的S103的一种实现方式示意图;
图4是本申请一实施例提供的一种应用程序的运行方法的S103的又一种实现方式示意图;
图5是本申请一实施例提供的一种应用程序的运行方法的S103的另一种实现方式示意图;
图6是本申请一实施例提供的一种应用程序的运行方法的S103的再一种实现方式示意图;
图7是本申请另一实施例提供的一种应用程序的运行方法的实现流程图;
图8是本申请实施例提供的应用程序运行装置的结构示意图;
图9是本申请实施例提供的终端设备的结构示意图。
具体实施方式
以下描述中,为了说明而不是为了限定,提出了诸如特定***结构、技术之类的具体细节,以便透彻理解本申请实施例。然而,本领域的技术人员应当清楚,在没有这些具体细节的其他实施例中也可以实现本申请。在其他情况中,省略对众所周知的***、装置、电路以及方法的详细说明,以免不必要的细节妨碍本申请的描述。
应当理解,当在本申请说明书和所附权利要求书中使用时,术语“包括”指示所描述特征、整体、步骤、操作、元素和/或组件的存在,但并不排除一个或多个其他特征、整体、步骤、操作、元素、组件和/或其集合的存在或添加。
还应当理解,在本申请说明书和所附权利要求书中使用的术语“和/或”是指相关联列出的项中的一个或多个的任何组合以及所有可能组合,并且包括这些组合。
另外,在本申请说明书和所附权利要求书的描述中,术语“第一”、“第二”、“第三”等仅用于区分描述,而不能理解为指示或暗示相对重要性。
本申请实施例提供的应用程序的运行方法可以应用于手机、平板电脑、笔记本电脑、超级移动个人计算机(ultra-mobile personal computer,UMPC)、上网本等终端设备上,本申请实施例对终端设备的具体类型不作任何限制。
请参阅图1,图1示出了本申请实施例提供的一种应用程序的运行方法的实现流程图,该方法包括如下步骤:
S101、从应用程序的多个版本中确定目标版本,并确定所述目标版本中的第一参数信息。
在应用中,终端设备内部可能预先存储有应用程序的多个版本,其中,多个版本可以为版本信息均一致的版本,也可以为版本信息各不相同的版本。其中,上述目标版本可以为应用程序的多个版本中版本信息最新的版本。具体的,若应用程序具有A版本以及B版本,而在进行应用升级时,如果当前正在运行的应用程序为A版本且存储于A存储空间,则为保证应用程序的正常运行,可对存储于B存储空间的B版本进行升级。同时在下次运行应用程序时,将B版本确定为目标版本进行运行,并且升级A存储空间中A版本对应的应用程序。上述应用程序可以为交易型应用程序,也可以为娱乐型应用程序,对此不作限定。需要说明的是,大多数交易型应用程序的涉及直接利益的交互,而娱乐型应用程序一般不涉及利益的交互。因此,可认为终端设备会存储交易型应用程序的多个版本,以便应用程序在升级的过程中还可正常运行。
在应用中,上述第一参数信息为应用程序在运行过程中可以做相对寻址时所依赖的必要信息。其中,相对寻址是以当前应用程序计数器PC(Program Counter,PC)的内容为基址,加上指令给出的一字节补码数(偏移值)形成新的PC值的寻址方式称为相对寻址。其中,计数器PC用于存放当前欲执行指令的地址,它与主存之间有一条直接通路,且具有自加1的功能,即可形成下一条指令的地址。
在应用中,第一参数信息可以保存在应用程序的文件头中,其存储格式可采用标准elf section保存应用程序文件头信息,兼容通用的elf文件解析工具用于解析应用程序头文件。其中,elf为文件格式,section部分组成第一参数信息对应的代码文件的内容。另外,第一参数信息包括但不限于应用程序链接时,由链接器在内存中指定使用的第一内存起始地址,或者,应用程序链接时,由链接器在闪存(flash)中指定应用程序运行使用的运行地址等,对此不作限定。
S102、获取加载器传递的所述应用程序的第二参数信息。
在应用中,上述加载器(bootloader)为启动程序,位于终端设备或其他计算机应用上,用于引导操作***启动的程序。上述加载器在启动应用程序时,可以获取到该应用程序在终端设备内部的存储信息以及初始运行信息,其可认为是加载器传递的应用程序的部分第二参数信息或者全部第二参数信息。例如,第二参数信息包括但不限于应用程序运行时,在内存中实际使用的第二内存起始地、应用程序运行时在闪存中实际使用的运行地址,对此不作限定。
在应用中,上述加载器在获取到第二参数信息后,可将该第二参数信息分别存入微控制器的寄存器中。示例性的,若第二参数信息包括三个参数,则可分别将三个参数随机存入微控制器中的R0,R1,R2三个寄存器,并分别确定个寄存器存入的参数信息。而后,终端设备的应用程序在运行时,可通过该寄存器获取指定的参数进行处理。
S103、根据所述第一参数信息和所述第二参数信息,计算所述目标版本中脚本文件的目标元素在运行时的目标存储地址。
在应用中,上述脚本文件中的目标元素包括但不限于全局变量、全局函数等信息。其中,全局变量和全局函数均可被一个或多个脚本文件中的功能程序引用,以实现应用程序的相应功能。
在应用中,上述应用程序在终端设备内部的实际运行地址一般与应用程序在链接时,由链接器指定运行的链接地址相同,或者与应用程序存储在终端设备的存储地址相同。此时,可不用根据第一参数信息和第二参数信息计算目标版本中的脚本文件在运行时的目标存储地址。然而,实际情况中应用程序在终端设备内部的实际运行地址与应用程序在链接时,由链接器指定运行的链接地址不同,或者与应用程序存储在终端设备的存储地址不同。以至于在应用程序运行时,无法在对应的链接地址中正确找到相应的脚本文件。因此,需要通过应用程序运行时在内存中实际使用的第二内存起始地址,和应用程序链接时由链接器在内存中指定使用的第一内存起始地址,计算出应用程序在运行时的偏移值。而后根据偏移值采用相对寻址的方式完成对目标元素在运行时的目标存储地址的寻址。其中,上述计算的偏移值也可以作为第二参数信息,并保存在指定的寄存器中,由应用程序运行时从该寄存器中取出偏移值参与计算。
S104、运行所述目标存储地址中的所述脚本文件,以运行所述目标版本的应用程序。
在应用中,上述已说明脚本文件的目标元素包括但不限于全局变量、全局函数等信息,因此,可认为脚本文件包括但不限于全局函数代码,全局变量代码等。每个全局函数或全局变量在运行时,均有实际运行的运行地址。应用程序在运行时,在确定下一条要执行的指令后,均可通过上述S101-S103完成全局函数或全局变量的寻址。之后,可运行该目标存储地址中的全局函数或全局变量(目标元素),以运行目标版本的应用程序。
在本实施例中,通过从应用程序的多个版本中确定目标版本,以及目标版本中的第一参数信息,并获取加载器传递的应用程序的第二参数信息,计算目标版本中的脚本文件中目标元素在运行时的目标存储地址,使得应用程序在终端设备内部的实际运行地址即使与应用程序指定运行的链接地址不同时,也可计算出运行的脚本文件中目标元素的目标存储地址,进而在运行应用程序时,可实现应用程序运行的目标存储地址不受链接器指定的链接地址影响的效果,达到可在任意地址运行应用程序的目的。
请参照图2,在一具体实施例中,S101从应用程序的多个版本中确定目标版本,具体包括如下子步骤S201-S203,详述如下:
S201、通过终端设备中的所述加载器加载运行环境,并获取所述运行环境中预设存储位置下的所述多个版本的应用程序。
在应用中,上述S102已说明加载器用于引导操作***启动的程序,同时加载器还可加载应用程序的运行环境。其中,获取运行环境中预设存储位置下的多个版本应用程序可以理解为,在运行环境中存储空间的不同位置下,会存储多个版本的应用程序。在加载器启动应用程序时可直接在指定存储位置下获取应用程序的多个版本。
在应用中,上述加载的运行环境即为应用程序的存储环境,即可认为在应用程序运行时,整个应用程序的代码段(脚本文件)处于连续的存储介质中。因此,可实现应用程序的代码段(脚本文件)可直接在支持片上运行的闪存上运行,无需预先加载应用程序的部分代码段至片内存储区中运行。
然而,需要说明的是,目前为实现应用程序运行时的目标存储地址不受链接器指定的链接地址影响,达到可在任意地址运行应用程序的脚本文件的目的,通常采用分散加载的方式。即在应用程序运行时,将存储在片内存储区(内存)的部分运行代码加载到随机存储器(Random Access Memory,RAM)中进行运行。然后使用在RAM中运行应用程序的方式,实现应用程序运行时的目标存储地址不受链接器指定的链接地址影响。但是,上述方法会减少RAM中的存储空间,不利于大型应用程序的运行。因此,与本实施例可在任意地址运行应用程序的脚本文件的方式不一致。
S202、分别解析所述多个版本的应用程序的文件头信息,得到所述应用程序的多个版本信息。
S203、根据所述多个版本信息,从所述应用程序的多个版本中,确定所述目标版本。
在应用中,上述S101已说明如何解析应用程序的文件头信息,以及根据多个版本信息确定目标版本的,对此不在详细说明。
可以理解的是,上述版本信息包括但不限于版本号、设备名称、型号等信息,本实施例中,版本信息以版本号为例进行解释说明。若上述多个版本的版本号一致,则代表多个版本均处于未更新的状态,或代表多个版本均为最新版本。因此,可随机从多个版本中确定目标版本。然而,在确定目标版本并运行目标版本对应的应用程序后,若终端设备检测到应用程序存在更新,则终端设备可先对其余版本对应的应用程序进行更新。之后在其余版本更新完成后,检测当前运行的目标版本的应用程序处于空闲状态时,自动从多个更新后的其余版本中,随机启动新版本对应的应用程序进行运行,并对未更新的当前目标版本的应用程序进行更新。进而,可在不影响应用程序正常业务逻辑的情况下,实现对应用程序的更新,将业务的影响降低到最小。
在本实施例中,通过在终端设备中预存多个版本的应用程序,在启动应用程序时,可根据多个版本对应的版本信息,确定目标版本,并启动目标版本的应用程序进行运行,更新其余版本对应的应用程序,可在不影响应用程序正常业务逻辑的情况下实现应用程序更新将业务的影响降低到最小。
在其他实施例中,终端设备通常存储有多个应用程序,而每个应用程序的开发者在设计应用程序时,都需要确定相应的应用程序将会被存储在终端设备中的具体存储地址。若终端设备端内部该应用程序的具体存储地址发生变动,则已存储的应用程序在终端设备的实际目标存储地址,与链接器指定的链接地址不一致。终端设备内部的应用程序将会运行失败,需要重新进行编译安装应用程序。因此,需要应用程序的开发者根据不同的存储地址维护多套应用代码,并且做好应用代码与存储地址之间的一一对应关系,否则一旦出错,应用程序将全部瘫痪。然而,本实施例中,通过第一参数信息和第二参数信息,计算应用程序的脚本文件中目标元素在运行时的目标存储地址,使得应用程序在终端设备内部的实际运行地址即使与应用程序指定运行的链接地址不同时,也可计算出运行的脚本文件中目标元素的目标存储地址,进而在运行应用程序时,可实现应用程序运行的目标存储地址不受链接器指定的链接地址影响的效果,达到可在任意地址运行应用程序的目的。实现多应用环境中,应用功能开发和应用程序在终端设备中实际存储地址解绑定的效果,为在微控制器上运行多应用提供一种便捷的途径。
请参照图3,在一具体实施例中,所述脚本文件的目标元素包括全局偏移表,所述目标存储地址包括全局偏移表地址,所述第一参数信息包括所述目标版本的应用程序在链接时,由链接器指定存储在内存中的第一内存起始地址,和所述目标版本的应用程序中全局偏移表在链接后在内存中进行存储的第一内存地址,所述第二参数信息包括所述目标版本的应用程序运行时在内存中实际使用的第二内存起始地址;S103根据所述第一参数信息和所述第二参数信息,计算所述目标版本中脚本文件的目标元素在运行时的目标存储地址,具体包括如下子步骤S301-S303,详述如下:
S301、获取所述第一参数信息中的第一内存起始地址和第一内存地址,以及获取所述第二参数信息中的第二内存起始地址。
在应用中,上述全局偏移表(Global Offset Table,GOT)为elf文件在数据段里面建立的一个指向全局变量的指针数组。当有运行代码需要引用全局变量时,可以通过GOT表中记载的全局变量相对应的指针数组间接引用。因GOT表存储于数据段中,所以可在加载GOT表时修改全局变量相对应的指针数组。
在应用中,上述全局偏移表地址为终端设备存储全局偏移表的地址,其全局偏移表存储在内存中。可以理解的是,全局偏移表地址为全局偏移表在应用程序运行时,实际存储在内存中的地址。
S302、根据所述第一内存起始地址以及所述第二内存起始地址,计算所述目标版本的应用程序在运行时所述全局偏移表在所述内存中的第一偏移值。
在应用中,上述第一内存起始地址为应用程序在链接时,由链接器指定存储在内存中的应用链接地址(第一内存起始地址)。然而,加载器在启动应用程序时,可获取到应用程序运行时,在内存中实际使用的。若应用程序的应用链接地址与应用程序运行时实际使用的地址(第二内存起始地址)存在差别,则表明第一内存起始地址和第二内存起始地址存在差别。进而,可确定全局偏移表在内存中进行存储的第一内存地址也相应发生偏移。因此,为确定应用程序在运行时,全局偏移表在内存中的实际地址,需要先确定应用程序在运行时的第一偏移值。其中,上述第一偏移值的计算可以通过将第一内存起始地址与第二内存起始地址进行加减法处理。
S303、通过所述第一内存地址和所述第一偏移值,确定所述目标版本的应用程序在运行时,所述全局偏移表存储在所述内存中的全局偏移表地址。
在应用中,在确定第一内存地址和第一偏移值后,可在第一内存地址的基础上加上第一偏移值,即为全局偏移表存储在所述内存中的全局偏移表地址。进而,可实现在应用程序的链接地址和实际运行时使用的运行地址不同时,达到在终端设备中的任意地址运行编译好的应用程序的目的。即实现应用程序的应用链接地址和实际运行时使用的地址解绑定,即便应用链接地址和实际运行时使用的地址不同,也可做到在终端设备中任意地址中均可正常运行应用程序。
请参照图4,在一具体实施例中,所述脚本文件包括多个全局变量,所述目标存储地址还包括目标全局变量地址,所述全局偏移表中存储有所述多个全局变量的多个变量存储地址;在S303通过所述第一内存地址和所述第一偏移值,确定所述目标版本的应用程序在运行时,所述全局偏移表存储在所述内存中的第二目标存储地址之后,还包括如下步骤S401-S403,详述如下:
S401、获取所述多个全局变量在链接时,所述链接器分别为所述多个全局变量分配的第二内存地址。
在应用中,上述多个全局变量中,每个全局变量均可以是根据一个或多个全局函数进行创建,全局变量可以被应用程序中所有全局函数引用。每个全局变量在应用终端设备内均具有对应的变量存储地址。上述第二内存地址为链接器在链接上述全局变量时,为每个全局变量分配的链接地址,其与每个全局变量的实际进行存储的目标全局变量地址不一致。
S402、根据所述第二内存地址和所述第一偏移值,计算所述多个全局变量分别存储在所述内存中的多个变量存储地址。
在一般情况下,链接器为每个全局变量分配的第二内存地址,应用程序运行时,每个全局变量在内存中的存储位置应处于第二内存地址。然而,在实际情况中,若应用程序的链接地址与应用程序运行时实际使用的地址存在差别,则表明第一内存起始地址和第二内存起始地址存在差别,进而可确定每个全局变量在内存中进行存储的第二内存地址,也发生偏移。因此,为确定应用程序在运行时,全局变量在内存中的实际存储地址,需根据链接器为每个全局变量分配的第二内存地址,以及应用程序在运行时的第一偏移值进行加减法处理,应用程序运行时,每个全局变量在内存中的实际运行地址(变量存储地址)。
S403、在所述目标版本的应用程序运行时,从所述全局偏移表中的所述多个变量存储地址中确定目标全局变量地址。
在应用中,在确定每个全局变量的变量存储地址后,可对之前全局偏移表中的各个全局变量地址进行重定位,确保应用程序运行过程中可以准确获取到相应的全局变量进行处理。上述目标全局变量地址即为应用程序运行时,当前所需的全局变量即为目标全局变量。之后,可根据目标全局变量,在全局偏移表中查询目标全局变量对应的实际运行地址,即为目标全局变量地址。
请参照图5,在一具体实施例中,所述脚本文件的目标元素还包括多个全局函数,所述全局偏移表地址还包括目标函数运行地址,所述全局偏移表中存储有所述多个全局函数分别对应的多个函数运行地址,所述第一参数信息还包括所述目标版本的应用程序在链接时,由所述链接器在闪存中指定所述目标版本的应用程序运行时的第一运行地址,以及所述多个全局函数在链接时,所述链接器分别为所述多个全局函数分配的第二运行地址,所述第二参数信息还包括所述目标版本的应用程序运行时在闪存中实际使用的第三运行地址;在S303通过所述第一内存地址和所述第一偏移值,计算所述目标版本的应用程序在运行时,所述全局偏移表存储在内存中的全局偏移表地址之后,还包括如下步骤S501-S504,详述如下:
S501、获取所述第一参数信息中的第一运行地址和第二运行地址,以及获取所述第二参数信息中的第三运行地址。
在应用中,脚本文件通常包含全局变量以及全局函数,其中,全局函数可以被应用程序中的其他文件内的函数调用。示例性的,对于一个大型应用程序包括可实现多个功能对应的脚本文件,而全局函数可以被一个或多个脚本文件中的功能程序进行调用。另外,对于一个函数是否属于全局函数,可根据函数中是否已被static(静态函数)来定义。
在应用中,上述应用程序在链接时,链接器将会在闪存中指定应用程序运行时的第一运行地址,以及多个全局函数在链接时,链接器将会指定每个全局函数在闪存中的第二运行地址。其中,在正常情况下,链接器在闪存中为每个全局函数链接了第二运行地址后,在应用程序运行时,全局函数的实际运行地址应该为第二运行地址。同时,应用程序在链接时,链接器也指定了应用程序在闪存中的第一运行地址,即在正常情况下,应用程序在闪存中进行运行时,第一运行地址本应为实际运行地址。
然而,在本实施例中,因全局函数的链接地址(第二运行地址)与实际运行地址(第三运行地址)不同。为了能够在原存储位置(闪存)中运行应用程序,不用将需要运行的部分应用程序从闪存中加载到RAM进行运行,减少应用程序运行时在RAM的占用空间。因此,需要计算应用程序在闪存中运行时,每个全局函数在闪存中的实际运行地址(第三运行地址)。使应用程序在运行时,整个应用程序的代码段(全局函数)处于连续的存储介质(闪存)中,使测试人员在发现应用程序出现漏洞时,可直接在闪存中根据漏洞出现点,梳理当前运行代码段(全局函数)的上下文,便于对应用程序进行开发和调试。
需要说明的是,上述第一运行地址和第三运行地址均为链接器指定的链接地址,因此,链接器在指定链接地址后,可将该链接地址存储在目标版本的应用程序的头文件信息中。而上述第二运行地址为应用程序的实际运行地址,加载器在加载和启动目标版本的应用程序时,便可直接确定应用程序的实际运行地址。因此,第二运行地址可由加载器提供。
S502、根据所述第一运行地址和所述第三运行地址,计算所述目标版本的应用程序在运行时所述全局函数在闪存中的第二偏移值。
在应用中,与计算应用程序在运行时全局偏移表在内存中的第一偏移值类似,计算应用程序在运行时全局函数在闪存中的第二偏移值时,也需要根据全局函数在运行时,在闪存中的运行地址差值进行计算得到。具体的,第一运行地址为目标版本的应用程序在链接时,由链接器在闪存中指定目标版本的应用程序运行时的链接运行地址。第三运行地址为目标版本的应用程序运行时,在闪存中使用的实际运行地址。然而,实际运行地址与链接运行地址不一致,因此,可以计算实际运行地址与链接运行地址之间的差值,作为目标版本的应用程序在运行时全局函数在闪存中的第二偏移值。
S503、根据所述第二运行地址和所述第二偏移值,分别计算所述多个全局函数在运行时处于所述闪存中的多个函数运行地址;
S504、在所述目标版本的应用程序运行时,从所述全局偏移表中的所述多个函数运行地址中确定目标函数运行地址。
在应用中,在确定第二偏移值后,根据链接器为每个全局函数分别分配的链接地址(第二运行地址),可将链接地址与第二偏移值进行相加,即可得到每个全局函数在目标版本的应用程序运行时,实际在闪存中的运行地址。相应的,在得到每个全局函数的函数运行地址后,当前所需使用的全局函数即为目标全局函数。进而,可在全局偏移表中确定目标全局函数的目标函数运行地址。
请参照图6,在一具体实施例中,所述脚本文件的目标元素还包括中断向量表中的多个中断处理函数,所述第一参数信息还包括所述链接器生成所述中断向量表时,所述链接器为所述多个中断处理函数分别分配的多个第四运行地址;所述方法还包括如下步骤S601-S604,详述如下:
S601、当所述目标版本的应用程序运行时,在所述闪存中划分闪存区域作为存储所述多个中断处理函数的所述中断向量表。
在应用中,上述中断处理函数为可执行的脚本文件(中断服务程序),在执行中断服务程序时,即可实现中断服务功能。上述中断向量表中包含每个中断处理函数的中断函数运行地址。同样可以理解的是,链接器生成中断向量表时,链接器为每个中断处理函数分别分配的第四运行地址(链接地址),与目标版本的应用程序在运行时,每个中断处理函数在闪存中的中断函数运行地址(实际运行地址)不一致。
需要说明的是,获取中断向量表的运行地址的方式,与获取GOT表的全局偏移表地址的方式不同。当目标版本的应用程序运行时,终端设备可直接在闪存中划分闪存区域,作为中断向量表的运行地址。因此,中断向量表的地址不需要经过地址偏移计算。
S602、获取所述第一参数信息中的多个第四运行地址,并根据所述第二偏移值和所述多个第四运行地址,分别计算所述目标版本的应用程序运行时,所述多个中断处理函数在所述闪存中实际运行时的多个中断函数运行地址。
在应用中,计算每个中断函数运行地址的方式可参照上述S503中的描述内容。即根据第四运行地址与第二偏移地址进行相加,计算每个中断处理函数在闪存中实际运行时的中断函数运行地址。
S603、将所述多个中断函数运行地址及其对应的所述多个中断处理函数的关联信息存储至所述中断向量表。
S604、若所述目标版本的应用程序在运行过程中发生异常中断,则根据所述关联信息,从所述中断向量表包含的所述多个中断函数运行地址中,确定目标中断函数运行地址,并运行所述目标中断函数运行地址下的中断处理函数。
在应用中,上述S601已说明中断处理函数为可执行的脚本文件,在链接器对每个中断处理函数进行链接时,可存储每个中断处理函数与链接地址的关联关系至中断向量表中。之后,终端设备在运行目标版本的应用程序时,可根据计算得到的每个中断处理函数,在闪存中实际运行时的中断函数运行地址,替换链接地址。即可认为中断向量表中存储的为中断函数运行地址与中断处理函数的关联关系。
在应用中,上述目标版本的应用程序在运行过程中发生的异常中断,与应该使用的目标中断函数为开发人员在开发应用程序时进行设置。可认为在确定终端设备的异常后,可直接根据异常从多个中断处理函数中确定目标中断处理函数,进而确定目标中断处理函数对应的目标中断函数运行地址。之后,根据目标中断函数运行地址,运行目标中断函数运行地址下的中断处理函数,执行中断服务程序。
在应用中,上述应用程序运行的方法具体可以应用于终端设备中的微控制器中,其中,微控制器包括但不限于基于精简指令集计算(Reduced Instruction SetComputing,RISC)架构的微控制器,Cortex-M3微控制器等。本实施例中,上述微控制器可采用Cortex-M3微控制器,可利用Cortex-M3微控制器可重定位中断向量表的各中断处理函数的特性,完成对应用程序的中断向量表的各中断处理函数的重定位。需要说明的是,上述应用程序的运行方法,适用于任何具有对各中断处理函数进行重定位的特性的微控制器。
另外,一个应用程序在运行时,通常是从应用程序的入口函数处开始运行,且入口函数一般由链接器中的静态库(crt0)进行编译链接。然而,本实施例中,为了实现对目标版本中的脚本文件在运行时的目标存储地址的计算。在实际处理过程中,为确定应用程序的入口函数,本实施例中,需使用的是预先自定义的静态库(crt0.a),而不使用编译器自带的crt0对入口函数进行编译链接。进而,在应用程序编译产生应用程序文件时,可将本实施例中crt0.a提供的_start()函数链接至应用程序文件中。因此,使用本实施例提供的_start()函数作为应用程序的入口函数,使得应用程序在启动时,终端设备可确定应用程序的_start()函数,并可根据第一参数信息和第二参数信息,实现对应用程序脚本文件的重定位(数据段和代码段的重定位)。
其中,预先自定义的crt0.a中,可修改ctr0自带的默认编译参数。例如,在编译参数中增加-Wl,--emit-relocs-fPIC(要求编译器保留可执行文件中的所有重定位信息),-msingle-pic-base(告诉编译器产生与位置无关代码),其中,产生位置无关代码目的在于:使处理器在获取指令时,可相对于本条执行指令的相对地址去获取指令。实现指令代码无论存储在内存中的任一存储地址,都能正确获取。在链接参数中增加-nostdlib-nostartfiles–nodefaultlibs-Wl,-cref,-u,Reset_Handler-pie-Xlinker--defsym=STACK_SIZE=2048-Wl(使链接器在链接应用程序时,不使用编译器自带的标准库(crt0),而使用预先自定义的静态库(crt0.a))。
请参照图7,在一具体实施例中,所述第二参数信息还包括所述目标版本的应用程序的可用内存长度,所述方法还包括如下子步骤S701-S703,详述如下:
S701、获取所述终端设备中内存的内存剩余值。
在应用中,上述内存决定终端设备可同时运行的应用程序数量和应用程序大小。例如,A应用程序在终端设备的后台运行时占用400M内存,若内存只有1GB,则最多只能同时启动3个与A应用程序占用内存接近的应用程序。若内存超过内存总量,则终端设备将会明显卡顿。因此,在启动目标版本的应用程序时,需要先确定当前终端设备中内存的内存剩余值。
S702、若所述可用内存长度大于所述内存剩余值,则终止启动所述目标版本的应用程序。
S703、若所述可用内存长度小于或等于所述内存剩余值,则启动所述目标版本的应用程序。
在应用中,上述目标版本的应用程序的可用内存长度为,任一终端设备启动目标版本的应用程序时,目标版本的应用程序所需占用终端设备的内存量,其可由加载器在加载目标版本的应用程序时进行确定及获取。因此,在确定内存剩余值之后,则从加载器中获取应用程序的可用内存长度。进而,在可用内存长度大于内存剩余值时,表示终端设备若启动目标版本的应用程序,则会造成运行卡顿。在可用内存长度小于或等于内存剩余值时,表示终端设备可顺畅启动目标版本的应用程序。
在其他实施例中,因目标版本的应用程序在运行过程中,需要根据时间的先后顺序以及任务的优先级安排任务的执行顺序。例如,通过设置每个任务的任务时间,执行相应任务的功能。然而,在通常情况下,一个任务在执行过程中,通常会被其余任务(优先级高的任务)中断。而为确保在任务调用时,能正确的完成对被中断的任务的恢复,可先将被中断的任务的上一脚本文件的目标存储地址,与下一脚本文件的目标存储地址存储至堆栈中。当需再次启动被中断的任务时,可直接根据堆栈信息的两个目标存储地址,获取上一脚本文件信息和下一脚本文件信息填充运行环境,运行被中断的任务。
请参阅图8,图8是本申请实施例提供的一种应用程序运行装置的结构框图。本实施例中该终端设备包括的各单元用于执行图1至图7对应的实施例中的各步骤。具体请参阅图1至图7以及图1至图7所对应的实施例中的相关描述。为了便于说明,仅示出了与本实施例相关的部分。参见图8,应用程序运行装置100包括:确定模块110、第一获取模块120、计算模块130、和运行模块140,其中:
确定模块110,用于从应用程序的多个版本中确定目标版本,并确定所述目标版本中的第一参数信息。
第一获取模块120,用于获取加载器传递的所述应用程序的第二参数信息。
计算模块130,用于根据所述第一参数信息和所述第二参数信息,计算所述目标版本中脚本文件的目标元素在运行时的目标存储地址。
运行模块140,用于运行所述目标存储地址中所述脚本文件的目标元素,以运行所述目标版本的应用程序。
在一实施例中,确定模块110还用于:
通过终端设备中的所述加载器加载运行环境,并获取所述运行环境中预设存储位置下的所述多个版本的应用程序;
分别解析所述多个版本的应用程序的文件头信息,得到所述应用程序的多个版本信息;
根据所述多个版本信息,从所述应用程序的多个版本中,确定所述目标版本。
在一实施例中,所述脚本文件的目标元素包括全局偏移表,所述目标存储地址包括全局偏移表地址,所述第一参数信息包括所述目标版本的应用程序在链接时,由链接器指定存储在内存中的第一内存起始地址,和所述目标版本的应用程序中全局偏移表在链接后在内存中进行存储的第一内存地址,所述第二参数信息包括所述目标版本的应用程序运行时在内存中实际使用的第二内存起始地址;计算模块130还用于:
获取所述第一参数信息中的第一内存起始地址和第一内存地址,以及获取所述第二参数信息中的第二内存起始地址;
根据所述第一内存起始地址以及所述第二内存起始地址,计算所述目标版本的应用程序在运行时所述全局偏移表在所述内存中的第一偏移值;
通过所述第一内存地址和所述第一偏移值,确定所述目标版本的应用程序在运行时,所述全局偏移表存储在所述内存中的全局偏移表地址。
在一实施例中,所述脚本文件的目标元素包括多个全局变量,所述目标存储地址还包括目标全局变量地址,所述全局偏移表中存储有所述多个全局变量的多个变量存储地址;计算模块130还用于:
获取所述多个全局变量在链接时,所述链接器分别为所述多个全局变量分配的第二内存地址;
根据所述第二内存地址和所述第一偏移值,计算所述多个全局变量分别存储在所述内存中的多个变量存储地址;
在所述目标版本的应用程序运行时,从所述全局偏移表中的所述多个变量存储地址中确定目标全局变量地址。
在一实施例中,所述脚本文件的目标元素还包括多个全局函数,所述全局偏移表地址还包括目标函数运行地址,所述全局偏移表中存储有所述多个全局函数分别对应的多个函数运行地址,所述第一参数信息还包括所述目标版本的应用程序在链接时,由所述链接器在闪存中指定所述目标版本的应用程序运行时的第一运行地址,以及所述多个全局函数在链接时,所述链接器分别为所述多个全局函数分配的第二运行地址,所述第二参数信息还包括所述目标版本的应用程序运行时在闪存中实际使用的第三运行地址;计算模块130还用于:
获取所述第一参数信息中的第一运行地址和第二运行地址,以及获取所述第二参数信息中的第三运行地址;
根据所述第一运行地址和所述第三运行地址,计算所述目标版本的应用程序在运行时所述全局函数在闪存中的第二偏移值;
根据所述第二运行地址和所述第二偏移值,分别计算所述多个全局函数在运行时处于所述闪存中的多个函数运行地址;
在所述目标版本的应用程序运行时,从所述全局偏移表中的所述多个函数运行地址中确定目标函数运行地址。
在一实施例中,所述脚本文件的目标元素还包括中断向量表中的多个中断处理函数,所述第一参数信息还包括所述链接器生成所述中断向量表时,所述链接器为所述多个中断处理函数分别分配的多个第四运行地址;计算模块130还用于:
当所述目标版本的应用程序运行时,在所述闪存中划分闪存区域作为存储所述多个中断处理函数的所述中断向量表;
获取所述第一参数信息中的多个第四运行地址,并根据所述第二偏移值和所述多个第四运行地址,分别计算所述目标版本的应用程序运行时,所述多个中断处理函数在所述闪存中实际运行时的多个中断函数运行地址;
将所述多个中断函数运行地址及其对应的所述多个中断处理函数的关联信息存储至所述中断向量表;
若所述目标版本的应用程序在运行过程中发生异常中断,则根据所述关联信息,从所述中断向量表包含的所述多个中断函数运行地址中,确定目标中断函数运行地址,并运行所述目标中断函数运行地址下的中断处理函数。
在一实施例中,所述第二参数信息还包括所述目标版本的应用程序的可用内存长度,所述应用程序运行装置100还包括:
第二获取模块,用于获取所述终端设备中内存的内存剩余值。
终止模块,用于若所述可用内存长度大于所述内存剩余值,则终止启动所述目标版本的应用程序。
启动模块,用于若所述可用内存长度小于或等于所述内存剩余值,则启动所述目标版本的应用程序。
应当理解的是,图8示出的应用程序运行装置的结构框图中,各单元/模块用于执行图1至图7对应的实施例中的各步骤,而对于图1至图7对应的实施例中的各步骤已在上述实施例中进行详细解释,具体请参阅图1至图7以及图1至图7所对应的实施例中的相关描述,此处不再赘述。
图9是本申请另一实施例提供的一种终端设备的结构框图。如图9所示,该实施例的终端设备900包括:处理器910、存储器920以及存储在存储器920中并可在处理器910运行的计算机程序930,例如应用程序运行方法的程序。处理器910执行计算机程序930时实现上述各个应用程序运行方法各实施例中的步骤,例如图1所示的S101至S104。或者,处理器910执行计算机程序930时实现上述图8对应的实施例中各单元的功能,例如,图8所示的单元110至140的功能,具体请参阅图8对应的实施例中的相关描述。
示例性的,计算机程序930可以被分割成一个或多个单元,一个或者多个单元被存储在存储器920中,并由处理器910执行,以完成本申请。一个或多个单元可以是能够完成特定功能的一系列计算机程序指令段,该指令段用于描述计算机程序930在终端设备900中的执行过程。例如,计算机程序930可以被分割成确定单元、第一获取单元、计算单元和运行单元,各单元具体功能如上。
终端设备可包括,但不仅限于,处理器910、存储器920。本领域技术人员可以理解,图9仅仅是终端设备900的示例,并不构成对终端设备900的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件,例如终端设备还可以包括输入输出设备、网络接入设备、总线等。
所称处理器910可以是中央处理单元,还可以是其他通用处理器、数字信号处理器、专用集成电路、现成可编程门阵列或者其他可编程逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者是任何常规的处理器等。
存储器920可以是终端设备900的内部存储单元,例如终端设备900的硬盘或内存。存储器920也可以是终端设备900的外部存储设备,例如终端设备900上配备的插接式硬盘,智能存储卡,闪存卡等。进一步地,存储器920还可以既包括终端设备900的内部存储单元也包括外部存储设备。
以上实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的精神和范围,均应包含在本申请的保护范围之内。
Claims (9)
1.一种应用程序运行的方法,其特征在于,包括:
从应用程序的多个版本中确定目标版本,并确定所述目标版本中的第一参数信息;
获取加载器传递的所述应用程序的第二参数信息;
根据所述第一参数信息和所述第二参数信息,计算所述目标版本中脚本文件的目标元素在运行时的目标存储地址;所述脚本文件的目标元素包括全局偏移表,所述目标存储地址包括全局偏移表地址,所述第一参数信息包括所述目标版本的应用程序在链接时,由链接器指定存储在内存中的第一内存起始地址,和所述目标版本的应用程序中全局偏移表在链接后在内存中进行存储的第一内存地址,所述第二参数信息包括所述目标版本的应用程序运行时在内存中实际使用的第二内存起始地址;
运行所述目标存储地址中所述脚本文件的目标元素,以运行所述目标版本的应用程序;
所述根据所述第一参数信息和所述第二参数信息,计算所述目标版本的应用程序中脚本文件的目标元素在运行时的目标存储地址,包括:
获取所述第一参数信息中的第一内存起始地址和第一内存地址,以及获取所述第二参数信息中的第二内存起始地址;根据所述第一内存起始地址以及所述第二内存起始地址,计算所述目标版本的应用程序在运行时所述全局偏移表在所述内存中的第一偏移值;通过所述第一内存地址和所述第一偏移值,确定所述目标版本的应用程序在运行时,所述全局偏移表存储在所述内存中的全局偏移表地址。
2.如权利要求1所述的应用程序运行的方法,其特征在于,所述从应用程序的多个版本中确定目标版本,包括:
通过终端设备中的所述加载器加载运行环境,并获取所述运行环境中预设存储位置下的所述多个版本的应用程序;
分别解析所述多个版本的应用程序的文件头信息,得到所述应用程序的多个版本信息;
根据所述多个版本信息,从所述应用程序的多个版本中,确定所述目标版本。
3.如权利要求1所述的应用程序运行的方法,其特征在于,所述脚本文件的目标元素还包括多个全局变量,所述目标存储地址还包括目标全局变量地址,所述全局偏移表中存储有所述多个全局变量的多个变量存储地址;
在所述通过所述第一内存地址和所述第一偏移值,确定所述目标版本的应用程序在运行时,所述全局偏移表存储在所述内存中的第二目标存储地址之后,还包括:
获取所述多个全局变量在链接时,所述链接器分别为所述多个全局变量分配的第二内存地址;
根据所述第二内存地址和所述第一偏移值,计算所述多个全局变量分别存储在所述内存中的多个变量存储地址;
在所述目标版本的应用程序运行时,从所述全局偏移表中的所述多个变量存储地址中确定目标全局变量地址。
4.如权利要求1所述的应用程序运行的方法,其特征在于,所述脚本文件的目标元素还包括多个全局函数,所述全局偏移表地址还包括目标函数运行地址,所述全局偏移表中存储有所述多个全局函数分别对应的多个函数运行地址,所述第一参数信息还包括所述目标版本的应用程序在链接时,由所述链接器在闪存中指定所述目标版本的应用程序运行时的第一运行地址,以及所述多个全局函数在链接时,所述链接器分别为所述多个全局函数分配的第二运行地址,所述第二参数信息还包括所述目标版本的应用程序运行时在闪存中实际使用的第三运行地址;
在所述通过所述第一内存地址和所述第一偏移值,计算所述目标版本的应用程序在运行时,所述全局偏移表存储在内存中的全局偏移表地址之后,还包括:
获取所述第一参数信息中的第一运行地址和第二运行地址,以及获取所述第二参数信息中的第三运行地址;
根据所述第一运行地址和所述第三运行地址,计算所述目标版本的应用程序在运行时所述全局函数在闪存中的第二偏移值;
根据所述第二运行地址和所述第二偏移值,分别计算所述多个全局函数在运行时处于所述闪存中的多个函数运行地址;
在所述目标版本的应用程序运行时,从所述全局偏移表中的所述多个函数运行地址中确定目标函数运行地址。
5.如权利要求4所述的应用程序运行的方法,其特征在于,所述脚本文件的目标元素还包括中断向量表中的多个中断处理函数,所述第一参数信息还包括所述链接器生成所述中断向量表时,所述链接器为所述多个中断处理函数分别分配的多个第四运行地址;所述方法还包括:
当所述目标版本的应用程序运行时,在所述闪存中划分闪存区域作为存储所述多个中断处理函数的所述中断向量表;
获取所述第一参数信息中的多个第四运行地址,并根据所述第二偏移值和所述多个第四运行地址,分别计算所述目标版本的应用程序运行时,所述多个中断处理函数在所述闪存中实际运行时的多个中断函数运行地址;
将所述多个中断函数运行地址及其对应的所述多个中断处理函数的关联信息存储至所述中断向量表;
若所述目标版本的应用程序在运行过程中发生异常中断,则根据所述关联信息,从所述中断向量表包含的所述多个中断函数运行地址中,确定目标中断函数运行地址,并运行所述目标中断函数运行地址下的中断处理函数。
6.如权利要求1-5任一所述的应用程序运行的方法,其特征在于,所述第二参数信息还包括所述目标版本的应用程序的可用内存长度,所述方法还包括:
获取终端设备中内存的内存剩余值;
若所述可用内存长度大于所述内存剩余值,则终止启动所述目标版本的应用程序;
若所述可用内存长度小于或等于所述内存剩余值,则启动所述目标版本的应用程序。
7.一种应用程序运行装置,其特征在于,包括:
确定模块,用于从应用程序的多个版本中确定目标版本,并确定所述目标版本中的第一参数信息;
第一获取模块,用于获取加载器传递的所述应用程序的第二参数信息;
计算模块,用于根据所述第一参数信息和所述第二参数信息,计算所述目标版本中脚本文件的目标元素在运行时的目标存储地址;所述脚本文件的目标元素包括全局偏移表,所述目标存储地址包括全局偏移表地址,所述第一参数信息包括所述目标版本的应用程序在链接时,由链接器指定存储在内存中的第一内存起始地址,和所述目标版本的应用程序中全局偏移表在链接后在内存中进行存储的第一内存地址,所述第二参数信息包括所述目标版本的应用程序运行时在内存中实际使用的第二内存起始地址;
运行模块,用于运行所述目标存储地址中所述脚本文件的目标元素,以运行所述目标版本的应用程序;
所述计算模块还用于:
获取所述第一参数信息中的第一内存起始地址和第一内存地址,以及获取所述第二参数信息中的第二内存起始地址;根据所述第一内存起始地址以及所述第二内存起始地址,计算所述目标版本的应用程序在运行时所述全局偏移表在所述内存中的第一偏移值;通过所述第一内存地址和所述第一偏移值,确定所述目标版本的应用程序在运行时,所述全局偏移表存储在所述内存中的全局偏移表地址。
8.一种终端设备,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现如权利要求1至6任一项所述的方法。
9.一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至6任一项所述的方法。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010978033.9A CN112130926B (zh) | 2020-09-17 | 2020-09-17 | 应用程序运行的方法、装置、终端设备及存储介质 |
PCT/CN2021/106162 WO2022057418A1 (zh) | 2020-09-17 | 2021-07-14 | 应用程序运行的方法、装置、终端设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010978033.9A CN112130926B (zh) | 2020-09-17 | 2020-09-17 | 应用程序运行的方法、装置、终端设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112130926A CN112130926A (zh) | 2020-12-25 |
CN112130926B true CN112130926B (zh) | 2023-10-24 |
Family
ID=73846054
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010978033.9A Active CN112130926B (zh) | 2020-09-17 | 2020-09-17 | 应用程序运行的方法、装置、终端设备及存储介质 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN112130926B (zh) |
WO (1) | WO2022057418A1 (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112130926B (zh) * | 2020-09-17 | 2023-10-24 | 深圳市兆珑科技有限公司 | 应用程序运行的方法、装置、终端设备及存储介质 |
CN113849245B (zh) * | 2021-09-23 | 2023-09-12 | 武汉深之度科技有限公司 | 一种应用程序运行方法、计算设备及存储介质 |
CN116954717A (zh) * | 2022-04-15 | 2023-10-27 | 华为技术有限公司 | 一种预取函数段的方法以及网络设备 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102750167A (zh) * | 2012-06-01 | 2012-10-24 | 华为技术有限公司 | 应用程序启动方法、装置和计算机*** |
CN104281463A (zh) * | 2013-07-12 | 2015-01-14 | 中国航天科工集团第三研究院第八三五八研究所 | 一种可选择版本的dsp处理器程序加载方法 |
CN109408139A (zh) * | 2018-09-26 | 2019-03-01 | 平安普惠企业管理有限公司 | 应用程序的开启方法、装置、计算机设备及存储介质 |
CN111124550A (zh) * | 2020-03-26 | 2020-05-08 | 北京翼辉信息技术有限公司 | 一种程序动态加载方法、装置及存储介质 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP1293895A3 (en) * | 2001-09-14 | 2006-01-25 | Ricoh Company, Ltd. | Program execution apparatus, method for creating an executable program and address solution method |
US20150100952A1 (en) * | 2013-10-09 | 2015-04-09 | Sap Ag | Runtime Version Access Infrastructure |
US10528479B2 (en) * | 2017-06-02 | 2020-01-07 | Huawei Technologies Co., Ltd. | Global variable migration via virtual memory overlay technique for multi-version asynchronous dynamic software update |
CN109814939B (zh) * | 2017-11-20 | 2021-10-15 | 华为技术有限公司 | 一种动态加载方法、目标文件的制作方法及装置 |
CN112130926B (zh) * | 2020-09-17 | 2023-10-24 | 深圳市兆珑科技有限公司 | 应用程序运行的方法、装置、终端设备及存储介质 |
-
2020
- 2020-09-17 CN CN202010978033.9A patent/CN112130926B/zh active Active
-
2021
- 2021-07-14 WO PCT/CN2021/106162 patent/WO2022057418A1/zh active Application Filing
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102750167A (zh) * | 2012-06-01 | 2012-10-24 | 华为技术有限公司 | 应用程序启动方法、装置和计算机*** |
CN104281463A (zh) * | 2013-07-12 | 2015-01-14 | 中国航天科工集团第三研究院第八三五八研究所 | 一种可选择版本的dsp处理器程序加载方法 |
CN109408139A (zh) * | 2018-09-26 | 2019-03-01 | 平安普惠企业管理有限公司 | 应用程序的开启方法、装置、计算机设备及存储介质 |
CN111124550A (zh) * | 2020-03-26 | 2020-05-08 | 北京翼辉信息技术有限公司 | 一种程序动态加载方法、装置及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN112130926A (zh) | 2020-12-25 |
WO2022057418A1 (zh) | 2022-03-24 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112130926B (zh) | 应用程序运行的方法、装置、终端设备及存储介质 | |
JP7090657B2 (ja) | アプリケーションをアップグレードするための方法、装置、デバイスならびに記憶媒体 | |
CN109062617B (zh) | 一种支持多类型设备的平台的应用方法、移动终端 | |
EP3267308B1 (en) | Application loading method and device | |
US8762967B2 (en) | Program compiler, program installer, and program install method | |
CN108369520B (zh) | 保护基本输入/输出(bios)代码 | |
US20060190933A1 (en) | Method and apparatus for quickly developing an embedded operating system through utilizing an automated building framework | |
CN106796521B (zh) | 独立于产品发布的api版本控制 | |
CN111176722B (zh) | 第三方库的文件版本检测方法、装置及存储介质 | |
US6950962B2 (en) | Method and apparatus for kernel module testing | |
CN111767056A (zh) | 一种源码编译方法、可执行文件运行方法及终端设备 | |
US10496433B2 (en) | Modification of context saving functions | |
US10552135B1 (en) | Reducing a size of an application package | |
KR100640389B1 (ko) | Nand플래시 메모리를 구비한 장치에서 어플리케이션을실행하는 방법 및 그 장치 | |
CN113342376B (zh) | 一种针对物联网设备的操作***进行升级的方法及装置 | |
US20190065161A1 (en) | Supporting compiler variable instrumentation for uninitialized memory references | |
CN111258617B (zh) | 一种电子设备 | |
Lawall et al. | Tarantula: Killing driver bugs before they hatch | |
CN113031956A (zh) | 程序编译方法和装置以及程序运行方法和装置 | |
CN112379943A (zh) | Electron应用程序的插件应用方法及装置、存储介质 | |
CN112882753A (zh) | 程序运行方法及装置 | |
CN112579113A (zh) | 应用程序的升级方法、装置、存储介质及终端 | |
EP1678607B1 (en) | Mapping of dynamic link libraries in a computing device | |
CN115617318A (zh) | 一种对程序进行编译优化的方法和相关产品 | |
CN117873529A (zh) | 工业设备的程序更新方法、装置、设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
TA01 | Transfer of patent application right |
Effective date of registration: 20230721 Address after: 518000 Room 401, Building 3, Shenzhen Software Park, Maling Community, Yuehai Street, Nanshan District, Shenzhen City, Guangdong Province Applicant after: Shenzhen Zhaolong Technology Co.,Ltd. Address before: 401, 402, building 3, Shenzhen Software Park, Nanshan District, Shenzhen City, Guangdong Province Applicant before: PAX COMPUTER TECHNOLOGY (SHENZHEN) Co.,Ltd. |
|
TA01 | Transfer of patent application right | ||
GR01 | Patent grant | ||
GR01 | Patent grant |