CN103559073A - 一种基于Java卡的数据管理方法 - Google Patents

一种基于Java卡的数据管理方法 Download PDF

Info

Publication number
CN103559073A
CN103559073A CN201310515600.7A CN201310515600A CN103559073A CN 103559073 A CN103559073 A CN 103559073A CN 201310515600 A CN201310515600 A CN 201310515600A CN 103559073 A CN103559073 A CN 103559073A
Authority
CN
China
Prior art keywords
data
virtual machine
address
java card
type information
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.)
Granted
Application number
CN201310515600.7A
Other languages
English (en)
Other versions
CN103559073B (zh
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.)
Feitian Technologies Co Ltd
Original Assignee
Feitian 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 Feitian Technologies Co Ltd filed Critical Feitian Technologies Co Ltd
Priority to CN201310515600.7A priority Critical patent/CN103559073B/zh
Publication of CN103559073A publication Critical patent/CN103559073A/zh
Application granted granted Critical
Publication of CN103559073B publication Critical patent/CN103559073B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Devices For Executing Special Programs (AREA)
  • Debugging And Monitoring (AREA)
  • Stored Programmes (AREA)

Abstract

本发明公开一种基于Java卡的数据管理方法,包括:当Java卡虚拟机接收到包含有偏移地址组件的指令时,根据偏移地址组件、方法组件、常量池组件获取预设长度的数据;若该数据中第一预设位置上的数据为第一预设值时,根据该数据得到被管理数据的偏移地址,用被管理数据的偏移地址替换方法组件中的管理指令中的卡外偏移地址;在Java卡虚拟机解释执行应用的Java程序的过程中,当检测到调用静态方法指令时,从管理指令中提取被调用的静态数据基于第一(或第二)存储区的偏移地址,根据第一(或第二)存储区的基地址和被调用的静态数据的偏移地址计算被调用的静态数据的物理地址;将被调用的静态数据的物理地址存储到指令寄存器中。

Description

一种基于Java卡的数据管理方法
技术领域
本发明涉及数据管理领域,尤其涉及一种基于Java卡的数据管理方法。
背景技术
Java卡是一种可以运行Java程序的CPU智能卡。根据数据性质,Java卡中的数据可分为静态数据、动态数据和临时数据,静态数据如程序代码等,动态数据如对象及变量等;按照存储位置,Java卡中的数据可分为ROM数据,Flash/EEPROM数据、RAM数据。
在现有技术中,Java卡中的数据管理的方法也有多种,使用对象表管理是常用的一种方式,但是在访问数据之前首先要根据表偏移地址找到对象表,再从对象表中获取Java卡中数据的偏移地址,访问速度较慢。
发明内容
本发明的目的是为了克服现有技术的不足,提供一种基于Java卡的数据管理方法。
本发明提供了一种基于Java卡的数据管理方法,包括下载管理指令的过程和访问数据的过程;其中,所述下载管理指令的过程包括:
步骤S0:当Java卡虚拟机接收到主机下发的指令时,判断接收到的指令中是否包含有偏移地址组件,是则保存所述偏移地址组件,执行步骤S1,否则所述Java卡虚拟机等待接收主机下发指令,返回步骤S0;
步骤S1:所述Java卡虚拟机从所述偏移地址组件中获取第一偏移地址,根据所述第一偏移地址从保存的方法组件中获取第二偏移地址,根据所述第二偏移地址从保存的常量池组件中获取出预设长度的数据;
步骤S2:所述Java卡虚拟机判断所述获取到的数据中第一预设位置上的数据是否为第一预设值,是则执行步骤S3,否则所述Java卡虚拟机等待接收主机下发指令,返回步骤S1;
步骤S3:所述Java卡虚拟机判断所述获取到的数据中第二预设位置的最高位上的数据是否为第二预设值,是则执行步骤S4,否则执行步骤S6;
步骤S4:所述Java卡虚拟机根据所述获取到的数据中第二预设位置的除最高位之外的其他位上的数据,获取被管理数据信息所属的包的包ID,根据所述包ID从第二存储区中的包表中获取对应的导出表的地址;
步骤S5:所述Java卡虚拟机根据所述导出表的地址和所述获取到的数据中第三预设位置上的数据得到被管理数据的偏移地址,执行步骤S7;
步骤S6:所述Java卡虚拟机根据所述获取到的数据中第四预设位置上的数据和保存的被管理数据信息组件的起始地址得到所述被管理数据的偏移地址,执行步骤S7;
步骤S7:所述Java卡虚拟机用所述被管理数据的偏移地址替换所述方法组件中的管理指令中的卡外偏移地址;
所述访问数据的过程包括:
步骤P1:在所述Java卡虚拟机解释执行应用的Java程序的过程中,当检测到所述管理指令时,判断所述管理指令的类型是否为调用静态方法指令,是则执行步骤P2,否则所述Java卡虚拟机继续解释执行应用的其他Java程序,返回步骤P1;
步骤P2:所述Java卡虚拟机判断所述管理指令是否为调用第一存储区中的静态数据的调用静态方法指令,是则执行步骤P3,否则执行步骤P4;
步骤P3:所述Java卡虚拟机从所述管理指令中提取所述被调用的静态数据基于所述第一存储区的偏移地址,根据所述第一存储区的基地址和所述被调用的静态数据基于所述第一存储区的偏移地址计算所述被调用的静态数据的物理地址,执行步骤P5;
步骤P4:所述Java卡虚拟机从所述管理指令中提取所述被调用的静态数据基于所述第二存储区的偏移地址,根据所述第二存储区的基地址和所述被调用的静态数据基于所述第二存储区的偏移地址计算所述被调用的静态数据的物理地址,执行步骤P5;
步骤P5:所述Java卡虚拟机将所述被调用的静态数据的物理地址存储到指令寄存器中,所述Java卡虚拟机继续解释执行应用的其他Java程序,返回步骤P1。
进一步地,所述被管理数据为静态方法,所述被管理数据信息为被调用静态方法,所述被管理数据信息组件为方法组件,所述管理指令为调用静态方法指令;
所述步骤S5包括:
步骤S501:所述Java卡虚拟机判断所述包ID是否小于第三预设值,是则执行步骤S502,否则执行步骤S503;
步骤S502:所述Java卡虚拟机将所述方法组件中的调用第二存储区中的静态方法的调用静态方法指令更改为调用第一存储区中的静态方法的调用静态方法指令,执行步骤S503;
步骤S503:所述Java卡虚拟机根据所述导出表的地址和所述获取到的数据中第三预设位置上的数据,从所述导出表中获取所述静态方法的偏移地址,执行步骤S7;
所述步骤S6包括:
步骤S601:所述Java卡虚拟机根据所述获取到的数据中第四预设位置上的数据获取第三偏移地址;
步骤S602:所述Java卡虚拟机根据所述第三偏移地址和所述方法组件的起始地址得到所述静态方法的物理地址;
步骤S603:所述Java卡虚拟机根据所述静态方法的物理地址和所述第二存储区的基地址得到所述静态方法基于所述第二存储区的偏移地址,执行步骤S7。
进一步地,所述被管理数据为被创建对象的类型信息,所述被管理数据信息为被引用类型信息,所述被管理数据信息组件为类型信息组件,所述管理指令为创建对象指令;
所述步骤S5包括:
步骤S511:所述Java卡虚拟机判断所述包ID是否小于第三预设值,是则执行步骤S512,否则执行步骤S513;
步骤S512:所述Java卡虚拟机将所述方法组件中的被创建对象的类型信息在第二存储区中的创建对象指令更改为被创建对象的类型信息在第一存储区中的创建对象指令,执行步骤S513;
步骤S513:所述Java卡虚拟机根据所述导出表的地址和所述获取到的数据中第三预设位置上的数据,从所述导出表中获取所述被创建对象的类型信息的偏移地址,执行步骤S7;
所述步骤S6包括:
步骤S611:所述Java卡虚拟机根据所述获取到的数据中第四预设位置上的数据获取第三偏移地址;
步骤S612:所述Java卡虚拟机根据所述第三偏移地址和所述类型信息组件的起始地址得到所述被创建对象的类型信息的物理地址;
步骤S613:所述Java卡虚拟机根据所述被创建对象的类型信息的物理地址和所述第二存储区的基地址得到所被创建对象的类型信息基于所述第二存储区的偏移地址,执行步骤S7。
进一步地,上述方法还包括创建对象的过程,所述创建对象的过程包括:
步骤B1:在所述Java卡虚拟机解释执行应用的Java程序的过程中,当检测到创建对象指令时,从所述创建对象指令的参数中获取指令码和被创建对象的类型信息的偏移地址;
步骤B2:所述Java卡虚拟机根据所述指令码判断被创建对象的类型信息是否在所述第一存储区中,是则执行步骤B3,否则执行步骤B4;
步骤B3:所述Java卡虚拟机根据所述第一存储区的基地址和所述被创建对象的类型信息的偏移地址得到被创建对象的类型信息的物理地址,执行步骤B5;
步骤B4:所述Java卡虚拟机根据所述第二存储区的基地址和所述被创建对象的类型信息的偏移地址得到被创建对象的类型信息的物理地址,执行步骤B5;
步骤B5:所述Java卡虚拟机从所述被创建对象的类型信息的物理地址中获取对象实例域的长度,根据所述对象实例域的长度和所述第二存储区中的给对象分配空间的起始地址获得被创建对象的物理地址;
步骤B6:所述Java卡虚拟机判断所述第二存储区中是否有剩余空间,是则执行步骤B7,否则返回错误信息,结束;
步骤B7:所述Java卡虚拟机根据所述被创建对象的物理地址和所述第二存储区的基地址计算所述被创建对象的偏移地址,并将所述被创建对象的偏移地址存储到堆栈寄存器中,所述Java卡虚拟机继续解释执行应用的其他Java程序,返回步骤B1。
进一步地,所述访问数据过程还包括:
步骤C1:在所述Java卡虚拟机解释执行应用的Java程序的过程中,当检测到被访问对象的标识时,从所述堆栈寄存器中获取所述被访问对象的偏移地址;
步骤C2:所述Java卡虚拟机判断所述被访问对象的偏移地址的最低位是否为所述第二预设值,是则执行步骤C3,否则执行步骤C4;
步骤C3:所述Java卡虚拟机根据所述第一存储区的基地址和所述被访问对象的偏移地址得到被访问对象的物理地址,根据所述被访问对象的物理地址在所述第一存储区中访问对象;
步骤C4:所述Java卡虚拟机根据所述第二存储区的基地址和所述被访问对象的偏移地址得到被访问对象的物理地址,根据所述被访问对象的物理地址在所述第二存储区中访问对象。
进一步地,步骤B2具体为:所述Java卡虚拟机判断所述指令码是否为第二预设数据,是则所述被创建对象的类型信息在所述第一存储区中,执行步骤B3,否则被创建对象的类型信息在所述第二存储区中,执行步骤B4。
进一步地,所述步骤B5包括:
所述Java卡虚拟机将所述被创建对象的类型信息的物理地址的第4字节上的数据作为对象实例域的长度;
所述Java卡虚拟机用所述第二存储区中的给对象分配空间的起始地址加上被创建对象的对象头的长度加上所述对象实例域的长度作为被创建对象的物理地址。
进一步地,所述Java卡虚拟机根据所述被创建对象的物理地址和所述第二存储区的基地址计算所述被创建对象的偏移地址,具体为:用所述被创建对象的类型信息的物理地址减去所述第二存储区的基地址得到所述被创建对象的类型信息基于所述第二存储区的偏移地址;
所述Java卡虚拟机根据所述第一存储区的基地址和所述被访问对象的偏移地址得到被访问对象的物理地址,具体为:所述Java卡虚拟机用所述第一存储区的基地址加上所述被访问对象的偏移地址得到所述被访问对象的物理地址;
所述Java卡虚拟机根据所述第二存储区的基地址和所述被访问对象的偏移地址得到被访问对象的物理地址,具体为:所述Java卡虚拟机用所述第二存储区的基地址加上所述被访问对象的偏移地址得到所述被访问对象的物理地址。
进一步地,所述被管理数据为静态域,所述被管理数据信息为被引用类型信息,所述被管理数据信息组件为类型信息组件,所述管理指令为访问静态域指令;
所述步骤S5包括:所述Java卡虚拟机根据所述导出表的地址和所述获取到的数据中第三预设位置上的数据从所述导出表中获取所述静态域的偏移地址,执行步骤S7;
所述步骤S6包括:
步骤S621:所述Java卡虚拟机根据所述获取到的数据中第四预设位置上的数据获取被引用类型信息的偏移地址;
步骤S622:所述Java卡虚拟机根据所述被引用类型信息的偏移地址和所述类型信息组件的起始地址得到所述被引用类型信息的物理地址;
步骤S623:所述Java卡虚拟机根据所述被引用类型信息的物理地址和所述第二存储区的基地址得到所述静态域基于第二存储区的偏移地址,执行步骤S7。
进一步地,所述被管理数据为实例域,所述被管理数据信息为被引用类型信息,所述被管理数据信息组件为类型信息组件,所述管理指令为访问实例域指令;
所述步骤S5包括:
步骤S531:所述Java卡虚拟机根据所述导出表的地址和所述获取到的数据中第三预设位置上的数据,从所述导出表中获取所述被引用类型信息的偏移地址;
步骤S532:所述Java卡虚拟机判断所述包ID是否小于第三预设值,是则执行步骤S533,否则执行步骤S534;
步骤S533:所述Java卡虚拟机根据所述被引用类型信息的偏移地址和第一存储区的基地址得到被引用类型信息的物理地址,执行步骤S535;
步骤S534:所述Java卡虚拟机根据所述被引用类型信息的偏移地址和所述第二存储区的基地址得到被引用类型信息的物理地址,执行步骤S535;
步骤S535:所述Java卡虚拟机从所述被引用类型信息的物理地址的第1字节上获取标志值,判断所述标志值中低位端起第5位上的数据是否为1,是则执行步骤S536,否则执行步骤S537;
步骤S536:所述Java卡虚拟机从所述被引用类型信息的物理地址的第2和第3字节上获取数据,根据所述获取的数据和所述第一存储区的基地址得到父类的类型信息的物理地址,执行步骤S538;
步骤S537:所述Java卡虚拟机从所述被引用类型信息的物理地址的第2和第3字节上获取数据,根据所述获取的数据和所述第二存储区的基地址得到父类的类型信息的物理地址,执行步骤S538;
步骤S538:所述Java卡虚拟机从所述父类的类型信息的物理地址的第4字节上获取数据,从所述获取到的数据中的第4字节上获取数据,将获取的两个数据相加得到实例域的偏移地址,执行步骤S7;
所述步骤S6包括:
步骤S631:所述Java卡虚拟机根据所述获取到的数据中第四预设位置上的数据获取所述被引用类型信息的偏移地址,根据所述被引用类型信息的偏移地址和所述类型信息组件的起始地址得到所述被引用类型信息的物理地址;
步骤S632:所述Java卡虚拟机从所述被引用类型信息的物理地址的第1字节上获取标志值,判断所述标志值中低位端起第5位上的值是否为1,是则执行步骤S633,否则执行步骤S634;
步骤S633:所述Java卡虚拟机从所述被引用类型信息的物理地址的第2和第3字节上获取数据,根据所述获取的数据和所述第一存储区的基地址得到父类的类型信息的物理地址,执行步骤S635;
步骤S634:所述Java卡虚拟机从所述被引用类型信息的物理地址的第2和第3字节上获取数据,根据所述获取的数据和所述第二存储区的基地址得到父类的类型信息的物理地址,执行步骤S635;
步骤S635:所述Java卡虚拟机从所述父类的类型信息的物理地址的第4字节上获取数据,从所述获取到的数据中第4字节上获取数据,将获取的两个数据相加得到实例域的偏移地址,执行步骤S7。
进一步地,所述被管理数据为父方法,所述被管理数据信息为被引用类型信息,所述被管理数据信息组件为类型信息组件,所述管理指令为调用父方法指令;
所述步骤S5包括:
步骤S541:所述Java卡虚拟机判断所述包ID是否小于第三预设值,是则执行步骤S542,否则执行步骤S543;
步骤S542:所述Java卡虚拟机根据所述导出表的地址和所述获取到的数据中第三预设位置上的数据,从所述导出表中获取所述被引用类型信息的偏移地址,根据所述被引用类型信息的偏移地址和所述第一存储区的基地址得到所述被引用类型信息的物理地址;将所述方法组件中的调用第二存储区中的父方法的调用父方法指令更改为调用第一存储区中的父方法的调用父方法指令,执行步骤S544;
步骤S543:所述Java卡虚拟机根据所述导出表的地址和所述获取到的数据中第三预设位置上的数据,从所述导出表中获取所述被引用类型信息的偏移地址,根据所述被引用类型信息的偏移地址和所述第二存储区的基地址得到所述被引用类型信息的物理地址,执行步骤S544;
步骤S544:所述Java卡虚拟机根据所述获取到的数据中的第4字节上的数据和所述被引用类型信息的物理地址得到所述父方法的偏移地址,执行步骤S7;
所述步骤S6包括:
步骤S641:所述Java卡虚拟机根据所述获取到的数据中第四预设位置上的数据获取所述被引用类型信息的偏移地址,根据所述被引用类型信息的偏移地址和所述类型信息组件的起始地址得到所述被引用类型信息的物理地址;
步骤S642:所述Java卡虚拟机根据所述获取到的数据中的第4字节上的数据和所述被引用类型信息的物理地址得到所述父方法的偏移地址,执行步骤S7。
进一步地,所述被管理数据为虚方法,所述被管理数据信息为被引用类型信息,所述被管理数据信息组件为类型信息组件,所述管理指令为调用虚方法指令;
所述步骤S5包括:
步骤S551:所述Java卡虚拟机判断所述包ID是否小于第三预设值,是则执行步骤S552,否则执行步骤S553;
步骤S552:所述Java卡虚拟机根据所述导出表的地址和所述获取到的数据中第三预设位置上的数据,从所述导出表中获取所述被引用类型信息的偏移地址,根据所述被引用类型信息的偏移地址和所述第一存储区的基地址得到所述被引用类型信息的物理地址,执行步骤S554;
步骤S553:所述Java卡虚拟机根据所述导出表的地址和所述获取到的数据中第三预设位置上的数据,从所述导出表中获取所述被引用类型信息的偏移地址,根据所述被引用类型信息的偏移地址和所述第二存储区的基地址得到所述被引用类型信息的物理地址,执行步骤S554;
步骤S554:所述Java卡虚拟机根据所述获取到的数据中第4字节上的数据和所述被引用类型信息的物理地址得到所述虚方法的物理地址;
步骤S555:所述Java卡虚拟机从所述虚方法的物理地址的第1字节上获取被调用虚方法的参数个数;
步骤S556:所述Java卡虚拟机根据所述参数个数和所述获取到的数据中第4字节上的数据得到所述虚方法的偏移地址,执行步骤S7;
所述步骤S6包括:
步骤S651:所述Java卡虚拟机根据所述获取到的数据中第四预设位置上的数据获取被所述引用类型信息的偏移地址,根据所述被引用类型信息的偏移地址和所述类型信息组件的起始地址得到所述被引用类型信息的物理地址;
步骤S652:所述Java卡虚拟机根据所述获取到的数据中第4字节上的数据和所述被引用类型信息的物理地址得到所述虚方法的物理地址;
步骤S653:所述Java卡虚拟机从所述虚方法的物理地址的第1字节上获取被调用虚方法的参数个数;
步骤S654:所述Java卡虚拟机根据所述参数个数和所述获取到的数据中第4字节上的数据得到所述虚方法的偏移地址,执行步骤S7。
进一步地,所述静态数据为接口方法和/或虚方法,所述步骤P1中还包括:如判断所述管理指令的类型为调用接口方法指令或调用虚方法指令则执行步骤D1;
步骤D1:所述Java卡虚拟机从所述管理指令中获取被调用方法的序号和被调用方法的参数,根据所述被调用方法的参数从堆栈寄存器中获取被访问对象的偏移地址;
步骤D2:所述Java卡虚拟机判断所述被访问对象的偏移地址中最低位上的数据是否为所述第二预设值,是则执行步骤D3,否则执行步骤D4;
步骤D3:所述Java卡虚拟机根据第一存储区中的对象基地址和所述被访问对象的偏移地址得到被访问对象的物理地址,执行步骤D5;
步骤D4:所述Java卡虚拟机根据所述第二存储区中的对象基地址和所述被访问对象的偏移地址得到被访问对象的物理地址,执行步骤D5;
步骤D5:所述Java卡虚拟机从所述被访问对象的物理地址的第五预设位置上获取被访问对象的类型信息的物理地址,根据所述被访问对象的类型信息的物理地址读取被访问对象的类型信息;
步骤D6:所述Java卡虚拟机根据所述被调用方法的序号从所述被访问对象的类型信息中获取被调用方法的物理地址,执行步骤P5。
进一步地,所述步骤D6具体包括:
步骤D61:所述Java卡虚拟机判断管理指令的类型,如为调用接口方法指令则执行步骤D62,如为调用虚方法指令则执行步骤D66;
步骤D62:所述Java卡虚拟机遍历被访问对象所属类型信息所实现的所有接口;
步骤D63:所述Java卡虚拟机判断所述调用接口方法指令中的接口类型的偏移地址是否包含在所述所有接口的偏移地址中,是则执行步骤D64,否则执行步骤D65;
步骤D64:所述Java卡虚拟机根据所述被调用接口方法的序号在所述被访问对象的类型信息中获取被调用方法的物理地址,执行步骤P5;
步骤D65:所述Java卡虚拟机在所述被访问对象的类型信息的第六预设位置上获取父类信息,从所述父类信息中获取所述被访问对象所属类型信息所实现的所有接口,返回步骤D63;
步骤D66:所述Java卡虚拟机从所述被访问对象的类型信息的第七预设位置上获取当前被调用虚方法列表的最小序号;
步骤D67:所述Java卡虚拟机判断所述最小序号是否小于所述被调用方法的序号,是则执行步骤D68,否则执行步骤D69;
步骤D68:所述Java卡虚拟机根据所述被调用方法的序号从所述被访问对象的类型信息中获取被调用方法的物理地址,执行步骤P5;
步骤D69:所述Java卡虚拟机在所述被访问对象的类型信息的第六预设位置上获取父类类型信息的偏移地址,根据所述父类类型信息的偏移地址获取父类类型信息,从所述父类类型信息中获取序号作为所述被调用方法的序号,返回步骤D67。
进一步地,所述步骤P1具体为:在所述Java卡虚拟机解释执行应用的Java程序的过程中,当检测到管理指令时,从所述管理指令中获取指令码,判断所述指令码的值,如为第一预设数据或第二预设数据则管理指令的类型为调用静态方法指令,执行步骤P2,如为第三预设数据或第四预设数据则管理指令的类型为调用接口方法指令或调用虚方法指令,执行步骤D1;
所述步骤P2具体为:所述Java卡虚拟机判断所述指令码的值是否为所述第二预设数据,是则执行步骤P3,否则执行步骤P4;
所述D61具体为:所述Java卡虚拟机判断所述指令码的值,如为所述第三预设数据则所述管理指令的类型为调用接口方法指令,如为所述第四预设数据则管理指令的类型为调用虚方法指令。
本发明与现有技术相比,具有以下优点:
本发明的方法按照Java卡数据(如类型信息,函数,变量等)的不同分配各自设定长度的地址来存储Java卡数据;根据java卡程序中的偏移地址信息计算出Java卡中被偏移地址数据的相对偏移(该偏移中包含被偏移地址数据的偏移与相对数据块信息),然后将偏移写回原偏移地址位置。Java卡虚拟机在访问Java卡程序中的被偏移地址数据时,只要通过被偏移地址数据的相对偏移地址就能找到被偏移地址数据,能够提高数据的访问速度,减小数据访问过程中因查找对象表而带来的时间开销。Java卡虚拟机在下载应用的Java程序过程中将Java卡API程序的字节码掩膜到ROM中、将Java应用的字节码存储到EEPROM中,Java卡虚拟机解释执行应用的Java程序过程中以偏移地址的方式来执行这两块区域上的字节码,提高Java虚拟机的执行效率。
附图说明
图1和图2为本发明实施例一提供的一种基于Java卡的数据管理方法的流程图;
图3为本发明实施例二提供的Java卡虚拟机在下载CAP文件的过程中修改创建指令的实现方法流程图;
图4为本发明实施例三提供的一种Java卡虚拟机在解释执行应用的Java程序过程中创建对象的流程图;
图5为本发明实施例三提供的一种Java卡虚拟机在解释执行应用的Java程序过程中访问对象的流程图;
图6为本发明实施例四提供的Java卡虚拟机在下载CAP文件的过程中修改调用静态方法指令的实现方法流程图;
图7为本发明实施例五提供的Java卡虚拟机在下载CAP文件的过程中修改调用虚方法指令的实现方法流程图;
图8为本发明实施例六提供的Java卡虚拟机在下载CAP文件的过程中修改调用父方法指令的实现方法流程图;
图9为本发明实施例七提供的Java卡虚拟机在下载CAP文件的过程中修改访问静态域指令的实现方法流程图;
图10为本发明实施例八提供的Java卡虚拟机在下载CAP文件的过程中修改访问实例域指令的实现方法流程图;
图11为本发明实施例九提供的一种Java卡虚拟机在解释执行应用的Java程序过程中访问被调用方法的实现方法流程图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
在本发明实施例中Java卡虚拟机下载管理指令的过程具体为接收主机下发的一条指令进行保存并处理,然后继续接收下一条指令进行保存并处理,直到接收完所有主机下发的指令;Java卡虚拟机接收完主机下发的指令后,开始进行访问数据的过程,即一条一条地解释执行保存的指令。
实施例一
本发明实施例一提供一种基于Java卡的数据管理方法,包括下载管理指令的过程和访问数据的过程;其中,下载管理指令的过程为Java卡虚拟机一条一条接收主机下发的指令并进行处理的过程,在接收到偏移地址组件之前已经接收到主机发送的方法组件、常量池组件和被管理数据信息组件并将这些组件进行保存,被管理数据信息组件可以为方法组件和/或类型信息组件,如图1所示,下载管理指令的过程具体包括:
步骤S0:当Java卡虚拟机接收到主机下发的指令时,判断接收到的指令中是否包含有偏移地址组件,是则保存偏移地址组件,执行步骤S1,否则Java卡虚拟机等待接收主机下发指令,返回步骤S0;
步骤S1:Java卡虚拟机从偏移地址组件中获取第一偏移地址,根据第一偏移地址从保存的方法组件中获取第二偏移地址,根据第二偏移地址从保存的常量池组件中获取出预设长度的数据;
步骤S2:Java卡虚拟机判断获取到的数据中第一预设位置上的数据是否为第一预设值,是则执行步骤S3,否则Java卡虚拟机等待接收主机下发指令,返回步骤S1;
本实施例中的第一预设位置为获取到的数据的第1字节;
步骤S3:Java卡虚拟机判断获取到的数据中第二预设位置的最高位上的数据是否为第二预设值,是则执行步骤S4,否则执行步骤S6;
在本实施例中,第二预设位置为获取到的数据的第2字节;
步骤S4:Java卡虚拟机根据获取到的数据中第二预设位置的除最高位之外的其他位上的数据,获取被管理数据信息所属的包的包ID,根据包ID从第二存储区中的包表中获取对应的导出表的地址;
步骤S5:Java卡虚拟机根据导出表的地址、获取到的数据中第三预设位置上的数据得到被管理数据的偏移地址,执行步骤S7;
在本实施例中,如被管理数据为被创建对象的类型信息、实例域、虚方法、父方法则第三预设位置为获取到的数据的第3字节;如被管理数据为静态方法则第三预设位置为获取到的数据的第3、第4字节;如被管理数据为静态域则第三预设位置为获取到的数据的第2、第3字节;
步骤S6:Java卡虚拟机根据获取到的数据中第四预设位置上的数据和保存的被管理数据信息组件的起始地址得到被管理数据的偏移地址,执行步骤S7;
在本实施例中,如被管理数据为被创建对象的类型信息、父方法、虚方法、实例域则第四预设位置为获取到的数据的第2、第3字节;如被管理数据为静态方法、静态域则第四预设位置为获取到的数据的第3、第4字节;
步骤S7:Java卡虚拟机用被管理数据的偏移地址替换方法组件中的管理指令中的卡外偏移地址;
本实施例方法中访问数据的过程为Java卡虚拟机解释执行应用的Java程序中的每条指令的过程,如图2所示,包括:
步骤P1:在Java卡虚拟机解释执行应用的Java程序的过程中,当检测到管理指令时,判断管理指令的类型是否为调用静态方法指令,是则执行步骤P2,否则返回步骤P1;
步骤P2:Java卡虚拟机判断管理指令是否为调用第一存储区中的静态数据的调用静态方法指令,是则执行步骤P3,否则执行步骤P4;
步骤P3:Java卡虚拟机从管理指令中提取被调用的静态数据基于第一存储区的偏移地址,根据第一存储区的基地址和被调用的静态数据基于所述第一存储区的偏移地址计算被调用的静态数据的物理地址,执行步骤P5;
步骤P4:Java卡虚拟机从管理指令中提取被调用的静态数据基于第二存储区的偏移地址,根据第二存储区的基地址和被调用的静态数据基于所述第二存储区的偏移地址计算被调用的静态数据的物理地址,执行步骤P5;
步骤P5:Java卡虚拟机将被调用的静态数据的物理地址存储到指令寄存器中,返回步骤P1。
实施例二
本发明实施例二提供了Java卡虚拟机在下载CAP文件的过程中修改创建对象指令的实现方法,具体实现方法如图3所示,包括:
步骤100:当Java卡虚拟机接收到主机下发的指令时,判断接收到的指令中是否包含有偏移地址组件,是则保存偏移地址组件,执行步骤101,否则Java卡虚拟机等待接收主机下发指令,返回步骤100;
具体的,在本实施例中,结合下载的原始指令序列[0x00032214:0x8F 0x030x08]来详细说明本方法的实现过程,其中,0x00032214表示被修改指令的物理地址;0x8F是指令码,表示该条指令为创建对象指令;0x03 0x07表示被创建对象的类型信息偏移地址;
在本实施例中,在下载偏移地址之前已经下载了方法组件、常量池组件类型信息组件;
步骤101:Java卡虚拟机从保存的偏移地址组件中获取第一偏移地址;
本实施例中的组件预先下载到了Java卡虚拟机中进行保存;
具体的,在本实施例中,Java卡虚拟机遍历ReferenceLocation组件中记录的偏移地址;
例如,ReferenceLocation组件内容如下:
0x50
0x50
0x100
0x15
……
则ReferenceLocation组件中记录的偏移地址为:0x50、0x50、0x100、0x15;
如方法组件基地址为:0x32000,将ReferenceLocation组件中的所有偏移地址累加,再将累加结果与方法组件基地址相加得到0x32215作为第一偏移地址;
累加过程具体为:
0x32000+0x50=0x32050
0x32000+0x50+0x50=0x32100
0x32000+0x50+0x50+0x100=0x32200
0x32000+0x50+0x50+0x100+0x15=0x32215
上述几个地址都是需要重新链接的地址,本实施例中重新链接的地址为0x00032215;
步骤102:Java卡虚拟机根据第一偏移地址从保存的方法组件中获取第二偏移地址;
具体的,在本实施例中,根据物理地址0x32215从method组件中取出0x030x08,将0x03 0x08组合成一个short类型数据,即0x0308,将0x0308作为第二偏移地址;
步骤103:Java卡虚拟机根据第二偏移地址,从保存的常量池组件中获取预设长度的数据;
本实施例中的预设长度为4个字节;
具体的,在本实施例中,根据0x0308从常量池组件中查找4个字节的链接信息,如:0x01 0x83 0x01 0x00;
例如,常量池组件数据如下:
0000:0x01 0x80 0x00 0x04
0004:0x03 0x81 0x00 0x24
……
0308:0x01 0x83 0x01 0x00
……
步骤104:Java卡虚拟机判断获取到的数据中第一预设位置上的数据是否为第一预设值,是则执行步骤105,否则Java卡虚拟机等待接收主机下发指令,返回步骤S1;
具体的,第一预设值为0x01;第一预设位置为第1字节;
本实施例的具体实例中第1字节数据为0x01,继续执行步骤105;
步骤105:Java卡虚拟机判断获取到的数据中第二预设位置中最高位上的数据是否为第二预设值,是则执行步骤106,否则执行步骤111;
具体的,本实施例中的第二预设位置为第2字节,第二预设值为1;
本实施例中,如第2字节数据的最高位为1时表示被创建对象的类型信息不属于当前正在下载的包;如第2字节数据的最高位不为1时表示被创建对象的类型信息所属的包就是当前下载的包,当前下载的包放在EEPROM中,所以创建对象指令不用修改;
具体的,本实施例的实例中第2字节数据为0x83,对应的二进制位10000011,最高位为1所以跳转到步骤111;
步骤106:Java卡虚拟机根据获取到的数据中第二预设位置的除最高位之外的其他位上的数据,获取被创建对象的类型信息所属的包的包ID;
具体的,Java卡虚拟机从第2字节数据的低7位上获取被创建对象的类型信息所属的包的包ID;
本实施例的实例中第2字节数据为0x83,对应的二进制位1000 0011,低7为的数据为000 0011,获取被创建对象的类型信息所属的包的包ID位0x03;
步骤107:Java卡虚拟机根据包ID从EEPROM中的包表中获取对应的导出表的地址;
步骤108:Java卡虚拟机判断包ID是否小于第三预设值,是则执行步骤109,否则执行步骤110;
具体的,本实施例中的第三预设值为0x19;
步骤109:Java卡虚拟机将方法组件中的被创建对象的类型信息在EEPROM中的创建对象指令更改为被创建对象的对象类型信息在ROM中的创建对象指令,执行步骤110;
本实施例的下载程序中的所有创建指令的指令码都相同,在下载过程中,Java卡虚拟机需根据被创建对象的类型信息存储的位置不同对指令码进行修改,如被创建对象的类型信息存储在ROM中则需要对创建指令的指令码进行修改,如被创建对象的类型信息存储在EEPROM中则不需要对创建指令的指令码进行修改;
例如,字节码为0x8F时表示被创建对象的对象类型信息存储在EEPROM中,字节码为0xC3时表示被创建对象的对象类型信息存储在ROM中,字节码0x8F和0xC3的对应关系可由用户预先进行设置;具体的,在本实施例中,将[0x00032214:0x8F 0x03 0x08]中的指令码0x8F修改为0xC3,原指令序列[0x00032214:0x8F 0x03 0x08]已经变成[0x00032214:0xC3 0x03 0x08];
本实施例中的步骤107也可以在步骤110之前执行;
步骤110:Java卡虚拟机根据导出表的地址、获取到的数据中第三预设位置上的数据,从导出表中获取被创建对象的类型信息的偏移地址,执行步骤114;
在本实施例中,第三预设位置具体为第3字节;
例如,本实施例中该包的导出表如下:
0x07,//导出类的个数
//类型1
0x16,0x12,
0x00,
0x05,
0x16,0x9d,0x16,0xb0,0x18,0x18,0x18,0xdd,0x19,0x6b,
//类型2
0x16,0x2b,
0x00,
0x08,
0x1b,0xef,0x1b,0xfa,0x1d,0x0a,0x1d,0xa8,0x1d,0xc9,0x1d,0xe6,0x1e,0x03,0x1e,0x27,
//类型3
0x16,0x46,
0x00,
0x04,
0x1e,0xea,0x22,0x8f,0x23,0x86,0x23,0x92,
//类型4
0x16,0x5f,
0x00,
0x01,
0x24,0x98,
//类型5
0x16,0x6e,
0x00,
0x04,
0x24,0xd4,0x26,0x52,0x26,0xa7,0x27,0x55,
//类型6
0x16,0x83,
0x00,
0x01,
0x28,0xbd,
//类型7
0x16,0x92,
0x00,
0x02,
0x28,0xf9,0x29,0x0a,
其中,第3字节数据0x01表示要找的类型是第1个类型。从导出表的第一个类型中获取到的数据0x16 0x12;
步骤111:Java卡虚拟机根据获取到的数据中第四预设位置上的数据获取第三偏移地址;
在本实施例中,第四预设位置具体为获取到的数据中第2字节和第3字节;
本实施例中被创建对象的类型信息的偏移地址长度为2个字节;
步骤112:Java卡虚拟机根据第三偏移地址和保存的类型信息组件的起始地址得到被创建对象的类型信息的物理地址;
具体的,本实施例中,被创建对象的类型信息的偏移地址加上类型信息组件的起始地址得到类型信息的物理地址;
步骤113:Java卡虚拟机根据被创建对象的类型信息的物理地址和EEPROM的基地址得到被创建对象的类型信息基于EEPROM的偏移地址,执行步骤114;
具体的,在本实施例中,用被创建对象的类型信息的物理地址减去EEPROM的基地址得到被创建对象的类型信息基于EEPROM的偏移地址;
本实施例中的类型信息的偏移地址为2个字节长度的数据;
步骤114:Java卡虚拟机用被创建对象的类型信息的偏移地址更改方法组件中的创建指令中的卡外偏移地址。
例如,在本实施例中,原指令序列[0x00032214:0x8F 0x03 0x08],下载之后变为指令序列[0x00032214:0xC3 0x16,0x12];在虚拟机中运行的指令为0x00032214:0xC3 0x16,0x12,其中,0xC3是指令码。
实施例三
本发明实施例三提供了一种Java卡虚拟机在解释执行应用的Java程序过程中创建对象过程和访问对象过程的实现方法,其中新创建的对象存储在EEPROM中,程序中自带的对象存储在ROM中;如图4所示,创建对象过程包括:
步骤201:Java卡虚拟机解释执行应用的Java程序;
具体的,在本实施例中,Java卡虚拟机解释执行应用的Java程序的过程为Java卡虚拟机对每一条指令进行解释执行的过程;
步骤202:当Java卡虚拟机检测到创建对象指令时,从创建对象指令中获取创建对象信息;
具体的,本实施例中的预设指令为NEW 0x00 0x70;其中,NEW是一个指令助记符(指令码),实际为0x8F;0x00 0x70是被创建对象的类型信息的偏移地址;
具体的,在本实施例中,创建对象信息包括:指令码和被创建对象的类型信息的偏移地址;例如,当前虚拟机解释执行的Java程序指令为[0xBC 0x000x70],则0xBC是指令码,0x00 0x70是被创建对象的类型信息的偏移地址;
步骤203:Java卡虚拟机根据创建对象信息中的指令码判断被创建对象的类型信息是否在ROM中,是则执行步骤204,否则执行步骤205;
在本实施例的具体实例中,0xBC指令码表示本条指令为创建对象指令,并且被创建对象所属的类型信息在ROM中,0x00 0x70,表示被创建对象所属的类型信息在ROM中的第0x0070位置处;
步骤204:Java卡虚拟机根据ROM的基地址和被创建对象的类型信息的偏移地址得到被创建对象的类型信息的物理地址,执行步骤206;
具体的,在本实施例中,被创建对象的类型信息的物理地址=被创建对象的类型信息的偏移地址+ROM的基地址;
例如:ROM的基地址为0x32000,那么被创建对象的类型信息的位置为0x32000+0x0070=0x32070;
步骤205:Java卡虚拟机根据EEPROM的基地址和被创建对象的类型信息的偏移地址得到被创建对象的类型信息的物理地址,执行步骤206;
具体的,在本实施例中,被创建对象的类型信息的物理地址=被创建对象的类型信息的偏移地址+EEPROM的基地址;
如果当前虚拟机解释执行的Java程序指令为0x8C 0x00 0x70,指令码0x8C为则表示本条指令为创建对象,且被创建对象的类型信息在EEPROM中;如EEPROM的基地址为0x32000,那么被创建对象的类型信息的位置为0x32000+0x0070=0x32070;
步骤206:Java卡虚拟机从被创建对象的类型信息的物理地址中获取对象实例域的长度;
具体的,在本实施例中,被创建对象的类型信息中每个对象的长度固定,步骤206中根据当前对象的长度从被创建对象的类型信息的偏移地址的第4字节开始获取对象实例域长度;
例如0x32070处的被创建对象的类型信息为:0x00 0x10 0x00 0x23 0x00 0xff0x00 0x01 0x00 0x00 0x00;对象长度为1个字节,则从第4字节处取出0x00,为该类型的对象实例域的长度,即该类型的对象没有实例域;
步骤207:Java卡虚拟机根据对象实例域的长度和EEPROM中的给对象分配空间的起始地址得到被创建对象的物理地址;
具体的,在本实施例中,EEPROM中给对象分配空间的起始地址必须是2字节对齐的,即最低位保留,用来标记被创建对象的类型;分配空间的长度为对象头长度加上对象实例域的长度;最后得到的被创建对象的物理地址为:起始地址+分配空间的长度;
根据上述可知,被创建对象的实例域为0,另外,使用0xBC创建的对象统一含有5个字节的对象头,所以一共需要5+0+1=6个字节的EEPROM空间。
步骤208:Java卡虚拟机判断EEPROM中是否有剩余空间,是则执行步骤209,否则返回错误信息,创建对象流程结束;
步骤209:Java卡虚拟机根据被创建对象的物理地址和EEPROM基地址计算被创建对象的偏移地址,并将被创建对象的偏移地址存储到堆栈寄存器中,返回步骤201;
具体的,在本实施例中,被创建对象的偏移地址为:被创建对象的物理地址和EEPROM基地址的差值;
在本实施例中,为被创建对象分配的EEPROM起始地址为2字节对齐,例如:0x100390。所以被创建对象所占用的EEPROM空间分别为0x1003900x100391 0x100392 0x100393 0x100394这5个字节。例如EEPROM的起始地址为0x100380,则被创建对象的偏移地址为0x100390-0x100380=0x0010,即,返回的被创建对象偏移地址就是被创建对象的偏移地址。另外,0x0010的最低位为0,表示该对象在EEPROM中。
如图5所示,访问对象过程包括:
步骤301:Java卡虚拟机解释执行当前应用的Java程序;
具体的,在本实施例中,Java卡虚拟机解释执行应用的Java程序的过程为Java卡虚拟机对每一条指令进行解释执行的过程;
步骤302:当Java卡虚拟机检测到对象的标识时,从堆栈寄存器中获取被访问对象的偏移地址;
具体的,在本实施例中,被访问对象的偏移地址为2个字节的数据;
例如:虚拟机当前解释执行的Java程序指令为[0x8B 0x01 0x02],0x8B为指令码,表示虚方法调用;0x01 0x02为指令参数,0x01为所被调用方法参数个数,0x02为所被调用方法编号。
根据被调用方法个数0x01,可以得到被访问对象的偏移地址,例如,当前堆栈寄存器的值为:0x20001002,则被访问对象的偏移地址存储在0x20001002–0x01*2=0x20001000,假设0x20001000处存储的被访问对象的偏移地址为0x00AA。
步骤303:Java卡虚拟机判断被访问对象的偏移地址的最低位是否为第二预设值,是则执行步骤304,否则执行步骤305;
本实施例中的第二预设值具体为1;
在本实施例中,被访问对象的偏移地址为0xAA,转换成二进制位10101010,即最低位为0,表示这个被访问的对象在EEPROM中。
步骤304:Java卡虚拟机根据ROM的基地址和被访问对象的偏移地址得到被访问对象的物理地址,根据被访问对象的物理地址在ROM中访问对象;
在本实施例中,根据ROM基地址和被访问对象的偏移地址得到被访问对象的物理地址,具体为:ROM基地址加上被访问对象的偏移地址得到被访问对象的物理地址;
步骤305:Java卡虚拟机根据EEPROM的基地址和被访问对象的偏移地址得到被访问对象的物理地址,根据被访问对象的物理地址在EEPROM中访问对象;
在本实施例中,根据EEPROM基地址和被访问对象偏移地址得到被访问对象的物理地址,具体为:EEPROM基地址加上对象偏移地址得到被访问对象的物理地址;
在本实施例中,被访问对象的偏移地址为0xAA,被访问对象是EEPROM中的对象,假设EEPROM的基地址为0x100380,则被访问对象的物理地址为0xAA+0x100380=0x10042A。
实施例四
本发明实施例四提供的Java卡虚拟机在下载CAP文件的过程中对调用静态方法指令进行修改的实现方式,Java卡上的调用静态方法指令是指卡片中存储的Java应用的字节码,在CAP文件中用组件来表示。Java应用的字节码根据存储在Java卡中的位置分为两部分,即掩膜到ROM中的Java卡API程序的字节码和EEPROM中存储的Java应用的字节码。调用静态方法指令下载时的处理包括:Java卡虚拟机接收卡外传入的APDU命令,该命令中表明了方法的大小,Java卡虚拟机按照该大小在EEPROM中分配相应的空间,然后Java卡虚拟机将APDU命令中的方法组件数据逐条拷贝到在EEPROM中分配好的空间中;
本实施例的实现过程如图6所示,包括:
步骤400:当Java卡虚拟机接收到主机下发的指令时,判断接收到的指令中是否包含有偏移地址组件,是则保存偏移地址组件,执行步骤401,否则Java卡虚拟机等待接收主机下发指令,返回步骤400;
例如,在本实施例中,下载的原始指令序列:[0x00032214:0x8D 0x03 0x08],其中,0x00032214表示被修改指令的物理地址;0x8D是指令码,表示该条指令为调用静态方法指令;0x03 0x07表示被调用方法的卡外偏移地址;
具体的,在本实施例中,Java卡虚拟机在接收到偏移地址组件之前已经接收到主机发送的方法组件和常量池组件并将这些组件进行保存;
步骤401:Java卡虚拟机从保存的偏移地址组件中获取第一偏移地址;
具体的,在本实施例中,Java卡虚拟机遍历偏移地址组件中记录的偏移地址;
例如,偏移地址组件内容如下:
0x50
0x50
0x100
0x15
……
则偏移地址组件中记录的偏移地址为:0x50、0x50、0x100、0x15;
如方法组件基地址为:0x32000,将偏移地址组件中的所有偏移地址累加,再将累加结果与方法组件基地址相加得到0x32215作为第一偏移地址;
累加过程具体为:
0x32000+0x50=0x32050
0x32000+0x50+0x50=0x32100
0x32000+0x50+0x50+0x100=0x32200
0x32000+0x50+0x50+0x100+0x15=0x32215
上述几个地址都是需要重新链接的地址,本实施例中重新链接的地址为0x00032215;
步骤402:Java卡虚拟机根据第一偏移地址从保存的方法组件中获取第二偏移地址;
具体的,在本实施例中,根据物理地址0x32215从method组件中取出0x030x08,将0x030x08组合成一个short类型数据,即0x0308,将0x0308作为第二偏移地址;
步骤403:Java卡虚拟机下载模块根据第二偏移地址,从常量池组件中获取预设长度的数据;
本实施例中的预设长度具体为4个字节;
具体的,在本实施例中,根据0x0308从常量池组件中查找4个字节的链接信息,如:0x06 0x83 0x01 0x03;
例如,常量池组件数据如下:
0000:0x01 0x80 0x00 0x04
0004:0x03 0x81 0x00 0x24
……
0308:0x06 0x83 0x01 0x03
……
步骤404:Java卡虚拟机判断获取到的数据中第一预设位置上的数据是否为第一预设值,是则执行步骤405,否则Java卡虚拟机等待接收主机下发指令,返回步骤S1;
在本实施例中,第一预设位置为获取到的数据的第1字节,第一预设值具体为0x06;
本实施例的实例中的第1字节数据为0x06,继续执行步骤405;
步骤405:Java卡虚拟机判断获取到的数据中第二预设位置的最高位上的数据是否为第二预设值,是则406,否则执行步骤411;
本实施例中的第二预设位置为获取到的数据中第2字节,第二预设值具体为1;
本实施例中,如第1字节数据的最高位为1时表示被调用方法不属于当前正在下载的包;如第1字节数据的最高位不为1时表示被调用方法所属的包就是当前下载的包,当前下载的包放在EEPROM中,所以方法调用指令不用修改;
具体的,本实施例的实例中第2字节数据为0x83,对应的二进制位10000011,最高位为1所以跳转到步骤411;
步骤406:Java卡虚拟机根据获取到的数据中第二预设位置中除最高位之外的其他位上的数据,获取被调用静态方法所属的包的包ID;
具体的,本实施例中第二预设位置中除最高位的其他位具体为第2字节数据的低7位;在实例中第2字节数据为0x83,对应的二进制位1000 0011,低7为的数据为000 0011,获取被调用静态方法的包的包ID为0x03;
步骤407:Java卡虚拟机根据包ID从EEPROM中的包表中获取对应的导出表的地址;
步骤408:Java卡虚拟机判断包ID是否小于第三预设值,是则执行步骤409,否则执行步骤410;
具体的,本实施例中的第三预设值为0x19;
步骤409:Java卡虚拟机将方法组件中的调用EEPROM中的静态方法的调用静态方法指令更改为调用ROM中的静态方法的调用静态方法指令,执行步骤410;
具体的,在本实施例中,将[0x00032214:0x8D 0x03 0x08]中的指令码0x8D修改为0xBA,原指令序列[0x00032214:0x8D 0x03 0x08]已经变成[0x00032214:0xBA 0x03 0x08];
本实施例中的步骤407可以在步骤409和步骤410之间执行;
步骤410:Java卡虚拟机根据导出表的地址、获取到的数据中第三位置上的数据,从导出表中获取静态方法的偏移地址,执行步骤414;
在本实施例中,第三位置为获取到的数据中第3字节和第4字节;
例如,本实施例中该包的导出表如下:
0x07,//导出类的个数
//类型1
0x16,0x12,
0x00,
0x05,
0x16,0x9d,0x16,0xb0,0x18,0x18,0x18,0xdd,0x19,0x6b,
//类型2
0x16,0x2b,
0x00,
0x08,
0x1b,0xef,0x1b,0xfa,0x1d,0x0a,0x1d,0xa8,0x1d,0xc9,0x1d,0xe6,0x1e,0x03,0x1e,0x27,
//类型3
0x16,0x46,
0x00,
0x04,
0x1e,0xea,0x22,0x8f,0x23,0x86,0x23,0x92,
//类型4
0x16,0x5f,
0x00,
0x01,
0x24,0x98,
//类型5
0x16,0x6e,
0x00,
0x04,
0x24,0xd4,0x26,0x52,0x26,0xa7,0x27,0x55,
//类型6
0x16,0x83,
0x00,
0x01,
0x28,0xbd,
//类型7
0x16,0x92,
0x00,
0x02,
0x28,0xf9,0x29,0x0a,
其中,第3字节数据0x01表示要找的方法在第1个类型,第4字节数据0x03表示从方法表中第1个类型的第4个项中获取到的数据0x18 0xdd;
步骤411:Java卡虚拟机根据获取到的数据的第四预设位置上的数据获取第三偏移地址;
在本实施例中,第四预设位置具体为获取到的数据的第3字节和第4字节;
本实施例中的第三偏移地址长度为2个字节;
步骤412:Java卡虚拟机根据第三偏移地址和保存的方法组件的起始地址得到静态方法的物理地址;
具体的,本实施例中,静态方法的偏移地址加上方法组件的起始地址得到静态方法的物理地址;
步骤413:Java卡虚拟机根据静态方法的物理地址和EEPROM的基地址得到静态方法基于EEPROM的偏移地址,执行步骤414;
具体的,用静态方法的物理地址减去EEPROM基地址得到静态方法基于EEPROM的偏移地址;
本实施例中的静态方法的偏移地址为2个字节长度的数据;
步骤414:Java卡虚拟机用静态方法的偏移地址更改方法组件中的调用静态方法指令中的卡外偏移地址。
例如,在本实施例中,原指令序列[0x00032214:0x8D 0x03 0x08],现指令序列[0x00032214:0xBA 0x18 0xdd];在虚拟机中运行的指令为0x00032214:0xBA 0x18 0xdd,其中,0xBA是指令码。
实施例五
本发明实施例五提供的Java卡虚拟机在下载CAP文件的过程中对调用虚方法指令进行修改的实现方式,Java卡上的调用虚方法指令是指卡片中存储的java应用的字节码,在CAP文件中用组件来表示。Java应用的字节码根据存储在Java卡中的位置分为两部分,即掩膜到ROM中的Java卡API程序的字节码和EEPROM中存储的Java应用的字节码。调用虚方法指令下载时的处理包括:Java卡虚拟机接收卡外传入的APDU命令,该命令中表明了方法的大小,Java卡虚拟机按照该大小在EEPROM中分配相应的空间,然后Java卡虚拟机将APDU命令中的方法组件数据逐条拷贝到在EEPROM中分配好的空间中;
本实施例的实现过程如图7所示,包括:
步骤500:当Java卡虚拟机接收到主机下发的指令时,判断接收到的指令中是否包含有偏移地址组件,是则保存偏移地址组件,执行步骤501,否则Java卡虚拟机等待接收主机下发指令,返回步骤500;
步骤501:Java卡虚拟机从保存的偏移地址组件中获取第一偏移地址;
具体的,在本实施例中,Java卡虚拟机在接收到偏移地址组件之前已经接收到主机发送的方法组件和常量池组件并将这些组件进行保存;
步骤502:Java卡虚拟机根据第一偏移地址从保存的方法组件中获取第二偏移地址;
步骤503:Java卡虚拟机下载模块根据第二偏移地址,从常量池组件中获取预设长度的数据;
本实施例中的预设长度具体为4个字节;
本实施例中步骤501-503的具体实现过程与实施例四中步骤401-403的实现过程相同,在此不再赘述;
步骤504:Java卡虚拟机判断获取到的数据中第一预设位置上的数据是否为第一预设值,是则执行步骤505,否则Java卡虚拟机等待接收主机下发指令,返回步骤S1;
在本实施例中,第一预设位置为获取到的数据的第1字节,第一预设值具体为0x03;
步骤505:Java卡虚拟机判断获取到的数据中第二预设位置的最高位上的数据是否为第二预设值,是则506,否则执行步骤514;
本实施例中的第二预设位置为获取到的数据中第3字节,第二预设值具体为1;
步骤506:Java卡虚拟机根据获取到的数据的第二预设位置的除最高位之外的其他位上的数据,获取被引用类型信息所属的包的包ID;
具体的,本实施例中第二预设位置中除最高位的其他位具体为第2字节数据的低7位;
步骤507:Java卡虚拟机根据包ID从EEPROM中的包表中获取对应的导出表的地址;
步骤508:Java卡虚拟机判断包ID是否小于第三预设值,是则执行步骤509,否则执行步骤510;
步骤509:Java卡虚拟机根据导出表的地址、获取到的数据中第三预设位置上的数据,从导出表中获取被引用类型信息的偏移地址,根据被引用类型信息的偏移地址和ROM的基地址得到被引用类型信息的物理地址,执行步骤511;
本实施例中的第三预设位置为第3字节;
步骤510:Java卡虚拟机根据导出表的地址、获取到的数据中第三预设位置上的数据,从导出表中获取被引用类型信息的偏移地址,根据被引用类型信息的偏移地址和EEPROM的基地址得到被引用类型信息的物理地址,执行步骤511;
步骤511:Java卡虚拟机根据获取到的数据中的第4字节上的数据和被引用类型信息的物理地址得到虚方法的物理地址;
步骤512:Java卡虚拟机从虚方法的物理地址的第1字节上获取被调用虚方法的参数个数;
步骤513:Java卡虚拟机根据参数个数和获取到的数据中的第4字节上的数据得到虚方法的偏移地址,执行步骤518;
步骤514:Java卡虚拟机根据获取到的数据中第四预设位置上的数据获取被引用类型信息的偏移地址,根据被引用类型信息的偏移地址和类型信息组件的起始地址得到被引用类型信息的物理地址;
本实施例中的第四预设位置为第3、第4字节;
步骤515:Java卡虚拟机根据获取到的数据中第4字节上的数据和被引用类型信息的物理地址得到虚方法的物理地址;
步骤516:Java卡虚拟机从虚方法的物理地址的第1字节上获取被调用虚方法的参数个数;
步骤517:Java卡虚拟机根据参数个数和获取到的预设长度的数据中第4字节上的数据得到虚方法的偏移地址,执行步骤518;
本实施例中虚方法的偏移地址为2个字节长度的数据;
步骤518:Java卡虚拟机用虚方法的偏移地址替换方法组件中的调用虚方法指令中的卡外偏移地址。
实施例六
本发明实施例六提供的Java卡虚拟机在下载CAP文件的过程中对调用父方法指令进行修改的实现方式,Java卡上的调用父方法指令是指卡片中存储的Java应用的字节码,在CAP文件中用组件来表示。Java应用的字节码根据存储在Java卡中的位置分为两部分,即掩膜到ROM中的Java卡API程序的字节码和EEPROM中存储的Java应用的字节码。调用父方法指令下载时的处理包括:Java卡虚拟机接收卡外传入的APDU命令,该命令中表明了方法的大小,Java卡虚拟机按照该大小在EEPROM中分配相应的空间,然后Java卡虚拟机将APDU命令中的方法组件数据逐条拷贝到在EEPROM中分配好的空间中;
本实施例的实现过程如图8所示,包括:
步骤600:当Java卡虚拟机接收到主机下发的指令时,判断接收到的指令中是否包含有偏移地址组件,是则保存偏移地址组件,执行步骤601,否则Java卡虚拟机等待接收主机下发指令,返回步骤600;
步骤601:Java卡虚拟机从保存的偏移地址组件中获取第一偏移地址;
步骤602:Java卡虚拟机根据第一偏移地址从保存的方法组件中获取第二偏移地址;
步骤603:Java卡虚拟机下载模块根据第二偏移地址,从常量池组件中获取预设长度的数据;
本实施例中的预设长度具体为4个字节;
本实施例中步骤601-603的具体实现过程与实施例四中步骤401-403的实现过程相同,在此不再赘述;
步骤604:Java卡虚拟机判断获取到的数据中第一预设位置上的数据是否为第一预设值,是则执行步骤605,否则Java卡虚拟机等待接收主机下发指令,返回步骤S1;
在本实施例中,第一预设位置为获取到的数据的第1字节,第一预设值具体为0x04;
步骤605:Java卡虚拟机判断获取到的数据中第二预设位置的最高位上的数据是否为第二预设值,是则606,否则执行步骤613;
本实施例中的第二预设位置为获取到的数据中第2字节,第二预设值具体为1;
步骤606:Java卡虚拟机根据获取到的数据中第二预设位置的除最高位之外的其他位上的数据,获取被引用类型信息所属的包的包ID;
具体的,本实施例中第二预设位置中除最高位的其他位具体为第2字节数据的低7位;
步骤607:Java卡虚拟机根据包ID从EEPROM中的包表中获取对应的导出表的地址;
步骤608:Java卡虚拟机判断包ID是否小于第三预设值,是则执行步骤609,否则执行步骤611;
步骤609:Java卡虚拟机根据导出表的地址、获取到的数据中第三预设位置上的数据,从导出表中获取被引用类型信息的偏移地址,根据被引用类型信息的偏移地址和ROM的基地址得到被引用类型信息的物理地址;
本实施例中的第三预设位置为第3字节;
步骤610:Java卡虚拟机将方法组件中的调用EEPROM中的父方法的调用父方法指令更改为调用ROM中的父方法的调用父方法指令,执行步骤612;
步骤611:Java卡虚拟机根据导出表的地址、获取到的数据中第三预设位置上的数据,从导出表中获取被引用类型信息的偏移地址,根据被引用类型信息的偏移地址和EEPROM的基地址得到被引用类型信息的物理地址,执行步骤612;
本实施例中的第三预设位置为第3字节;
步骤612:Java卡虚拟机根据获取到的预设长度的数据中的第4字节上的数据和被引用类型信息的物理地址得到父方法的偏移地址,执行步骤615;
步骤613:Java卡虚拟机根据获取到的数据中第四预设位置上的数据获取被引用类型信息的偏移地址,根据被引用类型信息的偏移地址和类型信息组件的起始地址得到被引用类型信息的物理地址;
本实施例中的第四预设位置为第2、第3字节;
步骤614:Java卡虚拟机根据获取到的数据中的第4字节上的数据和被引用类型信息的物理地址得到父方法的偏移地址,执行步骤615;
本实施例中父方法的偏移地址为2个字节长度的数据;
步骤615:Java卡虚拟机用父方法的偏移地址替换方法组件中的调用父方法指令中的卡外偏移地址。
实施例七
本发明实施例七提供Java卡虚拟机在下载CAP文件的过程中对访问静态域指令进行修改的实现方式,如图9所示,包括:
步骤700:当Java卡虚拟机接收到主机下发的指令时,判断接收到的指令中是否包含有偏移地址组件,是则保存偏移地址组件,执行步骤701,否则Java卡虚拟机等待接收主机下发指令,返回步骤700;
具体的,在本实施例中,Java卡虚拟机在接收到偏移地址组件之前已经接收到主机发送的方法组件和常量池组件并将这些组件进行保存;步骤701:Java卡虚拟机从保存的偏移地址组件中获取第一偏移地址;
步骤702:Java卡虚拟机根据第一偏移地址从保存的方法组件中获取第二偏移地址;
步骤703:Java卡虚拟机下载模块根据第二偏移地址,从常量池组件中获取预设长度的数据;
本实施例中的预设长度具体为4个字节;
本实施例中步骤701-703的具体实现过程与实施例四中步骤401-403的实现过程相同,在此不再赘述;
步骤704:Java卡虚拟机判断获取到的数据中第一预设位置上的数据是否为第一预设值,是则执行步骤705,否则Java卡虚拟机等待接收主机下发指令,返回步骤S1;
在本实施例中,第一预设位置为获取到的数据的第1个字节,第一预设值具体为0x05;
步骤705:Java卡虚拟机判断获取到的数据中第二预设位置的最高位上的数据是否为第二预设值,是则706,否则执行步骤709;
本实施例中的第二预设位置为获取到的数据中第2字节,第二预设值具体为1;
步骤706:Java卡虚拟机根据获取到的数据中第二预设位置的除最高位之外的其他位上的数据,获取被引用类型信息所属的包的包ID;
具体的,本实施例中第二预设位置中除最高位的其他位具体为第2字节的低7位;
步骤707:Java卡虚拟机根据包ID从EEPROM中的包表中获取对应的导出表的地址;
步骤708:Java卡虚拟机根据导出表的地址、获取到的数据中第三预设位置上的数据,从导出表中获取静态域的偏移地址,执行步骤712;
本实施例中的第三预设位置为第2、第3字节;
步骤709:Java卡虚拟机根据获取到的数据中第四预设位置上的数据获取被引用类型信息的偏移地址;
本实施例中的第四预设位置为第3、第4字节;
步骤710:Java卡虚拟机根据被引用类型信息的偏移地址和类型信息组件的起始地址得到被引用类型信息的物理地址;
步骤711:Java卡虚拟机根据被引用类型信息的物理地址和EEPROM的基地址得到静态域基于EEPROM的偏移地址,执行步骤712;
本实施例中静态域的偏移地址为2个字节长度的数据;
步骤712:Java卡虚拟机用静态域的偏移地址替换方法组件中的访问静态域指令中的卡外偏移地址。
实施例八
本发明实施例八提供了Java卡虚拟机在下载CAP文件的过程中对访问实例域指令进行修改的实现方式,如图10所示,包括:
步骤800:当Java卡虚拟机接收到主机下发的指令时,判断接收到的指令中是否包含有偏移地址组件,是则保存偏移地址组件,执行步骤801,否则Java卡虚拟机等待接收主机下发指令,返回步骤800;
具体的,在本实施例中,Java卡虚拟机在接收到偏移地址组件之前已经接收到主机发送的方法组件和常量池组件并将这些组件进行保存;
步骤801:Java卡虚拟机从保存的偏移地址组件中获取第一偏移地址;
步骤802:Java卡虚拟机根据第一偏移地址从保存的方法组件中获取第二偏移地址;
步骤803:Java卡虚拟机下载模块根据第二偏移地址,从常量池组件中获取预设长度的数据;
本实施例中的预设长度具体为4个字节;
本实施例中步骤801-803的具体实现过程与实施例四中步骤401-403的实现过程相同,在此不再赘述;
步骤804:Java卡虚拟机判断获取到的数据中第一预设位置上的数据是否为第一预设值,是则执行步骤805,否则Java卡虚拟机等待接收主机下发指令,返回步骤S1;
在本实施例中,第一预设位置为获取到的数据的第1字节,第一预设值具体为0x02;
步骤805:Java卡虚拟机判断获取到的数据中第二预设位置的最高位上的数据是否为第二预设值,是则806,否则执行步骤817;
本实施例中的第二预设位置为获取到的数据中第2字节,第二预设值具体为1;
步骤806:Java卡虚拟机根据获取到的数据中第二预设位置的除最高位之外的其他位上的数据,获取被引用类型信息所属的包的包ID;
具体的,本实施例中第二预设位置中除最高位的其他位具体为第2字节数据的低7位;
步骤807:Java卡虚拟机根据包ID从EEPROM中的包表中获取对应的导出表的地址;
步骤808:Java卡虚拟机根据导出表的地址、获取到的数据中第三预设位置上的数据,从导出表中获取被引用类型信息的偏移地址;
本实施例中的第三预设位置为第3字节;
步骤809:Java卡虚拟机判断包ID是否小于第三预设值,是则执行步骤810,否则执行步骤811;
步骤810:Java卡虚拟机根据被引用类型信息的偏移地址和ROM的基地址得到被引用类型信息的物理地址,执行步骤812;
步骤811:Java卡虚拟机根据被引用类型信息的偏移地址和EEPROM的基地址得到被引用类型信息的物理地址,执行步骤812;
步骤812:Java卡虚拟机从被引用类型信息的物理地址的第1字节上获取标志值;
本实施例中的标志值为1个字节长度的数据;
步骤813:判断标志值中低位端起第5位上的值是否为1,是则执行步骤814,否则执行步骤815;
步骤814:Java卡虚拟机从被引用类型信息的物理地址的第2、第3字节上获取2个字节的数据,根据获取的2个字节的数据和ROM的基地址得到父类的类型信息的物理地址,执行步骤816;
步骤815:Java卡虚拟机从被引用类型信息的物理地址的第2、第3字节上获取数据,根据获取数据和EEPROM的基地址得到父类的类型信息的物理地址,执行步骤816;
步骤816:Java卡虚拟机从父类的类型信息的物理地址的第4字节上获取数据,从获取到的数据中第4字节上获取数据,将获取的两个数据相加得到实例域的偏移地址,执行步骤822;
本实施例中父方法的偏移地址为1个字节长度的数据;
步骤817:Java卡虚拟机根据获取到的数据中第四预设位置上的数据获取被引用类型信息的偏移地址,根据被引用类型信息的偏移地址和类型信息组件的起始地址得到被引用类型信息的物理地址;
本实施例中的第四预设位置为第2、第3字节;
步骤818:Java卡虚拟机从被引用类型信息的物理地址的第1字节上获取1个字节的标志值,判断标志值中低位端起第5位上的值是否为1,是则执行步骤819,否则执行步骤820;
步骤819:Java卡虚拟机从被引用类型信息的物理地址的第2、第3字节上获取数据,根据获取的数据和ROM的基地址得到父类的类型信息的物理地址,执行步骤821;
步骤820:Java卡虚拟机从被引用类型信息的物理地址的第2、第3字节上获取数据,根据获取的数据和EEPROM的基地址得到父类的类型信息的物理地址,执行步骤821;
步骤821:Java卡虚拟机从父类的类型信息的物理地址的第4字节上获取数据,从获取到的数据中第4字节上获取数据,将获取的两个数据相加得到实例域的偏移地址,执行步骤822;
步骤822:Java卡虚拟机用实例域的偏移地址替换方法组件中的访问实例域指令中的卡外偏移地址。
实施例九
本发明实施例九提供了Java卡虚拟机在解释执行应用的Java程序过程中访问被调用方法的实现方法,如图11所示,该方法包括:
步骤901:Java卡虚拟机解释执行应用的Java程序;
步骤902:当Java卡虚拟机检测到管理指令时,获取管理指令中的指令码;
例如,当前虚拟机检测到的管理指令为[0xBB,0x03,0x0c,0xf2,0x05,],0xBB为指令码,表示调用的是ROM中的接口方法。其他为指令参数,0x03表示被调用方法的参数个数,0x0c,0xf2表示被调用方法所属接口类型,0x05表示被调用方法的序号。
步骤903:Java卡虚拟机根据指令码判断管理指令的类型,如为调用静态方法指令则执行步骤904,如为调用接口方法指令或调用虚方法指令则执行步骤909;
具体的,在本实施例中,如果管理指令的指令码的值为第一预设数据或第二预设数据(0x8D或0xBA)则为静态方法调用,其中第一预设数据(例如0x8D)表示调用EEPROM中的静态方法,第二预设数据(例如0xBA)表示调用ROM中的静态方法;如果管理指令的指令码的值为第三预设数据(例如0x8B)则为虚方法调用;如果管理指令的指令码的值为第四预设数据(例如0x8E或0xBB)则为接口方法调用;
步骤904:Java卡虚拟机判断管理指令是否为调用ROM中存储的静态方法的调用静态方法指令,是则执行步骤905,否则执行步骤907;
具体的,判断当前管理指令的指令码的值是否为第二预设数据(例如0xBA),是则当前管理指令为调用ROM中存储的方法的指令,否则当前管理指令是调用EEPROM中存储的方法的指令;
步骤905:Java卡虚拟机从管理指令中提取被调用静态方法基于ROM的偏移地址;
在本实施例中,管理指令中的参数包括指令码、被调用方法的偏移地址、被调用方法的序号;
步骤906:Java卡虚拟机根据ROM的基地址和被调用静态方法基于ROM的偏移地址计算被调用静态方法的物理地址,执行步骤923;
步骤907:Java卡虚拟机从管理指令中提取被调用静态方法基于EEPROM的偏移地址;
步骤908:Java卡虚拟机根据EEPROM的基地址和被调用静态方法基于EEPROM的偏移地址计算被调用静态方法的物理地址,执行步骤923;
步骤909:Java卡虚拟机从管理指令中获取被调用方法的序号和被调用方法的参数,根据被调用方法的参数从堆栈寄存器中获取被访问对象的偏移地址;
根据被参数个数0x03,可以得到对象的偏移地址,例如,当前堆栈寄存器的值为:0x20001006,堆栈寄存器中用两个字节存储一个数据,则对象的偏移地址的存储位置为:0x20001006–0x03*2=0x20001000,假设0x20001000处存储的对象偏移地址为0x00AB。
在本实施例中,堆栈寄存器中存储了对象的偏移,指令寄存器中存储了堆栈寄存器的位置,所以根据指令寄存器就可以定位到堆栈寄存器中的位置,然后从堆栈寄存器中取出对象偏移;
所以对象偏移地址为0x00AB,被调用方法序号为0x05。
步骤910:Java卡虚拟机判断被访问对象的偏移地址中最低位上的数据是否为第二预设值,是则执行步骤911,否则执行步骤912;
本实施例中的第二预设值具体为1;
本实施例的实例中对象偏移地址0x00AB转换为二进制为10101011,可见,最低位为1,表明对象在ROM中。
步骤911:Java卡虚拟机根据ROM中的对象基地址和被访问对象的偏移地址得到被访问对象的物理地址,执行步骤913;
在本实施例中,根据对象ROM基地址和被访问对象的偏移地址得到被访问对象的物理地址,具体为:对象ROM基地址加上被访问对象的偏移地址得到被访问对象的物理地址;
假设ROM的基地址为0x32000,而被访问对象的偏移地址为0x00AB,则被访问对象的物理地址为0x32000+0x00AB-0x01=0x320AA;
步骤912:Java卡虚拟机根据EEPROM中的对象基地址和被访问对象的偏移地址得到被访问对象的物理地址,执行步骤913;
在本实施例中,根据对象EEPROM基地址和被访问对象的偏移地址得到被访问对象的物理地址,具体为:对象EEPROM基地址加上被访问对象的偏移地址得到被访问对象的物理地址;
步骤913:Java卡虚拟机从被访问对象的物理地址的第五预设位置上获取被访问对象的类型信息的物理地址,根据被访问对象的类型信息的物理地址读取被访问对象的类型信息;
如被访问对象的类型信息存储中ROM中则从ROM中读取,如被访问对象的类型信息存储在EEPROM中则从EEPROM中读取;
具体的,在本实施例中,被访问对象的类型信息的物理地址的预设位置为被访问对象的物理地址的第3字节处;
例如,0x320AA处存放的对象数据为:
0x20,/*Header*/
0x00,/*CC*/
0x03,0xde,0x1c,/*Class Address*/
……
那么这个对象所属的类型信息的物理地址就在0x03de1c处。
步骤913之后Java卡虚拟机根据被调用方法的序号从被访问对象的类型信息中获取对应的被调用方法的物理地址,执行步骤923;具体的实现过程参见步骤914-步骤922;
步骤914:Java卡虚拟机判断管理指令的类型,如为调用接口方法指令则执行步骤915,如为调用虚方法指令则执行步骤919;
具体的,在本实施例中,如果管理指令的指令码的值为第三预设数据(例如0x8B)则为虚方法调用;如果管理指令的指令码的值为第四预设数据(例如0x8E或0xBB)则为接口方法调用。
步骤915:Java卡虚拟机遍历被访问对象所属类型信息所实现的所有接口;
在本实施例中,一个类可以实现若干个接口类,这些被实现的接口信息就放在被访问对象的类型信息的最后面,具体格式是:接口类型偏移地址、实现接口个数、接口序号;
例如:被访问对象的所属类型信息0x03de1c处存储的数据为:
0x02,0x12,0x00,0x00,0x07,0x00,0x04,0x01,0x0d,0x00,0x00,
0x2a,0x27,
0x2a,0x6a,
0x2a,0x98,
0x2a,0xb7,
0x2a,0xbc,
0x2a,0xd8,
0x2b,0x03,
0x2b,0x0a
0x2b,0x71,
0x2b,0x76,
0x2b,0x7d
0x2b,0xe4
0x2b,0xec
/*以下2项就是这个类所实现的所有接口*/
0x15,0xf8,9,10,9,6,4,5,12,7,8,11,
0x0c,0xf2,13,10,9,6,4,5,12,7,8,11,1,2,3,13,
步骤916:Java卡虚拟机判断调用接口方法指令中的接口类型的偏移地址是否包含在所有接口的偏移地址中,是则执行步骤917,否则执行步骤918;
虚拟机根据上面提到的调用接口方法指令:[0xBB,0x03,0x0c,0xf2,0x05,]中第3、第4字节遍历所有接口,发现有匹配项:0x0c,0xf2,13,10,9,6,4,5,12,7,8,11,1,2,3,13。
步骤917:Java卡虚拟机根据被调用接口方法的序号在被访问对象的类型信息中获取被调用方法的物理地址,执行步骤923;
上述实例中,0x0c,0xf2:是接口类型的偏移地址。
13:表示本类或本类的积累中实现的接口数量。
10,9,6,4,5,12,7,8,11,1,2,3,13:后面是方法序号表。
然后再根据第5字节数据0x05,从上面类型所实现的第2个接口的方法序号表中取出第5个方法序号:12。根据12就可以从本类方法表中获取被调用接口方法的偏移地址:0x2b,0xec。
由于上述的被访问对象的类型信息在ROM中,所以该类型所实现的方法也在ROM中,所以0x2b,0xec所代表的接口方法的物理地址为:0x32000+0x2bec=0x34bec。
步骤918:Java卡虚拟机在被访问对象的类型信息的第六预设位置上获取父类信息,从父类信息中获取被访问对象所属类型信息所实现的所有接口,返回步骤916;
在本实施例中,在被访问对象的类型信息的第六预设位置上获取父类信息,具体为:在被访问对象的类型信息中的第2字节上获取父类信息;
在本实施例中,一个对象的类型可以继承自父类,父类的偏移地址就放在被访问对象的类型信息的第2、第3字节处,长度为2个字节;
步骤919:Java卡虚拟机从被访问对象的类型信息的第七预设位置上获取当前被调用虚方法列表的最小序号;
具体的,该步骤中的对象的类型信息的第七预设位置为对象的类型信息中的第七字节;
步骤920:Java卡虚拟机判断最小序号是否小于被调用方法的序号,是则执行步骤921,否则执行步骤922;
步骤921:Java卡虚拟机根据被调用方法的序号从被访问对象的类型信息中获取被调用方法的物理地址,执行步骤923;
在本实施例中,一个类中可以有若干方法,这些方法的位置,就是方法序号,例如:一个类实现了3个方法:funA()、funB()、funC(),那么funA()的序号就是0,funB()的序号就是1,funC()的序号为2;假如这个类还有父类,父类中有2个方法,funa(),funb(),那么funa()的序号就是0,funb()的序号就是1,funA()的序号就是2,funB()的序号就是3,funC()的序号为4;即方法编号要算上父类中的方法;
步骤922:Java卡虚拟机在被访问对象的类型信息的第六预设位置上获取父类类型信息的偏移地址,根据父类类型信息的偏移地址得到获取父类类型信息,从父类类型信息中获取序号作为被调用方法的序号,返回步骤920;
在本实施例中,在被访问对象的类型信息的第六预设位置上获取父类信息,具体为:在被访问对象的类型信息中的第二字节上获取父类信息;
步骤923:Java卡虚拟机将被调用方法的物理地址存储到指令寄存器中;
至此,虚拟机将指令寄存器设置为0x34bec,虚拟机继续执行此处的指令码。
本发明的方法按照Java卡数据(如类型信息,函数,变量等)的不同分配各自设定长度的地址来存储Java卡数据;根据java卡程序中的偏移地址信息计算出Java卡中被偏移地址数据的相对偏移(该偏移中包含被偏移地址数据的偏移与相对数据块信息),然后将偏移写回原偏移地址位置。Java卡虚拟机在访问Java卡程序中的被偏移地址数据时,只要通过被偏移地址数据的相对偏移地址就能找到被偏移地址数据,能够提高数据的访问速度,减小数据访问过程中因查找对象表而带来的时间开销。Java卡虚拟机在下载应用的Java程序过程中将Java卡API程序的字节码掩膜到ROM中、将Java应用的字节码存储到EEPROM中,Java卡虚拟机解释执行应用的Java程序过程中以偏移地址的方式来执行这两块区域上的字节码,提高Java虚拟机的执行效率。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明公开的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。

Claims (15)

1.一种基于Java卡的数据管理方法,其特征在于,包括下载管理指令的过程和访问数据的过程;其中,所述下载管理指令的过程包括:
步骤S0:当Java卡虚拟机接收到主机下发的指令时,判断接收到的指令中是否包含有偏移地址组件,是则保存所述偏移地址组件,执行步骤S1,否则所述Java卡虚拟机等待接收所述主机下发指令,返回步骤S0;
步骤S1:所述Java卡虚拟机从所述偏移地址组件中获取第一偏移地址,根据所述第一偏移地址从保存的方法组件中获取第二偏移地址,根据所述第二偏移地址从保存的常量池组件中获取出预设长度的数据;
步骤S2:所述Java卡虚拟机判断所述获取到的数据中第一预设位置上的数据是否为第一预设值,是则执行步骤S3,否则所述Java卡虚拟机等待接收所述主机下发指令,返回步骤S1;
步骤S3:所述Java卡虚拟机判断所述获取到的数据中第二预设位置的最高位上的数据是否为第二预设值,是则执行步骤S4,否则执行步骤S6;
步骤S4:所述Java卡虚拟机根据所述获取到的数据中第二预设位置的除最高位之外的其他位上的数据,获取被管理数据信息所属的包的包ID,根据所述包ID从第二存储区中的包表中获取对应的导出表的地址;
步骤S5:所述Java卡虚拟机根据所述导出表的地址和所述获取到的数据中第三预设位置上的数据得到被管理数据的偏移地址,执行步骤S7;
步骤S6:所述Java卡虚拟机根据所述获取到的数据中第四预设位置上的数据和保存的被管理数据信息组件的起始地址得到所述被管理数据的偏移地址,执行步骤S7;
步骤S7:所述Java卡虚拟机用所述被管理数据的偏移地址替换所述方法组件中管理指令的卡外偏移地址;
所述访问数据的过程包括:
步骤P1:在所述Java卡虚拟机解释执行应用的Java程序的过程中,当检测到所述管理指令时,判断所述管理指令的类型是否为调用静态方法指令,是则执行步骤P2,否则所述Java卡虚拟机继续解释执行应用的其他Java程序,返回步骤P1;
步骤P2:所述Java卡虚拟机判断所述管理指令是否为调用第一存储区中的静态数据的调用静态方法指令,是则执行步骤P3,否则执行步骤P4;
步骤P3:所述Java卡虚拟机从所述管理指令中提取所述被调用的静态数据基于所述第一存储区的偏移地址,根据所述第一存储区的基地址和所述被调用的静态数据基于所述第一存储区的偏移地址计算所述被调用的静态数据的物理地址,执行步骤P5;
步骤P4:所述Java卡虚拟机从所述管理指令中提取所述被调用的静态数据基于所述第二存储区的偏移地址,根据所述第二存储区的基地址和所述被调用的静态数据基于所述第二存储区的偏移地址计算所述被调用的静态数据的物理地址,执行步骤P5;
步骤P5:所述Java卡虚拟机将所述被调用的静态数据的物理地址存储到指令寄存器中,所述Java卡虚拟机继续解释执行应用的其他Java程序,返回步骤P1。
2.如权利要求1所述的方法,其特征在于,所述被管理数据为静态方法,所述被管理数据信息为被调用静态方法,所述被管理数据信息组件为方法组件,所述管理指令为调用静态方法指令;
所述步骤S5包括:
步骤S501:所述Java卡虚拟机判断所述包ID是否小于第三预设值,是则执行步骤S502,否则执行步骤S503;
步骤S502:所述Java卡虚拟机将所述方法组件中的调用第二存储区中的静态方法的调用静态方法指令更改为调用第一存储区中的静态方法的调用静态方法指令,执行步骤S503;
步骤S503:所述Java卡虚拟机根据所述导出表的地址和所述获取到的数据中第三预设位置上的数据,从所述导出表中获取所述静态方法的偏移地址,执行步骤S7;
所述步骤S6包括:
步骤S601:所述Java卡虚拟机根据所述获取到的数据中第四预设位置上的数据获取第三偏移地址;
步骤S602:所述Java卡虚拟机根据所述第三偏移地址和所述方法组件的起始地址得到所述静态方法的物理地址;
步骤S603:所述Java卡虚拟机根据所述静态方法的物理地址和所述第二存储区的基地址得到所述静态方法基于所述第二存储区的偏移地址,执行步骤S7。
3.如权利要求1所述的方法,其特征在于,所述被管理数据为被创建对象的类型信息,所述被管理数据信息为被引用类型信息,所述被管理数据信息组件为类型信息组件,所述管理指令为创建对象指令;
所述步骤S5包括:
步骤S511:所述Java卡虚拟机判断所述包ID是否小于第三预设值,是则执行步骤S512,否则执行步骤S513;
步骤S512:所述Java卡虚拟机将所述方法组件中的被创建对象的类型信息在第二存储区中的创建对象指令更改为被创建对象的类型信息在第一存储区中的创建对象指令,执行步骤S513;
步骤S513:所述Java卡虚拟机根据所述导出表的地址和所述获取到的数据中第三预设位置上的数据,从所述导出表中获取所述被创建对象的类型信息的偏移地址,执行步骤S7;
所述步骤S6包括:
步骤S611:所述Java卡虚拟机根据所述获取到的数据中第四预设位置上的数据获取第三偏移地址;
步骤S612:所述Java卡虚拟机根据所述第三偏移地址和所述类型信息组件的起始地址得到所述被创建对象的类型信息的物理地址;
步骤S613:所述Java卡虚拟机根据所述被创建对象的类型信息的物理地址和所述第二存储区的基地址得到所被创建对象的类型信息基于所述第二存储区的偏移地址,执行步骤S7。
4.如权利要求3所述的方法,其特征在于,还包括创建对象的过程,所述创建对象的过程包括:
步骤B1:在所述Java卡虚拟机解释执行应用的Java程序的过程中,当检测到创建对象指令时,从所述创建对象指令的参数中获取指令码和被创建对象的类型信息的偏移地址;
步骤B2:所述Java卡虚拟机根据所述指令码判断被创建对象的类型信息是否在所述第一存储区中,是则执行步骤B3,否则执行步骤B4;
步骤B3:所述Java卡虚拟机根据所述第一存储区的基地址和所述被创建对象的类型信息的偏移地址得到被创建对象的类型信息的物理地址,执行步骤B5;
步骤B4:所述Java卡虚拟机根据所述第二存储区的基地址和所述被创建对象的类型信息的偏移地址得到被创建对象的类型信息的物理地址,执行步骤B5;
步骤B5:所述Java卡虚拟机从所述被创建对象的类型信息的物理地址中获取对象实例域的长度,根据所述对象实例域的长度和所述第二存储区中的给对象分配空间的起始地址获得被创建对象的物理地址;
步骤B6:所述Java卡虚拟机判断所述第二存储区中是否有剩余空间,是则执行步骤B7,否则返回错误信息,结束;
步骤B7:所述Java卡虚拟机根据所述被创建对象的物理地址和所述第二存储区的基地址计算所述被创建对象的偏移地址,并将所述被创建对象的偏移地址存储到堆栈寄存器中,继续解释执行应用的其他Java程序,返回步骤B1。
5.如权利要求4所述的方法,其特征在于,所述访问数据过程还包括:
步骤C1:在所述Java卡虚拟机解释执行应用的Java程序的过程中,当检测到被访问对象的标识时,从所述堆栈寄存器中获取所述被访问对象的偏移地址;
步骤C2:所述Java卡虚拟机判断所述被访问对象的偏移地址的最低位是否为所述第二预设值,是则执行步骤C3,否则执行步骤C4;
步骤C3:所述Java卡虚拟机根据所述第一存储区的基地址和所述被访问对象的偏移地址得到被访问对象的物理地址,根据所述被访问对象的物理地址在所述第一存储区中访问对象;
步骤C4:所述Java卡虚拟机根据所述第二存储区的基地址和所述被访问对象的偏移地址得到被访问对象的物理地址,根据所述被访问对象的物理地址在所述第二存储区中访问对象。
6.如权利要求4所述的方法,其特征在于,所述步骤B2具体为:所述Java卡虚拟机判断所述指令码是否为第二预设数据,是则所述被创建对象的类型信息在所述第一存储区中,执行步骤B3,否则被创建对象的类型信息在所述第二存储区中,执行步骤B4。
7.如权利要求4所述的方法,其特征在于,所述步骤B5包括:
所述Java卡虚拟机将所述被创建对象的类型信息的物理地址的第4字节上的数据作为对象实例域的长度;
所述Java卡虚拟机用所述第二存储区中的给对象分配空间的起始地址加上被创建对象的对象头的长度加上所述对象实例域的长度作为被创建对象的物理地址。
8.如权利要求5所述的方法,其特征在于,
所述Java卡虚拟机根据所述被创建对象的物理地址和所述第二存储区的基地址计算所述被创建对象的偏移地址,具体为:用所述被创建对象的类型信息的物理地址减去所述第二存储区的基地址得到所述被创建对象的类型信息基于所述第二存储区的偏移地址;
所述Java卡虚拟机根据所述第一存储区的基地址和所述被访问对象的偏移地址得到被访问对象的物理地址,具体为:所述Java卡虚拟机用所述第一存储区的基地址加上所述被访问对象的偏移地址得到所述被访问对象的物理地址;
所述Java卡虚拟机根据所述第二存储区的基地址和所述被访问对象的偏移地址得到被访问对象的物理地址,具体为:所述Java卡虚拟机用所述第二存储区的基地址加上所述被访问对象的偏移地址得到所述被访问对象的物理地址。
9.如权利要求1所述的方法,其特征在于,所述被管理数据为静态域,所述被管理数据信息为被引用类型信息,所述被管理数据信息组件为类型信息组件,所述管理指令为访问静态域指令;
所述步骤S5包括:所述Java卡虚拟机根据所述导出表的地址和所述获取到的数据中第三预设位置上的数据从所述导出表中获取所述静态域的偏移地址,执行步骤S7;
所述步骤S6包括:
步骤S621:所述Java卡虚拟机根据所述获取到的数据中第四预设位置上的数据获取被引用类型信息的偏移地址;
步骤S622:所述Java卡虚拟机根据所述被引用类型信息的偏移地址和所述类型信息组件的起始地址得到所述被引用类型信息的物理地址;
步骤S623:所述Java卡虚拟机根据所述被引用类型信息的物理地址和所述第二存储区的基地址得到所述静态域基于第二存储区的偏移地址,执行步骤S7。
10.如权利要求1所述的方法,其特征在于,所述被管理数据为实例域,所述被管理数据信息为被引用类型信息,所述被管理数据信息组件为类型信息组件,所述管理指令为访问实例域指令;
所述步骤S5包括:
步骤S531:所述Java卡虚拟机根据所述导出表的地址和所述获取到的数据中第三预设位置上的数据,从所述导出表中获取所述被引用类型信息的偏移地址;
步骤S532:所述Java卡虚拟机判断所述包ID是否小于第三预设值,是则执行步骤S533,否则执行步骤S534;
步骤S533:所述Java卡虚拟机根据所述被引用类型信息的偏移地址和第一存储区的基地址得到被引用类型信息的物理地址,执行步骤S535;
步骤S534:所述Java卡虚拟机根据所述被引用类型信息的偏移地址和所述第二存储区的基地址得到被引用类型信息的物理地址,执行步骤S535;
步骤S535:所述Java卡虚拟机从所述被引用类型信息的物理地址的第1字节上获取标志值,判断所述标志值中低位端起第5位上的数据是否为1,是则执行步骤S536,否则执行步骤S537;
步骤S536:所述Java卡虚拟机从所述被引用类型信息的物理地址的第2和第3字节上获取数据,根据所述获取的数据和所述第一存储区的基地址得到父类的类型信息的物理地址,执行步骤S538;
步骤S537:所述Java卡虚拟机从所述被引用类型信息的物理地址的第2和第3字节上获取数据,根据所述获取的数据和所述第二存储区的基地址得到父类的类型信息的物理地址,执行步骤S538;
步骤S538:所述Java卡虚拟机从所述父类的类型信息的物理地址的第4字节上获取数据,从所述获取到的数据中的第4字节上获取数据,将获取的两个数据相加得到实例域的偏移地址,执行步骤S7;
所述步骤S6包括:
步骤S631:所述Java卡虚拟机根据所述获取到的数据中第四预设位置上的数据获取所述被引用类型信息的偏移地址,根据所述被引用类型信息的偏移地址和所述类型信息组件的起始地址得到所述被引用类型信息的物理地址;
步骤S632:所述Java卡虚拟机从所述被引用类型信息的物理地址的第1字节上获取标志值,判断所述标志值中低位端起第5位上的值是否为1,是则执行步骤S633,否则执行步骤S634;
步骤S633:所述Java卡虚拟机从所述被引用类型信息的物理地址的第2和第3字节上获取数据,根据所述获取的数据和所述第一存储区的基地址得到父类的类型信息的物理地址,执行步骤S635;
步骤S634:所述Java卡虚拟机从所述被引用类型信息的物理地址的第2和第3字节上获取数据,根据所述获取的数据和所述第二存储区的基地址得到父类的类型信息的物理地址,执行步骤S635;
步骤S635:所述Java卡虚拟机从所述父类的类型信息的物理地址的第4字节上获取数据,从所述获取到的数据中第4字节上获取数据,将获取的两个数据相加得到实例域的偏移地址,执行步骤S7。
11.如权利要求1所述的方法,其特征在于,所述被管理数据为父方法,所述被管理数据信息为被引用类型信息,所述被管理数据信息组件为类型信息组件,所述管理指令为调用父方法指令;
所述步骤S5包括:
步骤S541:所述Java卡虚拟机判断所述包ID是否小于第三预设值,是则执行步骤S542,否则执行步骤S543;
步骤S542:所述Java卡虚拟机根据所述导出表的地址和所述获取到的数据中第三预设位置上的数据,从所述导出表中获取所述被引用类型信息的偏移地址,根据所述被引用类型信息的偏移地址和所述第一存储区的基地址得到所述被引用类型信息的物理地址;将所述方法组件中的调用第二存储区中的父方法的调用父方法指令更改为调用第一存储区中的父方法的调用父方法指令,执行步骤S544;
步骤S543:所述Java卡虚拟机根据所述导出表的地址和所述获取到的数据中第三预设位置上的数据,从所述导出表中获取所述被引用类型信息的偏移地址,根据所述被引用类型信息的偏移地址和所述第二存储区的基地址得到所述被引用类型信息的物理地址,执行步骤S544;
步骤S544:所述Java卡虚拟机根据所述获取到的数据中的第4字节上的数据和所述被引用类型信息的物理地址得到所述父方法的偏移地址,执行步骤S7;
所述步骤S6包括:
步骤S641:所述Java卡虚拟机根据所述获取到的数据中第四预设位置上的数据获取所述被引用类型信息的偏移地址,根据所述被引用类型信息的偏移地址和所述类型信息组件的起始地址得到所述被引用类型信息的物理地址;
步骤S642:所述Java卡虚拟机根据所述获取到的数据中的第4字节上的数据和所述被引用类型信息的物理地址得到所述父方法的偏移地址,执行步骤S7。
12.如权利要求1所述的方法,其特征在于,所述被管理数据为虚方法,所述被管理数据信息为被引用类型信息,所述被管理数据信息组件为类型信息组件,所述管理指令为调用虚方法指令;
所述步骤S5包括:
步骤S551:所述Java卡虚拟机判断所述包ID是否小于第三预设值,是则执行步骤S552,否则执行步骤S553;
步骤S552:所述Java卡虚拟机根据所述导出表的地址和所述获取到的数据中第三预设位置上的数据,从所述导出表中获取所述被引用类型信息的偏移地址,根据所述被引用类型信息的偏移地址和所述第一存储区的基地址得到所述被引用类型信息的物理地址,执行步骤S554;
步骤S553:所述Java卡虚拟机根据所述导出表的地址和所述获取到的数据中第三预设位置上的数据,从所述导出表中获取所述被引用类型信息的偏移地址,根据所述被引用类型信息的偏移地址和所述第二存储区的基地址得到所述被引用类型信息的物理地址,执行步骤S554;
步骤S554:所述Java卡虚拟机根据所述获取到的数据中第4字节上的数据和所述被引用类型信息的物理地址得到所述虚方法的物理地址;
步骤S555:所述Java卡虚拟机从所述虚方法的物理地址的第1字节上获取被调用虚方法的参数个数;
步骤S556:所述Java卡虚拟机根据所述参数个数和所述获取到的数据中第4字节上的数据得到所述虚方法的偏移地址,执行步骤S7;
所述步骤S6包括:
步骤S651:所述Java卡虚拟机根据所述获取到的数据中第四预设位置上的数据获取被所述引用类型信息的偏移地址,根据所述被引用类型信息的偏移地址和所述类型信息组件的起始地址得到所述被引用类型信息的物理地址;
步骤S652:所述Java卡虚拟机根据所述获取到的数据中第4字节上的数据和所述被引用类型信息的物理地址得到所述虚方法的物理地址;
步骤S653:所述Java卡虚拟机从所述虚方法的物理地址的第1字节上获取被调用虚方法的参数个数;
步骤S654:所述Java卡虚拟机根据所述参数个数和所述获取到的数据中第4字节上的数据得到所述虚方法的偏移地址,执行步骤S7。
13.如权利要求1所述的方法,其特征在于,所述静态数据为接口方法和/或虚方法,所述步骤P1中还包括:如判断所述管理指令的类型为调用接口方法指令或调用虚方法指令则执行步骤D1;
步骤D1:所述Java卡虚拟机从所述管理指令中获取被调用方法的序号和被调用方法的参数,根据所述被调用方法的参数从堆栈寄存器中获取被访问对象的偏移地址;
步骤D2:所述Java卡虚拟机判断所述被访问对象的偏移地址中最低位上的数据是否为所述第二预设值,是则执行步骤D3,否则执行步骤D4;
步骤D3:所述Java卡虚拟机根据第一存储区中的对象基地址和所述被访问对象的偏移地址得到被访问对象的物理地址,执行步骤D5;
步骤D4:所述Java卡虚拟机根据所述第二存储区中的对象基地址和所述被访问对象的偏移地址得到被访问对象的物理地址,执行步骤D5;
步骤D5:所述Java卡虚拟机从所述被访问对象的物理地址的第五预设位置上获取被访问对象的类型信息的物理地址,根据所述被访问对象的类型信息的物理地址读取被访问对象的类型信息;
步骤D6:所述Java卡虚拟机根据所述被调用方法的序号从所述被访问对象的类型信息中获取被调用方法的物理地址,执行步骤P5。
14.如权利要求13所述的方法,其特征在于,所述步骤D6具体包括:
步骤D61:所述Java卡虚拟机判断管理指令的类型,如为调用接口方法指令则执行步骤D62,如为调用虚方法指令则执行步骤D66;
步骤D62:所述Java卡虚拟机遍历被访问对象所属类型信息所实现的所有接口;
步骤D63:所述Java卡虚拟机判断所述调用接口方法指令中的接口类型的偏移地址是否包含在所述所有接口的偏移地址中,是则执行步骤D64,否则执行步骤D65;
步骤D64:所述Java卡虚拟机根据所述被调用接口方法的序号在所述被访问对象的类型信息中获取被调用方法的物理地址,执行步骤P5;
步骤D65:所述Java卡虚拟机在所述被访问对象的类型信息的第六预设位置上获取父类信息,从所述父类信息中获取所述被访问对象所属类型信息所实现的所有接口,返回步骤D63;
步骤D66:所述Java卡虚拟机从所述被访问对象的类型信息的第七预设位置上获取当前被调用虚方法列表的最小序号;
步骤D67:所述Java卡虚拟机判断所述最小序号是否小于所述被调用方法的序号,是则执行步骤D68,否则执行步骤D69;
步骤D68:所述Java卡虚拟机根据所述被调用方法的序号从所述被访问对象的类型信息中获取被调用方法的物理地址,执行步骤P5;
步骤D69:所述Java卡虚拟机在所述被访问对象的类型信息的第六预设位置上获取父类类型信息的偏移地址,根据所述父类类型信息的偏移地址获取父类类型信息,从所述父类类型信息中获取序号作为所述被调用方法的序号,返回步骤D67。
15.如权利要求14所述的方法,其特征在于,
所述步骤P1具体为:在所述Java卡虚拟机解释执行应用的Java程序的过程中,当检测到管理指令时,从所述管理指令中获取指令码,判断所述指令码的值,如为第一预设数据或第二预设数据则管理指令的类型为调用静态方法指令,执行步骤P2,如为第三预设数据或第四预设数据则管理指令的类型为调用接口方法指令或调用虚方法指令,执行步骤D1;
所述步骤P2具体为:所述Java卡虚拟机判断所述指令码的值是否为所述第二预设数据,是则执行步骤P3,否则执行步骤P4;
所述D61具体为:所述Java卡虚拟机判断所述指令码的值,如为所述第三预设数据则所述管理指令的类型为调用接口方法指令,如为所述第四预设数据则管理指令的类型为调用虚方法指令。
CN201310515600.7A 2013-10-28 2013-10-28 一种基于Java卡的数据管理方法 Active CN103559073B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201310515600.7A CN103559073B (zh) 2013-10-28 2013-10-28 一种基于Java卡的数据管理方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201310515600.7A CN103559073B (zh) 2013-10-28 2013-10-28 一种基于Java卡的数据管理方法

Publications (2)

Publication Number Publication Date
CN103559073A true CN103559073A (zh) 2014-02-05
CN103559073B CN103559073B (zh) 2016-05-25

Family

ID=50013326

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201310515600.7A Active CN103559073B (zh) 2013-10-28 2013-10-28 一种基于Java卡的数据管理方法

Country Status (1)

Country Link
CN (1) CN103559073B (zh)

Cited By (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103914326A (zh) * 2014-04-21 2014-07-09 飞天诚信科技股份有限公司 一种高效更新java指令的方法和装置
CN103955395A (zh) * 2014-04-28 2014-07-30 飞天诚信科技股份有限公司 一种可进行高效对象管理的方法及装置
CN105653351A (zh) * 2015-12-30 2016-06-08 北京博思汇众科技股份有限公司 java卡虚拟机的优化方法及系统
WO2018157716A1 (zh) * 2017-03-01 2018-09-07 天地融科技股份有限公司 一种智能卡
CN109240711A (zh) * 2018-08-06 2019-01-18 飞天诚信科技股份有限公司 一种java卡下载应用的方法及java卡
CN111026508A (zh) * 2019-12-11 2020-04-17 恒宝股份有限公司 一种java智能卡及其虚拟机组件优化方法
CN113326041A (zh) * 2021-08-02 2021-08-31 飞天诚信科技股份有限公司 一种虚方法的调用方法、电子设备及计算机可读存储介质
CN113835620A (zh) * 2021-08-13 2021-12-24 北京握奇智能科技有限公司 一种提高安全芯片应用执行效率的方法及系统

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20060184934A1 (en) * 2002-10-18 2006-08-17 Johan Karlberg Method and device for downloading settings for an application
CN101794310A (zh) * 2010-03-04 2010-08-04 北京握奇数据系统有限公司 一种处理智能卡数据库的方法、系统及装置
CN102087716A (zh) * 2011-03-02 2011-06-08 武汉天喻信息产业股份有限公司 一种多应用Java智能卡
CN102521145A (zh) * 2011-12-23 2012-06-27 东信和平智能卡股份有限公司 Java卡系统及其空间分配处理方法

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20060184934A1 (en) * 2002-10-18 2006-08-17 Johan Karlberg Method and device for downloading settings for an application
CN101794310A (zh) * 2010-03-04 2010-08-04 北京握奇数据系统有限公司 一种处理智能卡数据库的方法、系统及装置
CN102087716A (zh) * 2011-03-02 2011-06-08 武汉天喻信息产业股份有限公司 一种多应用Java智能卡
CN102521145A (zh) * 2011-12-23 2012-06-27 东信和平智能卡股份有限公司 Java卡系统及其空间分配处理方法

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
何利明 等: "JCVM中栈与帧的研究和设计", 《微型机与应用》 *
游代安 等: "Java卡应用的设计与实现", 《计算机工程与应用》 *

Cited By (15)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103914326B (zh) * 2014-04-21 2017-02-08 飞天诚信科技股份有限公司 一种高效更新java指令的方法和装置
CN103914326A (zh) * 2014-04-21 2014-07-09 飞天诚信科技股份有限公司 一种高效更新java指令的方法和装置
CN103955395A (zh) * 2014-04-28 2014-07-30 飞天诚信科技股份有限公司 一种可进行高效对象管理的方法及装置
CN103955395B (zh) * 2014-04-28 2017-02-22 飞天诚信科技股份有限公司 一种可进行高效对象管理的方法及装置
CN105653351B (zh) * 2015-12-30 2019-08-06 北京博思汇众科技股份有限公司 java卡虚拟机的优化方法及系统
CN105653351A (zh) * 2015-12-30 2016-06-08 北京博思汇众科技股份有限公司 java卡虚拟机的优化方法及系统
US10762408B2 (en) 2017-03-01 2020-09-01 Tendyron Corporation Smart card
WO2018157716A1 (zh) * 2017-03-01 2018-09-07 天地融科技股份有限公司 一种智能卡
CN109240711A (zh) * 2018-08-06 2019-01-18 飞天诚信科技股份有限公司 一种java卡下载应用的方法及java卡
CN111026508A (zh) * 2019-12-11 2020-04-17 恒宝股份有限公司 一种java智能卡及其虚拟机组件优化方法
CN111026508B (zh) * 2019-12-11 2023-08-18 恒宝股份有限公司 一种java智能卡及其虚拟机组件优化方法
CN113326041A (zh) * 2021-08-02 2021-08-31 飞天诚信科技股份有限公司 一种虚方法的调用方法、电子设备及计算机可读存储介质
CN113326041B (zh) * 2021-08-02 2021-11-02 飞天诚信科技股份有限公司 一种虚方法的调用方法、电子设备及计算机可读存储介质
CN113835620A (zh) * 2021-08-13 2021-12-24 北京握奇智能科技有限公司 一种提高安全芯片应用执行效率的方法及系统
CN113835620B (zh) * 2021-08-13 2024-05-24 北京握奇智能科技有限公司 一种提高安全芯片应用执行效率的方法及系统

Also Published As

Publication number Publication date
CN103559073B (zh) 2016-05-25

Similar Documents

Publication Publication Date Title
CN103559073A (zh) 一种基于Java卡的数据管理方法
CN104423929B (zh) 一种分支预测方法及相关装置
JP2014504768A (ja) 領域に基づくガベージ・コレクタを用いてクラスを漸進的にアンロードするための方法、コンピュータ・プログラム製品、および装置
Jacobsson et al. Virtual machine execution for wearables based on WebAssembly
CN108958730A (zh) 应用程序组件共享方法及装置、终端设备及可读存储介质
CN110032614A (zh) 基于wasm的地图矢量渲染方法和装置
CN103914326B (zh) 一种高效更新java指令的方法和装置
CN110187912A (zh) 一种节点选择方法和装置
CN101231597A (zh) 智能卡中java程序指令的执行方法
CN102520760B (zh) 一种用于任意波形产生系统的处理器
KR101485633B1 (ko) 산출장치, 시스템 관리장치, 산출방법 및 프로그램
CN105955833A (zh) 引擎调用方法和装置
CN103677778B (zh) 一种CAP文件Classref常量的解析方法
CN110609689A (zh) 一种应用的安装运行方法及装置
CN102118650A (zh) 一种电视机菜单显示方法、装置及电视机
CN108536480A (zh) 输入法配置方法及相关产品
CN102103489A (zh) 一种提高静态域访问指令执行效率的方法
CN110266821A (zh) 一种物联网监测大数据的存储系统
CN108037915A (zh) 一种获取json配置文件的方法及终端
CN108874491A (zh) 信息加载的方法及装置
CN104142817B (zh) 在Java应用中测量用户资源使用量的方法与装置
St-Amour et al. PICOBIT: a compact scheme system for microcontrollers
CN103793502B (zh) 即时编译器中一种基于云的热路径优化方法
Gao et al. Offload decision models and the price of anarchy in mobile cloud application ecosystems
CN108920246A (zh) 表单草稿组件共享方法及装置、终端设备及可读存储介质

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant