CN114968282A - 一种异常处理执行的优化方法和系统 - Google Patents

一种异常处理执行的优化方法和系统 Download PDF

Info

Publication number
CN114968282A
CN114968282A CN202210549368.8A CN202210549368A CN114968282A CN 114968282 A CN114968282 A CN 114968282A CN 202210549368 A CN202210549368 A CN 202210549368A CN 114968282 A CN114968282 A CN 114968282A
Authority
CN
China
Prior art keywords
exception
exception handling
information table
package
stack
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.)
Pending
Application number
CN202210549368.8A
Other languages
English (en)
Inventor
石玉平
徐俊江
郑江东
王幼君
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing WatchSmart Technologies Co Ltd
Original Assignee
Beijing WatchSmart Technologies Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Beijing WatchSmart Technologies Co Ltd filed Critical Beijing WatchSmart Technologies Co Ltd
Priority to CN202210549368.8A priority Critical patent/CN114968282A/zh
Publication of CN114968282A publication Critical patent/CN114968282A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/60Software deployment
    • G06F8/61Installation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45533Hypervisors; Virtual machine monitors
    • G06F9/45558Hypervisor-specific management and integration aspects
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45533Hypervisors; Virtual machine monitors
    • G06F9/45558Hypervisor-specific management and integration aspects
    • G06F2009/45562Creating, deleting, cloning virtual machine instances
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45533Hypervisors; Virtual machine monitors
    • G06F9/45558Hypervisor-specific management and integration aspects
    • G06F2009/45575Starting, stopping, suspending or resuming virtual machine instances

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

本发明涉及一种异常处理执行的优化方法和系统,属于计算机软件的技术领域。本发明的方法中将程序包中编译的多个类文件转换为一个可加载执行文件,执行方法调用指令以执行可加载文件中的方法并判断每一方法是否有异常处理器,若有,则将方法中异常处理信息表的位置信息添加至栈帧对应的字段中,当虚拟机抛出异常时,根据当前方法的栈帧获取异常处理信息表的位置并对异常进行处理。采用本发明所述的方法,虚拟机实现异常处理功能时无需维护全局的异常处理信息表链接列表,可以提高程序包的安装和删除速度,并且可以提升虚拟机处理异常时的处理效率,从而提升虚拟机对程序包进行执行的执行性能。

Description

一种异常处理执行的优化方法和系统
技术领域
本发明属于计算机软件的技术领域,具体涉及一种异常处理执行的优化方法和系统,用于在资源受限的设备实现虚拟机的异常处理功能。
背景技术
在传统的Java程序中,一个类中的所有方法存储在一个称为类文件的数据结构中,每个方法可以有异常表而且每个方法的代码包括其异常处理表引用的异常处理器的代码,当创建一个类文件时,与方法相关的所有异常排列在一个异常处理表中。如果没有匹配的catch子句,当前方法存在无法捕获的异常,方法的调用者的异常状态被恢复,继续寻找匹配的异常处理器,重复上述步骤直到找到匹配的异常处理器进行异常处理,或者无匹配的异常处理器,虚拟机会停止执行。
传统的在资源受限装置内实现Java语言虚拟机,预先掩膜或者后安装包到虚拟机时,需要维护一个全局的异常处理信息表的链接列表,增加了后安装包的安装以及删除操作的复杂程度;当程序抛出异常时,虚拟机需要查询全局异常处理信息表链接列表,获取当前方法的异常处理器的位置信息,并执行找到匹配的异常处理器,当平台安装程序包较多时,会增加异常处理信息表的查询时间,从而增加程序的执行时间。因此,现有技术方法在资源受限装置内执行程序包对异常进行处理时存在处理时间较长的问题。
发明内容
针对现有技术中存在的缺陷,本发明的目的是提供一种异常处理执行的优化方法和系统。该方法和系统通过对方法中各组件的内容进行重新布局,对异常处理信息表中的程序包所定义的异常类采用类的内部表示方法,虚拟机执行方法并调用指令时,新建的栈帧通过增加方法的异常处理信息表的位置信息,以对异常处理过程进行优化,虚拟机实现异常处理功能时无需维护全局的异常处理信息表链接列表,可以提高程序包的安装和删除速度,并且可以提升虚拟机处理异常时的处理效率,从而提升虚拟机对程序包进行执行的执行性能。
为达到以上目的,本发明采用的技术方案是:一种异常处理执行的优化方法,包括以下步骤:
通过预置的转换程序将程序包中编译的多个类文件转换为一个可在资源受限装置安装执行的初始文件;所述程序包为待安装的程序安装包;所述初始文件中包括与异常有关的段及子段,所述与异常有关的段及子段包括动态绑定段、代码段、常量池子段、代码常量池索引位置子段;所述程序安装包定义的异常类采用动态绑定段的偏移表示;
通过执行方法调用指令以执行所述初始文件中的每一方法,并在执行过程中判断每一方法是否有异常处理器;方法调用时,创建的方法栈帧包括所述方法的异常处理信息表的位置信息;
若所述方法有异常处理器,将所述方法中异常处理信息表的位置信息添加至所述栈帧对应的字段中;
当虚拟机抛出异常时,根据当前所述方法的栈帧获取异常处理信息表的位置并对所述方法中的异常进行处理。
进一步的,所述动态绑定段,获取所述程序包定义的异常类的信息;所述异常类的信息表示为finally子句、本包定义的异常类和导入包的异常类,本包定义的异常类采用动态绑定段的偏移表示,导入包的异常类采用常量池索引的方式表示;
所述常量池子段,获取所述程序包中异常类的引用信息;所述常量池子段引用导入所述程序包中的异常类;
所述代码常量池索引位置子段,用于安装所述程序包时对常量池索引进行解析时使用;
获取所述程序包中所有类的方法组成所述代码段,每一所述方法均包括方法头、对应的字节码,以及可选的异常处理信息表。
进一步的,所述方法的字节码中包括正常执行的字节码,以及可选的异常处理器的字节码,每个方法包括:所述方法的方法头以及可选异常处理信息表,以及所述方法的字节码;
所述的方法头包括标记字段,所述标记字段指示所述方法中是否包括异常处理信息表。
进一步的,所述异常处理信息表包括一个指示异常入口项个数的字段以及异常处理信息表,所述根据当前所述方法的栈帧获取异常处理信息表的位置并对所述方法中的异常进行处理,包括:
执行抛出异常时,根据当前所述方法的栈帧获取异常处理信息表的位置;其中,所述异常处理信息表包括开始地址、长度、异常类信息以及异常处理器的偏移地址;
判断所述方法是否存在异常处理信息表;
读取异常处理信息表进行异常处理器的匹配处理,以对所述方法中的异常进行处理。
进一步的,所述通过执行方法调用指令以执行所述初始文件中的每一方法,并在执行过程中判断每一方法是否有异常处理器之后,还包括:
若所述方法没有异常处理器,将标识无异常的特殊值添加至所述帧栈对应的字段中;所述特殊值与有效的方法字段位置信息不相同。
一种异常处理执行的优化系统,包括以下装置:
初始文件获取装置,用于通过预置的转换程序将程序包中编译的多个类文件转换为一个可在资源受限装置安装执行的初始文件;所述程序包为待安装的程序安装包;所述初始文件中包括与异常有关的段及子段,所述与异常有关的段及子段包括动态绑定段、代码段、常量池子段、代码常量池索引位置子段;
异常处理器判断装置,用于通过执行方法调用指令以执行所述初始文件中的每一方法,并在执行过程中判断每一方法是否有异常处理器;方法调用时,创建的方法栈帧包括所述方法的异常处理信息表的位置信息;
位置信息添加装置,用于若所述方法有异常处理器,将所述方法中异常处理信息表的位置信息添加至所述栈帧对应的字段中;
异常处理装置,用于当虚拟机抛出异常时,根据当前所述方法的栈帧获取异常处理信息表的位置并对所述方法中的异常进行处理。
进一步的,所述动态绑定段,获取所述程序包定义的异常类的信息;所述异常类的信息表示为finally子句、本包定义的异常类和导入包的异常类,所述程序安装包定义的异常类采用动态绑定段的偏移表示,导入包的异常类采用常量池索引的方式表示;
所述常量池子段,获取所述程序包中异常类的引用信息;所述常量池子段引用导入所述程序包中的异常类;
所述代码常量池索引位置子段,用于安装所述程序包时对常量池索引进行解析时使用;
获取所述程序包中所有类的方法组成所述代码段,每一所述方法均包括方法头、对应的字节码,以及可选的异常处理信息表。
进一步的,所述方法的字节码中包括正常执行的字节码,以及可选的异常处理器的字节码,每个方法包括:所述方法的方法头以及可选异常处理信息表,以及所述方法的字节码;
所述的方法头包括标记字段,所述标记字段指示所述方法中是否包括异常处理信息表。
进一步的,所述异常处理信息表包括一个指示异常入口项个数的字段以及异常处理信息表,所述异常处理装置包括单元:
位置获取单元,用于执行抛出异常时,根据当前所述方法的栈帧获取异常处理信息表的位置;其中,所述异常处理信息表包括开始地址、长度、异常类信息以及异常处理器的偏移地址;
判断单元,用于判断所述方法是否存在异常处理信息表;
匹配处理单元,用于读取异常处理信息表进行异常处理器的匹配处理,以对所述方法中的异常进行处理。
进一步的,所述系统,还包括:
特殊值添加装置,用于若所述方法没有异常处理器,将标识无异常的特殊值添加至所述帧栈对应的字段中;所述特殊值与有效的方法字段位置信息不相同。
本发明的效果在于:采用本发明所述的方法,通过对方法中各组件的内容进行重新布局,对异常处理信息表中的程序包所定义的异常类采用类的内部表示方法,虚拟机执行方法并调用指令时,新建的栈帧通过增加方法的异常处理信息表的位置信息,以对异常处理过程进行优化,虚拟机实现异常处理功能时无需维护全局的异常处理信息表链接列表,可以提高程序包的安装和删除速度,并且可以提升虚拟机处理异常时的处理效率,从而提升虚拟机对程序包进行执行的执行性能。
附图说明
图1是本发明所述方法的流程图;
图2是本发明所述方法的应用场景示意图;
图3是本发明所述方法的另一应用场景示意图;
图4为本发明所述方法的另一子流程示意图;
图5是本发明所述系统的结构图。
具体实施方式
下面结合附图和具体实施方式对本发明作进一步描述。
本发明描述了一种异常处理执行的优化方法,该异常处理执行的优化方法应用于用户终端配置的虚拟机中,该异常处理执行的优化方法通过安装于用户终端中的应用软件进行执行,用户终端即是用于执行异常处理执行的优化方法以对程序包进行安装或删除的终端设备,用户终端的虚拟机在执行程序包的同时对程序包中的异常进行处理,用户终端可以是智能SE、安全MCU等资源受限装置。本发明属于计算机软件的技术领域,尤其涉及面向对象的计算机软件,具体涉及在资源受限的设备如智能SE中实现虚拟机的异常处理功能,下面对本申请实施例中所涉及的部分关键技术进行解释说明。
缩略语和关键术语定义如表1所示。
表1
Figure BDA0003654035070000061
Figure BDA0003654035070000071
Java语言编写的计算机程序的上下文中,异常处理器用来保护程序代码的一个特定集合,称为被保护代码块,当Java程序违反Java编程语言的语义约束时,Java虚拟机把这个错误作为一个异常通知该程序,Java使用try/catch语句块捕获异常,一个try语句包括一个try块,零个或多个catch子句以及可选择的finally子句,使用try将可能会出现异常的代码段包装起来,catch子句定义了一个异常处理器,在执行过程中,一旦出现异常,就会生成一个对应异常类的实例,依据此实例的类型,去catch中进行匹配;当try中异常实例匹配到某个catch时,进入catch中进行异常的处理,处理完成后,执行其后的代码。try-catch-finally结构可以嵌套。
异常处理的代码段如下所示:
try{
//程序代码
}catch(异常类型1异常的变量名1){
//程序代码
}catch(异常类型2异常的变量名2){
//程序代码
}finally{
//程序代码
}。
在传统的Java程序中,一个类中的所有方法(具体实施例中所阐述的与代码相关的方法均为代码中的方法)存储在一个称为类文件的数据结构中,每个方法可以有异常表而且每个方法的代码包括其异常处理表引用的异常处理器的代码,当创建一个类文件时,与方法相关的所有异常排列在一个异常处理表中。
如果没有匹配的catch子句,当前方法存在无法捕获的异常,方法的调用者的异常状态被恢复,继续寻找匹配的异常处理器,重复上述步骤直到找到匹配的异常处理器进行异常处理,或者无匹配的异常处理器,虚拟机会停止执行。
Java栈(Stack)以帧栈(Frame)为单位保存线程(资源受限装置实现的虚拟机通常不支持多线程)的运行状态,虚拟机直接对Java栈执行两种操作:以帧栈为单位的压栈或出栈;每当线程调用一个Java方法时,虚拟机都会在Java栈中压入一个新帧栈,这个新帧栈成为当前帧栈,执行这个方法时,使用这个帧栈存储参数、局部变量、中间运算结果(操作数栈)等数据。
Java方法有两种方式完成,一种是通过return返回的,称为正常返回;一种是通过抛出异常而异常中止的,不管以哪种方式返回,虚拟机都会将当前帧栈弹出然后释放掉,上一个方法的帧栈成为当前帧栈。
执行操作数栈指令的虚拟机的栈帧通常由三部分组成:局部变量区,操作数栈和帧栈数据区。其中,局部变量区,包含对应方法的参数和局部变量,编译器按声明的顺序把参数放入局部变量,参数this对于任何一个实例方法都是隐含加入的,用来表示该方法的对象本身。操作数栈,组织成一个以字长为单位的数组,通过栈操作(压栈和出栈)访问,虚拟机基于栈的方式运行,指令从操作数栈中取得操作数。帧栈数据区,保存调用方法状态信息,支持方法的返回,方法的异常处理表位置,防火墙信息等。执行寄存器指令的所述虚拟机的栈帧由寄存器区及帧栈数据区组成。
在安全芯片(包括智能SE、安全MCU等)领域中,支持动态下载应用的多应用芯片操作系统已经在金融、电信、交通等领域进行了广泛部署和使用。
虚拟机是由一种被处理器执行的软件应用程序或指令序列产生的抽象计算机,平台无关指用Python、Java、Kotlin等面向对象的高级编程语言编写的应用程序,可以在各种不同计算机平台上通过虚拟机来执行,虚拟机的指令序列是独立平台编码的一个或多个字节码代码流。
传统资源受限装置进行Java异常处理过程中,由于传统资源受限装置实现的虚拟机不能直接加载并运行Class文件,需要一个运行在PC端的转换程序将包中的多个Class文件转换为一个可在SE安装执行的文件格式,比如JavaCard的CAP文件,CAP包括类组件、方法组件等、常量池组件等,具体内容可参见JavaCard虚拟机规范。
转换程序对程序包中方法的处理,将包中所有类的所有方法的异常处理信息放在方法组件的第一部分,包中所有类的方法的字节码连接在一起,放到方法组件的第二部分。
虚拟机实现,建立全局异常处理信息表的链接列表,每个包的所有类的所有方法的异常处理信息在该包的方法组件中形成一个异常处理信息表,所有包的异常处理信息表链接在一起形成一个异常信息表链接列表,后安装的异常信息表放入链接列表的表头,全局指针指向链接列表的表头。
全局异常表的建立,转换程序将所有掩膜包的方法组件的异常处理信息表(如果存在)链接到异常处理信息表链接列表中;装置内部实现的包安装程序将包的方法组件的异常处理处理信息表(如果存在)链接到异常处理链接列表的表头。
栈帧,使用全局异常处理信息表链接列表,调用方法时新建的栈帧不需要记录方法的异常处理信息表的位置信息,从而可以减少栈帧对RAM的需求,尤其是当方法调用的深度比较大时效果较明显。
运行时异常处理,抛出异常时,由于栈帧未记录方法的异常处理信息表的位置信息,需要依据程序计数器以及异常类的实例查询全局异常处理信息表链接列表,确定方法是否有异常处理器可捕获抛出的异常,如果存在,控制转移到异常处理器执行,如果当前方法无异常处理器,虚拟机将弹出当前栈帧并恢复前一个,即调用方法的栈帧,使用程序计数器以及异常类的实例查询全局异常处理信息表链接列表,确定是否有异常处理器,重复上述步骤直到找到异常处理器或者未找到异常处理器虚拟机停止执行。
如图1所示,本发明实施例公开了一种异常处理执行的优化方法,本发明的方法包括以下步骤:
S110、通过预置的转换程序将程序包中编译的多个类文件转换为一个可在资源受限装置安装执行的初始文件。
具体的,可通过预置的转换程序将程序包中的Java源码编译的多个Class文件转换为一个可在资源受限装置安装执行的初始文件,所述程序包为待安装的程序安装包;所述初始文件中包括与异常有关的段及子段,所述与异常有关的段及子段包括动态绑定段、代码段、常量池子段、代码常量池索引位置子段。
本发明技术方法在具体实现时需要一个运行在PC端的转换程序将包中的多个Java源码编译后的Class(或者适当修改后的Class)文件转换为一个可在SE安装执行的初始文件,也即初始文件的文件格式与SE中可执行的格式相同,比如天歌的TEF文件。所得到的初始文件的具体信息如图2所示,可执行文件200(初始文件)包含与异常处理有关的段和子段,具体包括动态绑定段201、代码段202、常量池子段203以及代码常量池索引位置子段204。
在一实施例中,动态绑定段201包括本包(安装包)定义的异常类的信息。所述动态绑定段,获取所述程序包定义的异常类的信息;所述异常类的信息表示为finally子句、本包定义的异常类和导入包的异常类,本包定义的异常类采用动态绑定段的偏移表示,导入包的异常类采用常量池索引的方式表示。通过最高位区分两类表示方法,通过特殊值0xFFF表示finally异常处理程序。
通过常量池子段204引用导入包中异常类。所述常量池子段,获取所述程序包中异常类的引用信息;所述常量池子段引用导入所述程序包中的异常类。
代码常量池索引位置子段204用于安装包时对常量池索引进行解析时使用。所述代码常量池索引位置子段,用于安装所述程序包时对常量池索引进行解析时使用。
代码段202也即是代码段,代码段中至少包括方法头及对应的字节码,将包中的所有类的所有方法组成一个代码段;字节码中至少包括正常执行的字节码。获取所述程序包中所有类的方法组成所述代码段,方法均包括方法头、对应的字节码,以及可选的异常处理信息表。
在一实施例中,所述方法的字节码中包括正常执行的字节码,以及可选的异常处理器的字节码,每个方法包括:所述方法的方法头以及可选异常处理信息表,以及所述方法的字节码;所述的方法头包括标记字段,所述标记字段指示所述方法中是否包括异常处理信息表。
可选的,代码段中还可以包括异常处理信息表,当代码段中包括异常处理信息表时,字节码中除了包括正常执行的字节码,还包括异常处理器的字节码,方法头中还包括一个标记字段,标记中一位(bit)可用来表示方法是否存在异常处理信息表。
在一实施例中,异常处理信息表包括一个指示异常入口项个数的字段以及异常处理信息表。其中,异常处理信息表包括开始地址、长度、异常类信息以及异常处理器的偏移地址。具体的,异常处理信息表包括一个指示异常入口项个数的字段以及异常处理信息表,异常处理信息表中多个包含异常处理信息入口206,通过获取异常处理信息入口206即可确定异常入口项个数,从而获取一个指示异常入口项个数的字段的具体数值。异常处理信息表205包括开始地址210、长度211、异常类信息212以及异常处理器的偏移地址213。异常类信息可以是类组件偏移或者常量池索引,通过最有意义的位进行区分。
例如,代码段中所包括的具体代码如下所示,该代码段内容中即包含各组件的具体布局,其中方法的指令集是基于寄存器指令类型,其他类似的内容布局、或者基于操作数栈的指令类型等都在本发明的覆盖范围。
Figure BDA0003654035070000121
Figure BDA0003654035070000131
标记字段可包含多个标志(flags),该标记字段的具体信息如表2所示。
表2
标志
ACC_EXTENDED 0x8
ACC_ABSTRACT 0x4
ACC_NATIVE 0x2
ACC_EXCEPTION 0x1
具体的,标志位ACC_EXCEPTION为1时,表示该方法有异常处理信息表,其后的handlerCount+8*handlerCount字节表示异常处理信息表,其中,handlerCount异常处理信息表的入口项的个数。
异常处理信息表所对应的代码段如下所示:
Figure BDA0003654035070000132
Figure BDA0003654035070000141
其中,startOffset表示try块的起始位置,该值为指令相对于方法组件的偏移;workLength表示try块的长度,以字节为单位;handlerOffset表示异常处理指令所在的位置,该指令在Method组件的偏移;catchTypeIndexOrOffset(b15b14……b1b0)表示异常类的常量池索引或者是类组件的偏移,如果catchTypeIndex值为0xFFFF,则表示这个异常处理块是finally模块。否则这个异常处理块捕捉catchTypeIndex所指定类型的异常。最高位(b15)为1,表示本包定义的内部类,其余位表示该类在类组件的偏移,最高位(b15)为0,表示导入包定义的类,其余位表示常量池组件的索引,常量池该索引位置指向指定导入包的指定异常类。本包定义的内部类采用内部表示(不通过常量池间索引接引用),减少了常量池子段以及代码常量池索引位置子段的大小,包安装时减少了常量池索引解析的操作处理,从而提高包的安装速度。
S120、通过执行方法调用指令以执行所述初始文件中的每一方法,并在执行过程中判断每一方法是否有异常处理器;方法调用时,创建的方法帧栈包括所述方法的异常处理信息表的位置信息。
通过执行方法调用指令以执行所述初始文件中的每一方法,并在执行过程中判断每一方法是否有异常处理器;方法调用时,创建的方法帧栈包括所述方法的异常处理信息表的位置信息,其中,特殊值0xFFF表示该方法无异常处理程序。
在本申请实施例中,虚拟机异常处理功能的实现以下文中基于寄存器指令类型的虚拟机实现说明,基于操作数栈的指令虚拟机实现方式类似。
虚拟机对方法调用的具体实现过程如图3所示,图3中示意了本发明方法的调用栈以及每个栈帧内容的示意性结构。执行寄存器指令的虚拟机300的栈帧310由两部分组成:寄存器区311和帧栈数据区312。其中,寄存器区311,组织成一个以字长为单位的寄存器组,包含对应方法的参数和局部变量,编译器按声明的顺序把参数放入局部变量,参数this对于任何一个实例方法都是隐含加入的,用来表示该方法的对象本身;帧栈数据区312,保存调用方法状态信息,返回位置322(支持方法的返回),方法的异常处理信息表位置321,应用的防火墙信息等。
方法的异常处理信息表位置321,可以用2字节无符号short类型整数表示,如果方法无异常处理器,其值可为0xFFFF,如果方法有异常处理器,为该方法的异常处理信息表在方法组件的偏移。
执行方法调用指令时,分析指定方法的方法头信息,由于方法头中包含标记字段,通过分析标记字段可以很容易获取方法是否有异常处理器。
步骤S120之后还包括:若所述方法没有异常处理器,将标识无异常的特殊值添加至所述帧栈对应的字段中;所述特殊值与有效的方法字段位置信息不相同。
如果不存在所述异常处理信息表,将标识无异常的特殊值添加至所述帧栈对应的字段中;所述特殊值可以和有效的方法字段位置信息明显区别,比如实施例中特殊值0xFFFF。
S130、若所述方法有异常处理器,将所述方法中异常处理信息表的位置信息添加至所述栈帧对应的字段中。
若方法中有异常处理器,可直接获取异常处理信息表的位置,将该位置信息添加到栈帧对应字段中。若方法中没有异常处理器,也即方法中没有需进行处理的异常信息,则直接对方法中可正常执行的字节码进行执行。
S140、当虚拟机抛出异常时,根据当前所述方法的栈帧获取异常处理信息表的位置并对所述方法中的异常进行处理。
当异常被抛出时,虚拟机通过当前方法的栈帧,获取异常处理信息表的位置,并根据异常处理信息表的位置对异常进行处理。
在一实施例中,如图4所示,步骤S140包括子步骤S141、S142和S143。
S141、执行抛出异常时,根据当前所述方法的栈帧获取异常处理信息表的位置;S142、判断所述方法是否存在异常处理信息表;S143、读取异常处理信息表进行异常处理器的匹配处理,以对所述方法中的异常进行处理。
虚拟机根据异常处理信息表的位置进行异常处理器的匹配操作,匹配操作在上述说明内容中有详细描述,此处不再详述。
虚拟机在执行上述方法过程中涉及系统的开销,系统的开销包括存储性能及执行性能。对于存储性能,若方法中涉及异常处理,则每个方法增加1个字节用于表示异常处理信息表的入口的个数,对可执行文件的大小影响非常小;对于执行性能,每次方法的调用,创建的Frame需要增加2个字节,考虑到资源受限装置编写的应用程序方法调用的嵌套深度有限,栈对RAM需求增加在可接受的程度。
此外,本发明具体实施例中采用Java编程语言进行说明,其他类似面向对象的编程语言中,若能够适用本发明的异常处理实现机制,也属于本发明覆盖的范围。
本发明中技术方法的有益效果主要体现在两个方面。
第一,对于安装性能,本发明通过对方法组件的内容进行重新布局,对异常处理信息表中的本包定义的异常类采用类的内部表示方法,虚拟机执行方法调用指令时新建栈帧,栈帧增加方法的异常处理信息表的位置信息,虚拟机实现异常处理功能时无需维护全局的异常处理信息表链接列表,可以提高包的安装和删除速度。
第二,对于执行性能,执行方法调用指令时,分析指定方法的方法头信息,可容易获取方法是否有异常处理器,如有可直接获取异常处理信息表的位置,将该位置信息添加到栈帧对应字段中;由于每个方法的异常处理信息表入口数较少,可以快速匹配异常处理信息表的入口;特殊值0xFFFF表示该方法无异常处理器,虚拟机可弹出该方法的栈帧,由调用方法继续处理异常;上述优化机制可提升异常处理器的匹配速度,从而提升应用的执行性能。
本实施例中,通过对方法中各组件的内容进行重新布局,对异常处理信息表中的程序包所定义的异常类采用类的内部表示方法,虚拟机执行方法并调用指令时,新建的栈帧通过增加方法的异常处理信息表的位置信息,以对异常处理过程进行优化,虚拟机实现异常处理功能时无需维护全局的异常处理信息表链接列表,可以提高程序包的安装和删除速度,并且可以提升虚拟机处理异常时的处理效率,从而提升虚拟机对程序包进行执行的执行性能。
如图5所示,一种异常处理执行的优化系统,该系统可配置于用户终端的虚拟机中,虚拟机执行异常处理执行的优化方法以对虚拟机执行程序安装包的异常处理过程进行优化,执行寄存器指令的所述虚拟机的栈帧由寄存器区及帧栈数据区组成,执行操作数栈指令的虚拟机的栈帧由局部变量区,操作数栈和帧栈数据区组成,所述帧栈数据区用于保存所调用方法的状态信息、方法的异常处理信息表位置,该系统用于执行前述的异常处理执行的优化方法的任一实施例,包括以下装置:初始文件获取装置110、异常处理器判断装置120、位置信息添加装置130和异常处理装置140。
初始文件获取装置110,用于通过预置的转换程序将程序包中编译的多个类文件转换为一个可在资源受限装置安装执行的初始文件;所述程序包为待安装的程序安装包;所述初始文件中包括与异常有关的段及子段,所述与异常有关的段及子段包括动态绑定段、代码段、常量池子段、代码常量池索引位置子段;所述程序安装包定义的异常类采用动态绑定段的偏移表示。
在一具体实施例中,所述动态绑定段,获取所述程序包定义的异常类的信息;所述异常类的信息表示为finally子句、本包定义的异常类和导入包的异常类,导入包的异常类采用常量池索引的方式表示;所述常量池子段,获取所述程序包中异常类的引用信息;所述常量池子段引用导入所述程序包中的异常类;所述代码常量池索引位置子段,用于安装所述程序包时对常量池索引进行解析时使用;获取所述程序包中所有类的方法组成所述代码段,每一所述方法均包括方法头、对应的字节码,以及可选的异常处理信息表。
在一具体实施例中,所述方法的字节码中包括正常执行的字节码,以及可选的异常处理器的字节码,每个方法包括:所述方法的方法头以及可选异常处理信息表,以及所述方法的字节码;所述的方法头包括标记字段,所述标记字段指示所述方法中是否包括异常处理信息表。
异常处理器判断装置120,用于通过执行方法调用指令以执行所述初始文件中的每一方法,并在执行过程中判断每一方法是否有异常处理器;方法调用时,创建的方法栈帧包括所述方法的异常处理信息表的位置信息。
位置信息添加装置130,用于若所述方法有异常处理器,将所述方法中异常处理信息表的位置信息添加至所述栈帧对应的字段中。
异常处理装置140,用于当虚拟机抛出异常时,根据当前所述方法的栈帧获取异常处理信息表的位置并对所述方法中的异常进行处理。
在一具体实施例中,所述异常处理信息表包括一个指示异常入口项个数的字段以及异常处理信息表,所述异常处理装置140包括单元:位置获取单元,用于执行抛出异常时,根据当前所述方法的栈帧获取异常处理信息表的位置;其中,所述异常处理信息表包括开始地址、长度、异常类信息以及异常处理器的偏移地址;判断单元,用于判断所述方法是否存在异常处理信息表;匹配处理单元,用于读取异常处理信息表进行异常处理器的匹配处理,以对所述方法中的异常进行处理。
在一具体实施例中,所述系统还包括:特殊值添加装置,用于若所述方法没有异常处理器,将标识无异常的特殊值添加至所述帧栈对应的字段中;所述特殊值与有效的方法字段位置信息不相同。
本实施例中,通过对方法中各组件的内容进行重新布局,对异常处理信息表中的程序包所定义的异常类采用类的内部表示方法,虚拟机执行方法并调用指令时,新建的栈帧通过增加方法的异常处理信息表的位置信息,以对异常处理过程进行优化,虚拟机实现异常处理功能时无需维护全局的异常处理信息表链接列表,可以提高程序包的安装和删除速度,并且可以提升虚拟机处理异常时的处理效率,从而提升虚拟机对程序包进行执行的执行性能。
本领域技术人员应该明白,本发明所述的方法和系统并不限于具体实施方式中所述的实施例,上面的具体描述只是为了解释本发明的目的,并非用于限制本发明。本领域技术人员根据本发明的技术方案得出其他的实施方式,同样属于本发明的技术创新范围,本发明的保护范围由权利要求及其等同物限定。

Claims (10)

1.一种异常处理执行的优化方法,其特征在于,所述方法应用于虚拟机中,所述方法用于对虚拟机执行程序安装包的异常处理过程进行优化,执行寄存器指令的所述虚拟机的栈帧由寄存器区及帧栈数据区组成,执行操作数栈指令的虚拟机的栈帧由局部变量区,操作数栈和帧栈数据区组成,所述帧栈数据区用于保存所调用方法的状态信息、方法的异常处理信息表位置,所述方法包括以下步骤:
通过预置的转换程序将程序包中编译的多个类文件转换为一个可在资源受限装置安装执行的初始文件;所述程序包为待安装的程序安装包;所述初始文件中包括与异常有关的段及子段,所述与异常有关的段及子段包括动态绑定段、代码段、常量池子段、代码常量池索引位置子段;
通过执行方法调用指令以执行所述初始文件中的每一方法,并在执行过程中判断每一方法是否有异常处理器;方法调用时,创建的方法栈帧包括所述方法的异常处理信息表的位置信息;
若所述方法有异常处理器,将所述方法中异常处理信息表的位置信息添加至所述栈帧对应的字段中;
当虚拟机抛出异常时,根据当前所述方法的栈帧获取异常处理信息,如果存在,通过获取的异常处理信息表的位置读取异常处理信息表,并对所述方法中的异常进行处理。
2.如权利要求1所述的一种异常处理执行的优化方法,其特征在于;
所述动态绑定段,获取所述程序包定义的异常处理类的信息;所述异常类的信息表示为finally子句、本包定义的异常类和导入包的异常类,本包定义的异常类采用动态绑定段的偏移表示,导入包的异常类采用常量池索引的方式表示;
所述常量池子段,获取所述程序包中异常类的引用信息;所述常量池子段引用导入所述程序包中的异常类;
所述代码常量池索引位置子段,用于安装所述程序包时对常量池索引进行解析时使用;
获取所述程序包中所有类的方法组成所述代码段,每一所述方法均包括方法头、可选的异常处理信息表,以及对应的字节码。
3.如权利要求2所述的一种异常处理执行的优化方法,其特征在于,所述方法的字节码中包括正常执行的字节码,以及可选的异常处理器的字节码,每个方法包括:所述方法的方法头以及可选异常处理信息表,以及所述方法的字节码;
所述的方法头包括标记字段,所述标记字段指示所述方法中是否包括异常处理信息表。
4.如权利要求3所述的一种异常处理执行的优化方法,其特征在于,所述异常处理信息表包括一个指示异常入口项个数的字段以及异常处理信息表,所述根据当前所述方法的栈帧获取异常处理信息表的位置并对所述方法中的异常进行处理,包括:
执行抛出异常时,根据当前所述方法的栈帧获取异常处理信息表的位置;其中,所述异常处理信息表包括开始地址、长度、异常类信息以及异常处理器的偏移地址;
判断所述方法是否存在异常处理信息表;
读取异常处理信息表进行异常处理器的匹配处理,以对所述方法中的异常进行处理。
5.如权利要求1所述的一种异常处理执行的优化方法,其特征在于,所述通过执行方法调用指令以执行所述初始文件中的每一方法,并在执行过程中判断每一方法是否有异常处理器之后,还包括:
若所述方法没有异常处理器,将标识无异常的特殊值添加至所述帧栈对应的字段中;所述特殊值与有效的方法字段位置信息不相同。
6.一种异常处理执行的优化系统,其特征在于,所述系统配置于虚拟机中,所述虚拟机执行异常处理执行的优化方法以对虚拟机执行程序安装包的异常处理过程进行优化,执行寄存器指令的所述虚拟机的栈帧由寄存器区及帧栈数据区组成,执行操作数栈指令的虚拟机的栈帧由局部变量区,操作数栈和帧栈数据区组成,所述帧栈数据区用于保存所调用方法的状态信息、方法的异常处理信息表位置,所述系统包括以下装置:
初始文件获取装置,用于通过预置的转换程序将程序包中编译的多个类文件转换为一个可在资源受限装置安装执行的初始文件;所述程序包为待安装的程序安装包;所述初始文件中包括与异常有关的段及子段,所述与异常有关的段及子段包括动态绑定段、代码段、常量池子段、代码常量池索引位置子段;
异常处理器判断装置,用于通过执行方法调用指令以执行所述初始文件中的每一方法,并在执行过程中判断每一方法是否有异常处理器;方法调用时,创建的方法栈帧包括所述方法的异常处理信息表的位置信息;
位置信息添加装置,用于若所述方法有异常处理器,将所述方法中异常处理信息表的位置信息添加至所述栈帧对应的字段中;
异常处理装置,用于当虚拟机抛出异常时,根据当前所述方法的栈帧获取异常处理信息表的位置并对所述方法中的异常进行处理。
7.如权利要求6所述的一种异常处理执行的优化系统,其特征在于;
所述动态绑定段,获取所述程序包定义的异常类的信息;所述异常类的信息表示为finally子句、本包定义的异常类和导入包的异常类,所述程序安装包定义的异常类采用动态绑定段的偏移表示,导入包的异常类采用常量池索引的方式表示;
所述常量池子段,获取所述程序包中异常类的引用信息;所述常量池子段引用导入所述程序包中的异常类;
所述代码常量池索引位置子段,用于安装所述程序包时对常量池索引进行解析时使用;
获取所述程序包中所有类的方法组成所述代码段,每一所述方法均包括方法头、对应的字节码,以及可选的异常处理信息表。
8.如权利要求7所述的一种异常处理执行的优化系统,其特征在于,所述方法的字节码中包括正常执行的字节码,以及可选的异常处理器的字节码,每个方法包括:所述方法的方法头以及可选异常处理信息表,以及所述方法的字节码;
所述的方法头包括标记字段,所述标记字段指示所述方法中是否包括异常处理信息表。
9.如权利要求8所述的一种异常处理执行的优化系统,其特征在于,所述异常处理信息表包括一个指示异常入口项个数的字段以及异常处理信息表,所述异常处理装置包括单元:
位置获取单元,用于执行抛出异常时,根据当前所述方法的栈帧获取异常处理信息表的位置;其中,所述异常处理信息表包括开始地址、长度、异常类信息以及异常处理器的偏移地址;
判断单元,用于判断所述方法是否存在异常处理信息表;
匹配处理单元,用于读取异常处理信息表进行异常处理器的匹配处理,以对所述方法中的异常进行处理。
10.如权利要求6所述的一种异常处理执行的优化系统,其特征在于,所述系统,还包括:
特殊值添加装置,用于若所述方法没有异常处理器,将标识无异常的特殊值添加至所述帧栈对应的字段中;所述特殊值与有效的方法字段位置信息不相同。
CN202210549368.8A 2022-05-20 2022-05-20 一种异常处理执行的优化方法和系统 Pending CN114968282A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202210549368.8A CN114968282A (zh) 2022-05-20 2022-05-20 一种异常处理执行的优化方法和系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210549368.8A CN114968282A (zh) 2022-05-20 2022-05-20 一种异常处理执行的优化方法和系统

Publications (1)

Publication Number Publication Date
CN114968282A true CN114968282A (zh) 2022-08-30

Family

ID=82985993

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210549368.8A Pending CN114968282A (zh) 2022-05-20 2022-05-20 一种异常处理执行的优化方法和系统

Country Status (1)

Country Link
CN (1) CN114968282A (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117033064A (zh) * 2023-10-10 2023-11-10 北京中电华大电子设计有限责任公司 一种代码异常处理的方法及装置
CN117056906A (zh) * 2023-07-27 2023-11-14 北京握奇数据股份有限公司 一种指令访问控制方法、系统、存储介质及设备

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1359491A (zh) * 1999-02-02 2002-07-17 太阳微系统公司 用于资源受限装置的面向对象的指令集
CN1534465A (zh) * 1999-02-02 2004-10-06 ̫��΢ϵͳ���޹�˾ 零开销异常处理
CN102819435A (zh) * 2012-07-26 2012-12-12 复旦大学 一种Java虚拟机的位置无关代码生成方法
DE102018127317B3 (de) * 2018-11-01 2020-04-09 Infineon Technologies Ag Verfahren und vorrichtungen zur computerimplementierten erzeugung eines ausführbaren programmcodes und zur ausführung eines ausführbaren programmcodes
CN111880806A (zh) * 2020-07-23 2020-11-03 深圳融卡智能科技有限公司 应用执行方法与应用执行系统

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1359491A (zh) * 1999-02-02 2002-07-17 太阳微系统公司 用于资源受限装置的面向对象的指令集
CN1534465A (zh) * 1999-02-02 2004-10-06 ̫��΢ϵͳ���޹�˾ 零开销异常处理
CN102819435A (zh) * 2012-07-26 2012-12-12 复旦大学 一种Java虚拟机的位置无关代码生成方法
DE102018127317B3 (de) * 2018-11-01 2020-04-09 Infineon Technologies Ag Verfahren und vorrichtungen zur computerimplementierten erzeugung eines ausführbaren programmcodes und zur ausführung eines ausführbaren programmcodes
CN111880806A (zh) * 2020-07-23 2020-11-03 深圳融卡智能科技有限公司 应用执行方法与应用执行系统

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117056906A (zh) * 2023-07-27 2023-11-14 北京握奇数据股份有限公司 一种指令访问控制方法、系统、存储介质及设备
CN117056906B (zh) * 2023-07-27 2024-03-29 北京握奇数据股份有限公司 一种指令访问控制方法、系统、存储介质及设备
CN117033064A (zh) * 2023-10-10 2023-11-10 北京中电华大电子设计有限责任公司 一种代码异常处理的方法及装置

Similar Documents

Publication Publication Date Title
KR100713738B1 (ko) 제로 오버헤드 예외 처리
US5748963A (en) Adaptive binding
CN114968282A (zh) 一种异常处理执行的优化方法和系统
US6446254B1 (en) Packaging memory image files
US8020154B2 (en) Precise handling of exceptions during program code conversion
EP0528028B1 (en) Automatic flowgraph generation for program analysis and translation
US6637025B1 (en) Dynamic selection/definition of which class/methods should or should not be jit'ed using information stored in a jar file
CN111381938B (zh) 一种基于基础指令集执行区块链中智能合约的方法及系统
US6363522B1 (en) Method and apparatus for handling exceptions as normal control flow
CN1690957A (zh) 通过安全虚拟机器实施安全政策的方法和系统
US8042103B2 (en) Pre-translated files used in a virtual machine
CN110471832B (zh) 程序运行的处理方法、装置及计算机可读存储介质
US6804681B2 (en) Identifying and tracking object references in a java programming environment
CN113176926A (zh) 一种基于虚拟机自省技术的api动态监控方法及系统
US6732355B1 (en) Method and device for generating registration data at compilation to enable trace of stack
US20060277552A1 (en) Facilitating handling of exceptions in a program implementing a M-on-N threading model
US20060282820A1 (en) COBOL syntax for native XML file parsing and file generation
US7065747B2 (en) Identifying references to objects during bytecode verification
CN114625646A (zh) 一种检测系统内存越界的方法和装置
US6934726B2 (en) Storing and retrieving of field descriptors in Java computing environments
US9342319B1 (en) Accelerated class check
CN115037735A (zh) 一种基于短名称的链接方法和系统
CN117667738A (zh) 用于WebAssembly模块异常处理的方法、装置和电子设备
Morrison et al. Processbase abstract machine manual (version 2.0. 6)
CN113296834A (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