应用于智能卡虚拟机运行的控制装置及智能卡虚拟机转让专利

申请号 : CN201310345328.2

文献号 : CN104346132B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 孙慧盈陆继承张志敏李清俞军

申请人 : 上海复旦微电子集团股份有限公司

摘要 :

一种应用于智能卡虚拟机运行的控制装置及智能卡虚拟机,所述控制装置包括:取指控制单元、取指缓冲单元和预译码单元,所述取指控制单元输出各种控制信号控制取指缓冲单元进行读、写操作,所述取指缓冲单元的主要功能是实现字节码的缓冲,为预译码单元提供字节码,所述预译码单元完成从原指令集到新指令集的预译码功能。通过所述控制装置可以将智能卡虚拟机的基于堆栈操作的原指令转换为基于寄存器操作的新指令,所述控制装置可以有效提高智能卡指令执行速度,提高系统的处理性能,所述控制装置的可移植性、通用性更强。

权利要求 :

1.一种应用于智能卡虚拟机运行的控制装置,其特征在于,包括取指控制单元、取指缓冲单元和预译码单元,其中:所述取指控制单元适于输出取指指针至程序存储器,还适于输出读指针、写指针和写使能信号至所述取指缓冲单元;所述程序存储器包括复数个指令存储区,组成第一指令的字节码分配存储于至少一个所述指令存储区,所述第一指令为基于堆栈操作的指令集中的指令;

所述取指缓冲单元包括复数个缓冲存储区;所述取指缓冲单元适于在所述写使能信号有效时将所述取指指针指向的指令存储区中的字节码写入所述写指针指向的缓冲存储区,还适于读取所述读指针指向的缓冲存储区中的字节码至所述预译码单元;

所述预译码单元包括:指令转换单元、判断单元、字节读取信号输出单元、读指针控制信号输出单元;

所述指令转换单元适于在已读取的第一指令满足第一条件时将所述已读取的第一指令转换为第二指令,所述第二指令为基于寄存器操作的指令集中的指令;所述已读取的第一指令为由所述取指缓冲单元读取的字节码组成的第一指令,所述第一条件包括已读取的第一指令为预定类型组合的指令组;所述指令转换单元还适于在已读取的第一指令不为预定类型组合的指令组时将部分已读取的第一指令转换为第二指令;所述部分已读取的第一指令为预定类型组合的指令组;

所述判断单元适于判断所述已读取的第一指令是否可能与后续的第一指令构成预定类型组合的指令组;所述第一条件还包括所述判断单元的判断结果为否;

所述字节读取信号输出单元适于输出读字节数信号和转换字节数信号,所述读字节数信号携带的信息为每次读取的字节数,所述转换字节数信号携带的信息为本次被转换的第一指令包含的字节码的总数;

所述读指针控制信号输出单元适于在指令转换后输出追踪信号和回退信号,在本次被转换的第一指令包含的字节码的总数与已读取的第一指令包含的字节码的总数相等时将所述追踪信号设置为有效,否则将所述回退信号设置为有效。

2.如权利要求1所述的应用于智能卡虚拟机运行的控制装置,其特征在于,所述第一指令包括第一操作码和第一操作数;所述预译码单元还包括参数分离单元,所述参数分离单元适于对所述第一指令中的第一操作数进行处理以获得匹配于第二指令的第二操作数;

所述应用于智能卡虚拟机运行控制的装置还包括复数个寄存器,所述寄存器适于存储所述第二操作数。

3.如权利要求1所述的应用于智能卡虚拟机运行的控制装置,其特征在于,还包括译码执行单元;

所述预译码单元还适于在指令转换完成后输出有效的预译码完成信号至所述译码执行单元;所述译码执行单元适于在接收到所述有效的预译码完成信号后读取所述预译码单元转换得到的第二指令,以执行译码操作。

4.如权利要求2所述的应用于智能卡虚拟机运行的控制装置,其特征在于,还包括:译码执行单元;

所述预译码单元还适于在指令转换和第二操作数存储完成后输出有效的预译码完成信号至所述译码执行单元;所述译码执行单元适于在接收到所述有效的预译码完成信号后读取所述预译码单元转换得到的第二指令和存储于对应的寄存器中的第二操作数,以执行译码操作。

5.如权利要求1所述的应用于智能卡虚拟机运行的控制装置,其特征在于,所述取指控制单元包括:取指指针控制单元,适于程序指针确定所述取指指针的初始值,还适于在读取所述取指指针指向的指令存储区中的字节码后将所述取指指针的值加1;

写指针控制单元,适于在写入所述写指针指向的缓冲存储区后将所述写指针的值加1;

读指针控制单元,适于在读取所述读指针指向的缓冲存储区后将所述读指针的值加1,还适于在所述追踪信号有效时将参照读指针的值设置为所述读指针的值,还适于在所述回退信号有效时根据读字节数信号和转换字节数信号重置所述读指针和参照读指针的值;

写使能信号输出单元,适于在所述复数个缓冲存储区未填满或所述参照读指针与写指针的差值大于或等于2时输出有效的写使能信号。

6.如权利要求5所述的应用于智能卡虚拟机运行的控制装置,其特征在于,所述取指控制单元还包括:填满信号输出单元,适于在所述复数个缓冲存储区第一次填满时输出有效的填满信号。

7.如权利要求1所述的应用于智能卡虚拟机运行的控制装置,其特征在于,所述预定类型组合为L+S、L+E、L+B、E+S、L+L+E、L+L+B、L+E+S、L+L+E+S中的任一种;其中,L类为将存于局部变量区的操作数/常数放置于栈顶的指令,E类为执行栈顶操作的指令,B类为根据栈顶操作数判断是否跳转的指令,S类为将栈顶的操作数存至局部变量区的指令。

8.如权利要求3或4所述的应用于智能卡虚拟机运行的控制装置,其特征在于,所述译码执行单元还适于在执行译码操作后输出有效的指令请求信号;所述预译码单元还适于在接收到所述有效的指令请求信号时开始读取第一指令。

9.如权利要求1所述的应用于智能卡虚拟机运行的控制装置,其特征在于,所述取指缓冲单元为16字节容量的环形FIFO存储器。

10.如权利要求1所述的应用于智能卡虚拟机运行的控制装置,其特征在于,所述指令转换单元适于在时钟信号的下降沿执行指令转换,所述取指缓冲单元适于在所述时钟信号的上升沿读取字节码。

11.如权利要求2所述的应用于智能卡虚拟机运行的控制装置,其特征在于,所述寄存器适于在时钟信号的上升沿存储第二操作数。

12.如权利要求2所述的应用于智能卡虚拟机运行的控制装置,其特征在于,所述复数个寄存器包括位置寄存器、跳转辅助寄存器和常数寄存器中的至少一种。

13.如权利要求2所述的应用于智能卡虚拟机运行的控制装置,其特征在于,所述复数个寄存器包括8个常数寄存器和设于所述预译码单元中的3个位置寄存器,其中2个常数寄存器复用为跳转辅助寄存器;所述8个常数寄存器构成寄存器单元,所述寄存器单元的输出信号包括两组int型常数寄存器的输出信号、两组short型常数寄存器的输出信号和跳转辅助寄存器的输出信号。

14.一种智能卡虚拟机,包括程序存储器和指令执行单元,所述指令执行单元用于执行译码后的第二指令,其特征在于,还包括权利要求1至13任一项所述的应用于智能虚拟机运行的控制装置。

说明书 :

应用于智能卡虚拟机运行的控制装置及智能卡虚拟机

技术领域

[0001] 本发明涉及智能卡领域,尤其涉及一种应用与智能卡虚拟机运行的控制装置及智能卡虚拟机。

背景技术

[0002] Java技术凭借其平台无关性、灵活性以及安全性等优势被广泛的应用在嵌入式系统中,同时智能卡也已经被广泛应用在手机、音乐播放器、数字电视等各种产品中,Java卡是在智能卡硬件系统基础上,在卡内通过软件构建的一个支持Java程序下载、安装和运行的软硬件系统,Java卡作为Java技术与智能卡技术融合的产物,已被广泛的应用在智能卡领域。
[0003] Java卡本身具有Java语言的特点,其通过Java卡虚拟机(JCVM,Java  Card Virtual Machine)对指令进行解释执行,Java卡虚拟机为智能卡带来了Java语言的多种显而易见的优点,但同时,Java卡虚拟机也存在一个阻碍Java卡持续发展的缺点,由于Java卡虚拟机并不是一种物理结构,而是一种解释用于硬件平台的字节码的独立的操作环境,软件实现的Java虚拟机存在指令处理速度慢、效率低等问题,直接影响Java卡的运行速度。
[0004] Java卡虚拟机在执行指令处理时是基于堆栈的处理模式,即在指令处理的时候,在没有特别指定参数的情况下默认执行栈顶的操作数,而操作数并不总是在栈顶,因此会带来很多额外的操作,例如,在执行load、push等操作时,需要先将存放在局部变量区的操作数置于操作数栈顶,在执行store等操作时,需要将在操作数栈顶的操作数再写回局部变量区等。根据统计,这些load、push和store等的操作在程序执行中频率相当高,使得基于堆栈处理模式的java卡虚拟机的指令处理效率非常低。
[0005] 目前解决基于堆栈处理模式的java卡虚拟机的指令处理效率低的问题的方法是利用指令折叠原理对java程序进行优化。目前常用的方法是通过硬件实施指令折叠,即当程序在java卡上运行的时候,判断一组指令是否可以折叠,若可以折叠,则通过相应的硬件实现对于这组指令的后续处理,例如对所述指令组中的参数进行分离、处理以及存储等操作,最后生成一条等价的本地指令去让本地CPU执行。
[0006] 但现有技术中采用硬件实施指令折叠的方式也存在很多问题,采用硬件实施指令折叠的方式增加了硬件的复杂度,硬件上需要支持指令的预取功能、指令是否可以折叠的判断功能、以及从执行中分离参数等功能,硬件设计的复杂度会提升,从而带来硬件时钟周期、硬件面积和系统功耗增加的问题。而且所述硬件实施指令折叠的方式只能针对当前CPU具体型号进行相应的处理,即对应不同的CPU需要定制不同的硬件指令折叠方案,所述硬件指令折叠方案大多是成套的方案,都是高度定制的,指令折叠后只能继续按照方案既定方式解释执行,无法轻易将指令折叠实施部分进行通用性的移植,其通用性受到很大限制。

发明内容

[0007] 本发明解决的问题是基于堆栈处理模式的java卡虚拟机的指令处理效率低的问题。
[0008] 为解决上述问题,本发明提供一种应用于智能卡虚拟机运行的控制装置,所述装置包括:包括取指控制单元、取指缓冲单元和预译码单元,其中:
[0009] 所述取指控制单元适于输出取指指针至程序存储器,还适于输出读指针、写指针和写使能信号至所述取指缓冲单元;所述程序存储器包括复数个指令存储区,组成第一指令的字节码分配存储于至少一个所述指令存储区,所述第一指令为基于堆栈操作的指令集中的指令;
[0010] 所述取指缓冲单元包括复数个缓冲存储区;所述取指缓冲单元适于在所述写使能信号有效时将所述取指指针指向的指令存储区中的字节码写入所述写指针指向的缓冲存储区,还适于读取所述读指针指向的缓冲存储区中的字节码至所述预译码单元;
[0011] 所述预译码单元包括指令转换单元,所述指令转换单元适于在已读取的第一指令满足第一条件时将所述已读取的第一指令转换为第二指令,所述第二指令为基于寄存器操作的指令集中的指令;所述已读取的第一指令为由所述取指缓冲单元读取的字节码组成的第一指令,所述第一条件包括已读取的第一指令为预定类型组合的指令组。
[0012] 可选的,所述第一指令包括第一操作码和第一操作数;所述预译码单元还包括参数分离单元,所述参数分离单元适于对所述第一指令中的第一操作数进行处理以获得匹配于第二指令的第二操作数。所述应用于智能卡虚拟机运行控制的装置还包括复数个寄存器,所述寄存器适于存储所述第二操作数。
[0013] 可选的,所述装置还包括译码执行单元,所述预译码单元还适于在指令转换完成后输出有效的预译码完成信号至所述译码执行单元;所述译码执行单元适于在接收到所述有效的预译码完成信号后读取所述预译码单元转换得到的第二指令,以执行译码操作[0014] 可选的,所述装置还包括译码执行单元,所述预译码单元还适于在指令转换和第二操作数存储完成后输出有效的预译码完成信号至所述译码执行单元;所述译码执行单元适于在接收到所述有效的预译码完成信号后读取所述预译码单元转换得到的第二指令和存储于对应的寄存器中的第二操作数,以执行译码操作。
[0015] 可选的,所述预译码单元还包括:
[0016] 判断单元,适于判断所述已读取的第一指令是否可能与后续的第一指令构成预定类型组合的指令组;所述第一条件还包括所述判断单元的判断结果为否;
[0017] 字节读取信号输出单元,适于输出读字节数信号和转换字节数信号,所述读字节数信号携带的信息为每次读取的字节数,所述转换字节数信号携带的信息为本次被转换的第一指令包含的字节码的总数;
[0018] 读指针控制信号输出单元,适于在指令转换后输出追踪信号和回退信号,在本次被转换的第一指令包含的字节码的总数与已读取的第一指令包含的字节码的总数相等时将所述追踪信号设置为有效,否则将所述回退信号设置为有效;
[0019] 所述指令转换单元还适于在已读取的第一指令不为预定类型组合的指令组时将部分已读取的第一指令转换为第二指令;所述部分已读取的第一指令为预定类型组合的指令组。
[0020] 可选的,所述取指控制单元包括:
[0021] 取指指针控制单元,适于程序指针确定所述取指指针的初始值,还适于在读取所述取指指针指向的指令存储区中的字节码后将所述取指指针的值加1;
[0022] 写指针控制单元,适于在写入所述写指针指向的缓冲存储区后将所述写指针的值加1;
[0023] 读指针控制单元,适于在读取所述读指针指向的缓冲存储区后将所述读指针的值加1,还适于在所述追踪信号有效时将参照读指针的值设置为所述读指针的值,还适于在所述回退信号有效时根据读字节数信号和转换字节数信号重置所述读指针和参照读指针的值;
[0024] 写使能信号输出单元,适于在所述复数个缓冲存储区未填满或所述参照读指针与写指针的差值大于或等于2时输出有效的写使能信号。
[0025] 可选的,所述取指控制单元还包括:填满信号输出单元,适于在所述复数个缓冲存储区第一次填满时输出有效的填满信号。
[0026] 可选的,所述预定类型组合为L+S、L+E、L+B、E+S、L+L+E、L+L+B、L+E+S、L+L+E+S中的任一种;其中,
[0027] L类为将存于局部变量区的操作数/常数放置于栈顶的指令,E类为执行栈顶操作的指令,B类为根据栈顶操作数判断是否跳转的指令,S类为将栈顶的操作数存至局部变量区的指令。
[0028] 可选的,所述译码执行单元还适于在执行译码操作后输出有效的指令请求信号;所述预译码单元还适于在接收到所述有效的指令请求信号时开始读取第一指令。
[0029] 可选的,所述取指缓冲单元为16字节容量的环形FIFO存储器。
[0030] 可选的,所述指令转换单元适于在时钟信号的下降沿执行指令转换,所述取指缓冲单元适于在所述时钟信号的上升沿读取字节码。
[0031] 可选的,所述寄存器适于在时钟信号的上升沿存储第二操作数。
[0032] 可选的,所述复数个寄存器包括位置寄存器、跳转辅助寄存器和常数寄存器中的至少一种。
[0033] 可选的,所述复数个寄存器包括8个常数寄存器和设于所述预译码单元中的3个位置寄存器,其中2个常数寄存器复用为跳转辅助寄存器;所述8个常数寄存器构成寄存器单元,所述寄存器单元的输出信号包括两组int型常数寄存器的输出信号、两组short型常数寄存器的输出信号和跳转辅助寄存器的输出信号。
[0034] 本发明还提供一种智能卡虚拟机,包括程序存储器和指令执行单元,所述指令执行单元用于执行译码后的第二指令,还包括如上所述的应用于智能虚拟机运行的控制装置。
[0035] 与现有技术相比,本发明的技术方案具有以下优点:
[0036] 通过取指控制单元、取指缓冲单元以及预译码单元可以将基于堆栈操作的Java卡虚拟机原指令集的指令转化为基于寄存器操作的新指令集中的指令,基于寄存器操作的新指令集较原有基于堆栈操作的原指令集减少了很多指令,使得新指令集的指令密度增加,新指令集中的指令执行速度可以有效提高,提高系统的处理性能。
[0037] 通过应用于智能卡虚拟机运行的控制装置中的寄存器来存储在预译码单元所产生的匹配新指令的操作数,利用较小的硬件代价即可实现从基于堆栈操作的原指令转化为基于寄存器操作的新指令。
[0038] 前级预译码单元可以与后级译码执行单元可以形成二级流水,有效提高指令的处理速度。
[0039] 现有技术中在将基于堆栈操作的原指令转化为基于寄存器操作,只可以针对具体的CPU,进行具体的硬件设计,具有高度定制性,无法轻易的将针对具体的CPU设计的硬件进行通用性的移植,本发明的提供的应用于智能卡虚拟机运行的控制装置可以进行通用性的移植,可以被应用于各种智能卡系统中,使得各种智能卡系统的通用型CPU都可以简单、方便实现执行基于寄存器操作的新指令的功能,所述控制装置的可移植性、通用性更强,有效提高各种智能卡系统的指令的处理效率,提高系统性能。
[0040] 本发明提供的应用于智能卡虚拟机运行的控制装置在基于堆栈操作的原指令转化为基于寄存器操作的新指令的过程中,可以在智能卡上直接处理,在程序被下载到智能卡前,不需要对所下载的程序做额外的处理,且所述控制装置无需付出更多的硬件资源,且不需要改动通用的CPU的流水线结构,所述控制装置的通用性更强。

附图说明

[0041] 图1是基于堆栈处理模式的指令处理示意图;
[0042] 图2是基于寄存器组处理模式的指令处理示意图;
[0043] 图3是本发明技术方案提供的应用于智能卡虚拟机运行的控制装置的示意图;
[0044] 图4是本发明实施例提供的应用于智能卡虚拟机运行的控制装置的示意图;
[0045] 图5是本发明实施例提供的取指控制单元的接口示意图;
[0046] 图6是本发明实施例提供的取指缓冲单元的接口示意图;
[0047] 图7是本发明实施例提供的预译码单元的接口示意图;
[0048] 图8是本发明实施例提供的取指控制单元控制取指缓冲单元FIFO进行写操作的状态示意图;
[0049] 图9是本发明实施例提供的取指控制单元控制取指缓冲单元FIFO进行读操作的状态示意图
[0050] 图10是本发明实施例提供的设置过程和回退过程的示意图;
[0051] 图11是本发明实施例提供的寄存器单元的接口示意图;
[0052] 图12是本发明实施例提供的预译码单元的状态示意图;
[0053] 图13是本发明实施例提供的应用于智能卡虚拟机运行的控制装置的接口示意图。

具体实施方式

[0054] 如背景技术所述,Java卡虚拟机是基于堆栈的处理模式,Java卡虚拟机执行的指令中许多是读操作以及存储操作类型的指令。在执行指令的过程,通常默认执行的是操作数栈顶的操作数,如果操作数位于局部变量区时,就需先将局部变量区的变量读取到操作数栈中,在执行操作后,一般将操作结果直接写回操作数栈顶,然后再将所述操作结果存储到局部变量区,这就使得局部变量区与操作数栈之间的读写频繁发生。例如,图1是Java中C=A+B操作在Java卡虚拟机上的执行过程,该加法运算的两个操作数都来自局部变量区,因而需要用两条读指令将两个操作数装载到操作数栈的栈顶,具体地,通过sload_1指令将操作数A读入到操作数栈的栈顶(tos)位置处,再通过sload_2指令将操作数B读入到操作数栈的栈顶位置处,然后将栈顶的操作数(tos位置处的操作数B)和栈顶减1处的操作数(tos-1位置处的操作数A)执行sadd指令,将运算结果C写回操作数栈顶(tos),然后再执行sstore指令,将运算结果存储到局部变量区。上述过程中,四条指令中的三条指令都是局部变量区与操作数栈之间的读、写操作,这个过程是典型的基于堆栈的指令集操作过程。由上述过程可以看出,基于堆栈处理模式的java卡虚拟机的指令处理效率是很低的。
[0055] 仍以Java中C=A+B操作为例,如果是基于寄存器组的操作,则整个执行过程可以如图2所示,将局部变量中的两个操作数A和B相加后将结果C存储在另一个局部变量中,如果可以将类似于图1所示的复杂的堆栈操作中的局部变量区与操作数栈之间的读、写操作可以省略掉,而直接转变成图2所示的类似于寄存器组的操作,那么Java卡虚拟机处理程序的效率会更加高效、快速。
[0056] 由于基于寄存器组的操作最大的特点是操作数的读取操作和写回操作可以是在寄存器组的任意位置,这点对于指令集执行时非常高效的。由于Java卡虚拟机中的堆栈通常是用卡上的RAM来实现的,而RAM的随机存取特性使得可以实现对于堆栈中的各变量随意的读取与写回,在本文中将所述对于堆栈中的各变量随意的读取与写回的操作称作基于寄存器组的操作,所以,由于RAM的特性,可以将基于堆栈的操作转换为基于寄存器组的操作。
[0057] 指令折叠的原理就是通过将基于堆栈的操作转换成类似基于寄存器组的操作,使堆栈任意位置可读写,通过指令折叠的方法可以让前后有数据依赖关系并满足折叠条件的一组指令合并成一条等价的指令进行执行,从而避免局部变量区和操作数栈之间频繁的读写操作,凡是涉及操作数栈的读取操作和写回操作的指令,都是可以利用指令折叠技术来实现的指令的加速执行的,通过所述指令折叠技术可以有效解决Java卡虚拟机指令处理耗时长、效率低的问题。
[0058] 在Java卡平台上,Java卡虚拟机可以执行的指令集是在JCVM2.2规范中定义的由185条指令组成的指令集。所述185条指令可以被分为L、E、B、S以及Complex几个大类。其中,L类为将存于局部变量区的操作数/常数放置于栈顶的指令,E类为执行栈顶操作的指令,S类为将栈顶的操作数存至局部变量区的指令,B类为根据栈顶操作数判断是否跳转的指令,Complex类为复杂指令。
[0059] 在所述的185条指令中,其中L类的指令有35条,S类的指令有15条,E类的指令有29条,B类的指令有32条,Complex类型的指令有74条。在所述185条指令中,L、S、B和E类的指令有111条,占了整个指令集的60%,经过多次的仿真测试,统计得到在Java卡虚拟机执行程序的过程中,上述L、S、B和E类指令在整个程序的运行过程中出现的比例,请参见表1。
[0060] 表1:
[0061]
[0062] 从上述表中可以看出,L、S、B和E类指令在整个程序的运行过程中总的出现的比例高达78%,所述L、S、B和E类指令相对Complex类型的指令而言,操作比较简单,但出现的频率却比较高,在本技术方案中,对L、S、B和E类指令采用较小的硬件代价对其进行指令折叠,以取得了有效的加速效果。
[0063] 本发明技术方案构造了基于寄存器组操作的新指令集来实现指令折叠技术。构造的新指令集在执行时是基于寄存器操作的,新指令集可以与原指令集有一定的对应性,为了保证指令集的完整性,除了考虑到对上述L、S、B和E类指令进行指令折叠构造新指令外,也需要涵盖不太适合进行指令折叠的Complex类型的指令,而且新的指令集应该尽可能的少且尽量简单,例如,为了使得构造新指令的方法简单化,可以使得构造得到的新指令的长度固定,具体地,例如,可以使得构造得到的新指令的长度都是单字节的,在本技术方案中,以构造得到的新指令的长度为单字节长度为例进行说明。
[0064] Java卡虚拟机可以执行的原指令集中定义的指令一般是由操作码和参数组成的,有的指令只有操作码而没有参数,有的指令的操作码中会隐藏含有参数信息,在新指令的构造过程中,可以将原指令集中的指令的参数进行分离,并将其存储到寄存器中,而将原指令的操作码作为新指令的操作码,通过这样的方法,可以将各种可以折叠的指令组合均合并处理为新指令集中的单条指令。
[0065] 从表一可以看出,L类的指令和S类的指令共占有50条,出现的比例之和近54%,这两类指令完成的操作是操作数栈的读取与写回操作,从本质上讲,这两类指令都是表示数据转移的指令,只是针对具体的单条指令其数据转移的位置可能不同,在本技术方案中,构造新的指令来代替这两类数据转移的指令。例如,可以定义两条新指令smov和imov来代替这两类指令,具体地,smov和imov可以分别表示16位和32位数据的转移指令,16位数据是指short型数据、reference型数据,32位数据是指int型数据,这些都是JCVM2.2.2支持的数据类型。当遇到L类与S类指令时,将指令中的参数进行分离,并存储到相应的寄存器中,就可以构成新的指令smov或imov。具体地,可以预先设置位置寄存器以及常数寄存器,将L类或者S类型的指令中参数分离后,将操作数的来源位置存放在位置寄存器R1中,将操作结果的存放位置,即目标位置存放在位置寄存器R2中,将数据操作中涉及的常数存放在常数寄存器中,而新指令所要执行的操作就是将数据从位置寄存器R1标记的位置取出,存储到位置寄存器R2标记的位置,两条新指令操作简单,涵盖了50条L类以及S类的指令。对于L+S类型的指令,其实质上执行的也是数据的转移,同样可以用上述给出的两条新指令smov和imov实现L+S类型的指令折叠,新指令执行的操作依然是将位置寄存器R1中标记位置的数据存入位置寄存器R2标记位置。位置寄存器R1和R2均为9位,第9位是标志位。
[0066] 基于上述对于L类和S类指令构造新指令的方法,同样可以对E类以及B类的指令构造新的指令。
[0067] 对于E类指令,E类新指令与原指令集中的E类指令一一对应的,新指令可以为单字节长度,同时新指令可以使用对应的原指令的操作码,E类原指令操作数来自操作数栈顶,运算后结果也再存入操作数栈顶,而构造的E类新指令,操作数来源位置与结果存放位置则更加广义,可以使用预先设置的位置寄存器来辅助完成操作,对于单操作数的E类指令,只需要复用上述两个位置寄存器R1和R2,此时执行的操作是从位置寄存器R1标记位置取数据进行相应的运算后将得到的结果存到位置寄存器R2标记的位置,对于两个操作数的E类新指令,则除了复用位置寄存器R1和R2外,还需要多一个存放操作结果存储位置的位置寄存器R3,执行的操作是从位置寄存器R1和R2标记的两个位置取操作数进行运算,结果存入位置寄存器R3标记的位置。位置寄存器R3为9位,第9位是标志位。
[0068] 仍以图1为例,如图1所示,sload_1、sload_2、add和sstore_1这四条指令分别属于L类、L类、E类和S类,将这四条基于堆栈操作的指令可以转变为一条基于寄存器组操作的指令,即可以将上述四条指令折叠为一条指令,在折叠之后省去了操作数栈的读取与写回操作,具体地,可以将操作数A的位置存放在位置寄存器R1中,可以将操作数B的位置存放在位置寄存器R2中,折叠后的指令执行时,则可以从位置寄存器R1、R2标记的两个位置取操作数进行运算,结果存入位置寄存器R3标记的位置,这样实现了L+L+E+S类指令的折叠,同理,L+E类、E+S类、L+L+E类和L+E+S类指令折叠都可以合并为单条E类新指令。
[0069] 不难分析,上面四条指令之所以可以折叠是因为整个操作过程涉及到了先将操作数存储到操作数栈,处理器从操作数栈顶读取操作数,将处理结果先写回到操作数栈顶,再从操作数栈顶写回到局部变量区,四条指令均为操作数栈的读取操作和写回操作的指令,因此可以通过指令折叠的方法,将所述四条基于堆栈的指令折叠为一条等价的基于寄存器组的指令进行执行,上述是对于四条指令的折叠,基于上述指令折叠的方法,对于两条、三条的基于堆栈的指令同样可以折叠为一条等价的基于寄存器组的指令。
[0070] 对于B类指令,与E类构造新指令类似,B类新指令可以为单字节长度的指令,并保留对应的原指令的操作码。原指令集中B类条件跳转指令共32条,其中16条为短跳转指令,16条为长跳转指令,并且所述短跳转指令和长跳转指令除了跳转偏移量长度不同外,其它都是一一对应的,所以,在本实施例中,将短跳转指令中带有的单字节跳转偏移量有符号地扩展成两个字节,则用同一条新的指令可以代替原指令中对应的长跳转指令和短跳转指令两条指令,使构造的新指令对应原指令集中的B类指令数目减半。
[0071] 类似于E类新指令的操作,对于单操作数的B类新指令,从位置寄存器R1的标记位置取得操作数,对于双操作数的B类新指令,分别从位置寄存器R1和R2的标记位置取得两个操作数,不同的是,由于跳转指令都带有跳转偏移量参数,所以新的B类指令在执行时需要额外的一个存储跳转偏移量参数的跳转寄存器来辅助执行,将原指令的偏移量参数从原指令中分离存入跳转寄存器中,在程序判断需要执行跳转指令时,程序计数器累加跳转寄存器中的跳转偏移量进行跳转。不难理解,构造的B类新指令即包括了原B类指令,又可以包括了L+B以及L+L+B两类指令的折叠情况。
[0072] 对于Complex类指令,Complex类型的指令为复杂指令,例如数组操作、堆栈管理、方法调用与返回操作等类型的指令,此类指令执行过程非常复杂,在处理时,应用于智能卡虚拟机运行的控制装置不对其进行执行,交由系统软件进行处理,软件处理所述Complex类型指令时,会中断所述应用于智能卡虚拟机运行的控制装置,执行完后再重新启动所述应用于智能卡虚拟机运行的控制装置。在构造新指令集的过程中,新指令集应该与原指令集是对应的,新指令集也应该是完善的,因此也需要对应的构造Complex类型的新指令,在构造Complex类型的新指令时,一种简单的方法可以是只要保证新指令集与原指令集中的Complex类型指令的操作码一致。在本技术方案中,为了保证新指令集长度对齐,新的指令集可以都设置为单字节的长度,构造的新指令集中的Complex类指令也可以是单字节的,但这样可能在构造新的Complex类指令时只能保留原Complex类指令的操作码。在其它实施例中,在构造新的Complex类指令时,可以将构造得到的新指令设置为多个字节,用于保存Complex类指令的存储操作码之后的几个字节(例如3个字节)的字节码内容。
[0073] 由上述叙述可知,可以折叠的指令的组合类型可以为L+S、L+E、L+B、E+S、L+L+E、L+L+B、L+E+S和L+L+E+S,在本文中,将上述可以折叠的指令的组合类型定义为预定类型组合,当基于堆栈的指令组满足上述预定类型组合时,则可以通过指令折叠方法,将其折叠为一条基于寄存器组的指令,表2给出了原指令集和新指令集的对比关系。
[0074] 表2:
[0075]
[0076] 新指令集与原指令集相比具有以下优点,新指令集是基于寄存器组操作的指令集,新指令集相对简单且都只有单字节,新指令集较原指令集减少了64条指令,新指令集的指令密度更大,执行速度更快。
[0077] 经过指令折叠,在执行指令的过程中,可以将多条基于堆栈操作的指令转换为一条等效的基于寄存器操作的指令,节省了执行操作数栈操作的时间,从而达到加速执行指令的效果。发明人对折叠指令的结果做了大量的试验与仿真测试,得到在采用上述指令折叠的方法指令执行的过程中,可以减少73%的堆栈操作,堆栈操作的加速比可以达到3.72,总的加速比可以达到1.26。
[0078] 上述指令折叠的方案,给出了最多对四指令进行折叠(L+L+E+S)的方法,在其它实施方式中,本领域技术人员也可以采用类似方法得到对更多指令数目进行折叠,在折叠的过程中可以采用更多的寄存器等硬件进行辅助执行。
[0079] 基于上述分析,本发明技术方案提供一种应用于智能卡虚拟机运行的控制装置,在本装置中,当程序在java卡虚拟机上运行时,利用指令折叠原理进行卡上的折叠,得到一套基于寄存器实现的新指令,减少堆栈数据访问的次数,加快java卡的解释执行速度。
[0080] 图3是本发明技术方案提供的应用于智能卡虚拟机运行的控制装置的示意图,所述控制装置1包括取指控制单元11、取指缓冲单元12和预译码单元13,其中:
[0081] 所述取指控制单元11适于输出取指指针jFC至程序存储器3,还适于输出读指针、写指针和写使能信号至所述取指缓冲单元12;所述程序存储器3包括复数个指令存储区,组成第一指令的字节码分配存储于至少一个所述指令存储区,所述程序存储器可以为ROM等,所述第一指令为基于堆栈操作的指令集中的指令,即所述第一指令为Java卡虚拟机中的原指令集中的指令。
[0082] 所述取指缓冲单元12包括复数个缓冲存储区;所述取指缓冲单元12适于在所述写使能信号有效时将所述取指指针jFC指向的指令存储区中的字节码写入所述写指针指向的缓冲存储区,还适于读取所述读指针指向的缓冲存储区中的字节码至所述预译码单元;
[0083] 所述预译码单元13包括指令转换单元131,所述指令转换单元131适于在已读取的第一指令满足第一条件时将所述已读取的第一指令转换为第二指令,所述第二指令为基于寄存器操作的指令集中的指令,即所述第二指令为基于寄存器操作的新指令集中的指令;所述已读取的第一指令为由所述取指缓冲单元12读取的字节码组成的第一指令,所述第一条件包括已读取的第一指令为预定类型组合的指令组。
[0084] 为使本发明技术方案的上述目的、特征和优点能够更为明显易懂,下面结合附图和实施例对本发明技术方案做进一步的说明。
[0085] 图4是本发明实施例提供的应用于智能卡虚拟机运行的控制装置的示意图,在本实施例中,所述控制装置包括取指控制单元21、取指缓冲单元22、预译码单元23、寄存器单元24和译码执行单元25。
[0086] 取指控制单元21的主要功能是输出控制信号,使取指缓冲单元22缓冲字节码的功能正常。所述控制信号可以为取指指针jFC信号、读指针RP信号、写指针WP信号以及写使能wr_ack信号等。通过取指控制单元21的输出的各种控制信号控制取指缓冲单元22进行读、写操作。
[0087] 所述取指控制单元21可以包括取指指针控制单元、写指针控制单元、读指针控制单元以及写使能信号输出单元。所述取指控制单元21还包括:填满信号输出单元,适于在所述复数个缓冲存储区第一次填满时输出有效的填满信号full。
[0088] 取指缓冲单元22的主要功能是实现字节码的缓冲,为预译码单元23提供字节码。在本实施例中,所述取指缓冲单元22可以为16字节容量的环形的先入先出(FIFO)存储器,为了加大预译码级指令的吞吐量,可以采用16位输出线。
[0089] 预译码单元23是所述应用于智能卡虚拟机运行的控制装置的核心部分,完成从原指令集到新指令集的预译码功能,主要功能是配合取指指令正确读入字节码,针对不同的字节码,判断能否将读入的字节码进行折叠组合,并构造新指令,将所述新指令输出。所述预译码单元23可以包括指令转换单元、判断单元、字节读取信号输出单元、读指针控制信号输出单元以及参数分离单元。
[0090] 图5是本发明实施例提供的取指控制单元的接口示意图,图6是本发明实施例提供的取指缓冲单元的接口示意图,图7是本发明实施例提供的预译码单元的接口示意图,下面结合图5至图7给出了各单元的接口对应用于智能卡虚拟机运行的控制装置中的各单元进行详细叙述。
[0091] 在所述控制装置启动后,由取指控制单元控制FIFO(即所述取指缓冲单元)进行读操作和写操作。取指控制单元首先获得此时的程序指针PC的值,通过取指指针控制单元将所述程序指针PC的值确定为取指指针jFC的初始值,并将所述取指指针jFC的值输出给ROM。
[0092] 在取指控制单元中,设置了读指针RP、写指针WP以及参照读指针RP_behind等多个指针,所述读指针RP、写指针WP以及参照读指针RP_behind其初始状态均指向FIFO的第一个缓冲存储区,其中,所述读指针RP、写指针WP输出给FIFO,参照读指针RP_behind是取指控制单元的内部信号,其不会被输出到其它单元。
[0093] 图8为取指控制单元控制取指缓冲单元FIFO进行写操作的状态示意图,如图8所示,包括:空闲(Idle)状态、等待(Wait)状态、指针赋值(PC2jFC)状态、填充(Fill)状态和可写(write)状态。
[0094] 在写操作开始时,先进入Idle状态,然后进入PC2jFC状态,将取指控制单元启动时的程序指针PC的值赋值给取指指针jFC,作为取指指针jFC的初始值,然后进入Fill状态开始对FIFO进行填充。
[0095] 取指控制单元输出写指针WP到FIFO,从取指指针jFC指向的ROM开始读取字节码,并将所读取的字节码写入到写指针WP所指向的FIFO中,取指指针控制单元在读取所述取指指针jFC指向的ROM中的字节码后将所述取指指针jFC的值加1,写指针控制单元在写入所述写指针WP指向的缓冲存储区后将所述写指针WP的值加1,在所述FIFO被第一次填满时,取指控制单元中的填满信号输出单元会输出有效的填满信号full,然后进入Wait状态。
[0096] 在预译码单元执行指令转换的过程中,会不断的消耗已填充的字节码,当消耗掉字节码后,取指控制单元会给FIFO输出写使能信号wr_ack,取指控制单元控制FIFO进入write(可写)状态,不断的向FIFO写入字节码,在取指控制单元停止工作时,则输入复位信号rst_n。
[0097] 图9为取指控制单元控制取指缓冲单元FIFO进行读操作的状态示意图,包括:空闲(Idle)状态、等待(Wait)状态、回退(Back)状态、设置(Set)状态、读一字节(read_one)状态和读双字节(read_two)状态。
[0098] 在取指控制单元控制FIFO被第一次填满时,给FIFO输出填满信号full,取指控制单元从Idle状态进入到Wait状态,取指控制单元根据由预译码单元输入的读单字节信号rd_one或者读双字节信号rd_two_fresh,进入读一字节(read_one)状态或者进入读双字节(read_two)状态,在read_one状态或者read_two状态中执行完相应的读操作后,返回到Wait状态,在Wait状态,取指控制单元根据read_one状态或者read_two状态执行的结果,再进入回退(Back)状态,或者进入设置(Set)状态,在执行回退(Back)操作或者执行设置(Set)操作之后,再返回到Wait状态。
[0099] 在上述状态转换过程中,取指控制单元在读操作时,读取读指针RP指向的缓冲存储区中的字节码至预译码单元,每次可以从读指针RP指向的FIFO中可以读两个字节的字节码,但在实际的预译码中,某些时刻一次不能读入两个字节的字节码,比如指令含有单数个字节,则每次只能读入一个单字节,所以此处设计了两个读状态,分别为读一字节(read_one)状态和读双字节(read_two)状态。在读操作的过程中,根据预译码单元中的字节读取信号输出单元所输出的读字节数信号确定转入读一字节状态或者读双字节状态。所述字节读取信号输出单元所输出的读字节数信号携带的信息为每次读取的字节数,所述读字节数信号包括读单字节信号rd_one和读双字节信号rd_two_fresh。
[0100] 图9中还示出了读操作中的回退(Back)和设置(Set)两个状态。在预译码单元处理的过程中有时需要预取几个字节的字节码,用以判断最后读取的字节码是否可以和之前已读取的字节码构成预定类型组合的指令组,根据判断结果的不同进入回退(Back)状态或设置(Set)状态。
[0101] 举例来说,当预译码单元假设之前已经读入sload index(L类型指令)和sload_1(L类型指令)两条指令,则后续读入的指令可能会和已经读入sload index和sload_1两条指令组成L+L+E、L+L+E+S和L+L+B等三种预定类型组合的指令组。继续读入下一条指令,如果后续读入的指令符合上述预定组合类型,可以将之前读入的指令和后续读入的指令由预译码单元的指令转换单元将其转换为一条指令,在指令转换后,由预译码单元的读指针控制信号输出单元输出追踪信号set,取指控制单元在接收到所述追踪信号set后,如图9所示,执行设置过程,控制转入读操作的设置(Set)状态。如果后续读入的指令不符合上述预定组合类型,例如,读入的是sstore_1指令,显然不能与已经读入sload index和sload_1两条指令形成指令折叠,此时预译码单元需要处理之前已读入的指令,由预译码单元的读指针控制信号输出单元输出回退信号back,取指控制单元在接收到所述回退信号back后,执行回退过程,控制转入读操作的回退(Back)状态。
[0102] 为了方便理解上述设置和回退的过程,下面结合图10对此进行阐述。如图10所示,在对16bytes的FIFO进行读操作和写操作的过程中,在参照读指针RP_behind与写指针WP的差值大于或等于2时由取指控制单元的写使能信号输出单元输出有效的写使能信号wr_ack,将从ROM中所读取的字节码写入到写指针WP所指向的FIFO中。在预译码单元读取字节时,开始时,读指针RP和参照读指针RP_behind指向FIFO的同一个缓冲存储区(图中所示参照读指针RP_behind的位置),预译码单元读入读指针RP(即图中所示参照读指针RP_behind的位置)指向的缓冲存储区的字节码,然后取指控制单元的读指针控制单元将所述读指针RP的值加1,用于控制预译码单元读入下一个缓冲存储区的字节码,如上所述,因为在预译码单元处理的过程中有时需要预取几个字节的字节码,在预译码单元连续预取几个字节的字节码后,读指针RP指向的位置可能为如图10中读指针RP所示的位置,在预译码单元预取字节的过程中,参照读指针RP_behind的值并不改变,如上所述,在预译码单元执行指令转换的过程中,如果预译码单元预取的字节可以由预译码单元的指令转换单元将其转换为一条指令,即本次被转换的字节的总数与已读取的字节的总数相等,预取的字节可以被有效的消耗,则在指令转换后,由预译码单元的读指针控制信号输出单元将追踪信号set设置为有效并输出,则取指控制单元的读指针控制单元在所述追踪信号set有效时,可以确认在参照读指针RP_behind和读指针RP之间的字节已被有效消耗,则执行如图10所示的设置操作,将参照读指针RP_behind的值设置为此时读指针RP的值,至此完成设置的过程。
[0103] 反之,在预译码单元执行指令转换的过程中,如果预译码单元预取的字节不能由预译码单元的指令转换单元将其转换为一条指令,则说明预取字节的操作是失败的,预取字节是没有被有效消耗的字节,此时如果按照读指针RP继续读指令,则程序执行就会发生错误,由预译码单元的读指针控制信号输出单元将回退信号back设置为有效并输出,取指控制单元的读指针控制单元在所述回退信号back有效时,执行如图10所示的回退操作,在预取指令失败时将读指针RP回退。
[0104] 在上述过程中,如果处于参照读指针RP_behind和读指针RP之间的字节有部分可以由预译码单元的指令转换单元将其转换为一条指令,而后续读入的部分不能被转换,例如,预译码单元预取的字节的指令类型为L+L+E,由于可能再预取的指令为S类型的(即可以组成预定类型组合L+L+E+S),所以预译码单元需要再读入一条指令,而如果此时读入的指令为B类型的,则显然不可以与之前读入的L+L+E类型的指令组组成预定类型组合,所以,此时需要将读指针RP回退,但由于之前读入的L+L+E类型已经符合预定类型组合,则应该将之前读入的L+L+E类型的指令组由预译码单元的指令转换单元将其转换为一条指令,在指令转换后,由预译码单元的读指针控制信号输出单元将回退信号back设置为有效并输出,取指控制单元的读指针控制单元在所述回退信号back有效时根据读字节数信号(rd_one或者rd_two_fresh)和转换字节数信号length重置所述读指针RP和参照读指针RP_behind的值,具体地,根据读字节数信号(rd_one或者rd_two_fresh)和转换字节数信号length计算预译码单元所有效消耗的字节数,将所述读指针RP和参照读指针RP_behind指向被有效消耗的字节之后。其中,所述转换字节数信号由预译码单元的字节读取信号输出单元输出,所述转换字节数信号携带的信息为本次被转换的指令包含的字节数的总数。
[0105] 在上述执行设置过程或者回退过程中,所述追踪信号set和回退信号back可以在执行指令转换时复位,即设置为无效,在执行转换后,根据处理结果对追踪信号set或回退信号back进行置位,即将追踪信号set或回退信号back设置为有效。
[0106] 在上述由预译码单元的指令转换单元将已读入的指令转换为新的指令的过程中,首先由预译码单元的判断单元判断已读入的指令是否可能与后续的指令构成预定类型组合的指令组,当判断结果为是的时候,则继续读入后续指令,当判断结果为否的时候,则将已读入的满足预定类型组合的指令转换为一条新的指令。
[0107] 在上述指令转换的过程中,需要对原指令进行处理,一般来说,Java卡虚拟机的指令集中所定义的指令有两部分组成:操作码和操作数,所述操作数也可以被称为参数,Java卡虚拟机的指令集所含有的参数基本上可以分为表示位置信息的参数、表示跳转信息的参数以及表示入栈常数组成的参数。举例来说,sload index指令中的偏移量index,是表示位置信息的参数,if_eq,branchbyte指令中的branchbyte表示的是跳转信息的参数,bipush,byte指令中byte通常是由载入常数组成的。
[0108] 对应于上述指令集所含有的不同的参数信息,在构造新指令的过程中,可以预设多个寄存器,所述寄存器可以为存储位置信息参数的位置寄存器,也可以为存储跳转信息参数的跳转辅助寄存器,也可以是存储常数信息参数的常数寄存器。
[0109] 具体地,在本实施例中,如图4所示,可以提供寄存器单元24,所述寄存器单元用以存储在上述指令转换时,由预译码单元的参数分离单元对已读入的满足预定类型组合的指令中的操作数进行处理,得到的匹配于新指令的常数参数信息或者跳转偏移量参数信息。对于一条新指令,它最多可能用到8字节的常数参数,即最多可能用到两个int型常数作为新指令的操作数,所以在本实施例中可以设置8个8位的常数寄存器,而且,在上述多个寄存器中可以用两个寄存器复用为跳转辅助寄存器,用来存储跳转指令中的跳转偏移量参数,辅助完成条件跳转类的新指令,之所以可以复用是因为条件跳转指令最多会用到4字节的常数参数,即两个short型常数,因而所述8字节的常数寄存器中仍然会有4字节为空余的单元,所以可以将空余的单元复用为跳转辅助寄存器。
[0110] 正如图11所给出的寄存器单元的接口示意图所示,所述寄存器单元的输出信号包括两组int型常数寄存器的输出信号int1[31:0]和int2[31:0],两组short型常数寄存器的输出信号sht1[15:0]、sht2[15:0]和一组跳转辅助寄存器的输出信号branch[15:0]。
[0111] 在由预译码单元的指令转换单元对符合预定组合类型的字节码进行指令转换的过程中,可以由预译码单元预先设置多个位置寄存器,在所述位置寄存器中存放操作数存放的地址,比如,对于涉及单操作数的E类型的指令,则可以设置两个位置寄存器,将需要操作的数据放在其中一个位置寄存器中,将操作结果存放到另外一个位置寄存器中,再比如对于涉及两个操作数的E类型的指令,则可以将需要进行操作的两个操作数分别放在两个不同的位置寄存器中,将操作结果存放到另外一个位置寄存器中,即共设置3个位置寄存器,在本实施例中,在预译码单元中共设置3个位置寄存器,如图7所示的预译码单元的接口示意图中示出的输出位置寄存器R1[8:0]、R2[8:0]、R3[8:0]共三组信号。
[0112] 为了更好的理解预译码单元的工作过程,本发明实施例还给出预译码单元的状态示意图,如图12所示,在本实施例中,共示出了预译码单元的10种状态,包括:空闲(Idle)状态、开始(Start)状态、指令未折叠构造新指令(Newop_Unfold)状态、复杂指令构造新指令(Newop_Spec)状态、指令折叠构造新指令(Newop_Fold)状态、指令折叠过程的中间状态S1、S2、S3、S4和S5。
[0113] 其中,Idle为空闲状态,也是预译码单元工作停滞时进入的状态,Start为预译码单元的指令转换单元执行指令折叠开始的状态。
[0114] 图12中的虚线部分表示指令折叠过程中,如果判断出无法进行指令折叠,则转至未指令折叠构造新指令的状态(Newop_Unfold),在此过程中需要进行上文所提到的back的操作。
[0115] 请结合参考图7,在预译码单元收到请求新指令的信号ins_ack信号(所述ins_ack信号为后级译码执行单元25请求新指令的信号)时,预译码单元从Idle状态进入Start状态,在Start状态,根据预译码单元读入的不同类型的指令进入不同的状态。如图12所示,如果预译码单元读入的第一条指令为B或者S类型的指令,由于其不满足预定类型组合的任意一种类型,即所读入的指令不能被折叠,则此时进入Newop_Unfold状态,预译码单元不进行折叠操作,直接指派与所读入的指令对应的新指令集中的新指令。
[0116] 如果预译码单元读入的第一条指令为Complex类型的指令(图中所示Complex),则直接进入Newop_Spec状态。
[0117] 如果预译码单元读入的第一条指令为E类型或者L类型的指令,则由于E类型或者L类型可能和后续读入的指令构成符合预定类型组合的指令组,即其可能和后续指令进行指令折叠,所以此时可以进入指令折叠组合过程的中间状态。如图12所示,如果读入的是E类型指令,则可以从Start状态进入中间状态S1,如果读入的是L类型指令,则可以从Start状态进入中间状态S2。
[0118] 从中间状态S1或者中间状态S2,根据后续读入的指令的类型,可以进入不同的状态。例如,对于如图12所示的中间状态S1,由于其先读入的指令为E类型指令,如果后续读入的指令为S类型的指令,则符合预定类型组合E+S,可以进入Newop_Fold状态,进行指令折叠操作,但如果在中间状态S1读入的是除S类型其它类型的指令,则应该进入Newop_Unfold状态。对于如图12所示的中间状态S2,由于其先读入的指令为L类型指令,则后续读入的指令和L类型指令可能可以组成符合预定类型组合的指令组(例如可以为L+E、L+S、L+B、L+L+E、L+L+B、L+E+S和L+L+E+S),则根据读入指令的不同类型可以进入不同的状态,例如,如果在中间状态S2读入的是L类型的指令,则进入中间状态S4,在中间状态S4再根据读入的指令的类型进入不同的状态,如果在中间状态S4读入的是E类型的指令,进入中间状态S5,此时的类型组合为L+L+E类型组合,如果后续读入的指令为S类型的指令,则可以组成L+L+E+S预定类型组合,进入Newop_Fold状态,进行指令折叠操作。如果在中间状态S5(类型组合为L+L+E),后续读入的指令不是S类型的指令,即后续读入的指令不能和L+L+E组成符合预定类型组合,此时执行上述back操作,然后同样由中间状态S5进入Newop_Fold状态,对已读入的L+L+E指令组进行指令折叠操作。对于图中所示的指令折叠过程中的其它状态之间的切换,请参考上述状态切换过程,在此不再赘述。
[0119] 在上述状态切换的过程中,如果预译码单元读入到非法的字节码,则输出异常的ins_excep信号,同时工作停滞,等待复位。所述非法的字节码可以是Java卡虚拟机的指令集中未规定的指令,CPU无法处理的指令。
[0120] 在上述状态切换的过程中,在Newop_Unfold状态、Newop_Fold状态以及Newop_Spec状态下,执行完相应的指令操作过程中,在给出对应的新指令后,需要将原指令组中含有的有用的参数信息(位置信息、常数信息、跳转信息等)分类处理后存入新指令执行时需要用的辅助的寄存器中(例如位置寄存器、跳转辅助寄存器和常数寄存器),最后由预译码单元输出有效的预译码完成信号finish至后续的译码执行单元25,并再次进入Idle状态。所述译码执行单元在收到所述有效的预译码完成信号finish后读取预译码单元转换得到的新指令(所述指令包括转换得到的新指令以及寄存器单元和位置寄存器中的操作数),执行译码操作。所述译码执行单元在执行译码操作后输出有效的指令请求信号ins_ack,预译码单元在接收到所述有效的指令请求信号ins_ack时,则由Idle状态再次进入Start状态,进入又一个状态循环过程。
[0121] 对于本领域技术人员,可以采用多种手段,将所述译码执行单元对于读取到的由预译码单元转换得到的新指令转换为本地CPU可以执行的指令,具体方法此处不做限定。
[0122] 需要说明的是,在上述状态切换的过程中,其执行速度是比较快的,例如对于Complex类型指令,其需要从Idle状态到Start状态、从Start状态到Newop_Spec状态以及从Newop_Spec状态到Idle状态共三个周期便可以完成原指令到新指令的转换。同样对于首先读入的是不能被折叠的B类型或者S类型的指令,同样只需三个周期便可以完成原指令到新指令的转换。而对于可以折叠的一组指令,从Start状态到Newop_Fold状态如图12所示会用到2到4个周期,加上从Idle状态到Start状态以及从Newop_Fold状态到Idle状态两个周期,最多6个周期就可以完成一组指令的预译码工作,就可以完成原指令组到新指令的转换。在本实施例中,为了提高电路速度,充分利用了时钟资源,可以将预译码单元的状态机(指令单元执行指令转换)建立在时钟的下降沿,而从FIFO读字节码以及向寄存器单元写入参数的操作建立在时钟的上升沿,则在时钟的上升沿进行的操作相当于耗时为0,这样可以达到较好的加速效果。
[0123] 在上述本实施例所提供的应用于智能卡虚拟机运行的控制装置工作的过程中(如图4所示),在所述控制装置启动后,取指控制单元首先获得此时的PC值,所述PC值为启动所述控制装置时的程序指针,由所述PC值确定取指指针jFC的初始值,并输出给取指缓冲单元,取指缓冲单元根据取指指针jFC的值从程序存储器ROM中读取字节码,经过取指缓冲单元的缓冲后,进入到预译码单元,预译码单元则对从取指缓冲单元所读取的字节码进行预译码操作,在所述预译码单元中进行判断,如果可以与后续读入的字节码组成指令折叠,则可以将这一组指令转换为折叠后的对应的单条新指令,将所述新指令输出给后级译码执行单元,并将原指令组中有用的参数信息分类处理后存入寄存器单元中,之后给出完成信号。若不可以组成指令折叠,则可以直接转换为对应的单条新指令,可以同样填好各寄存器后给出完成信号,并将所述新指令输出给后级译码执行单元。后级译码执行单元接收到完成信号读取预译码单元所提供的新指令以及各辅助寄存器的参数信息,进行对应的译码执行操作。此时,预译码单元与后级的译码执行单元可以形成二级流水,在译码执行单元执行译码的时候,预译码单元可以进行下一条或下一组指令的预译码工作,可以达到较好的加速效果。
[0124] 为了更好的理解本实施例所提供的应用于智能卡虚拟机运行的控制装置,在此给出表3,用于描述图5所示的取指控制单元的接口示意图中的所有接口信息,给出表4,用于描述图6所示的取指缓冲单元的接口示意图中的所有接口信息,给出表5,用于描述图7所示的预译码单元的接口示意图中的所有接口信息,给出表6,用于描述图11所示的寄存器单元的接口示意图中的所有接口信息。
[0125] 表3:
[0126]
[0127]
[0128] 表4:
[0129]接口 I/O 描述
WP[3:0] I 来自取指控制单元的写指针
RP[3:0] I 来自取指控制单元的读指针
data_in[7:0] I 字节码的输入端口
full I 控制装置启动时,FIFO第一次填满时的信号
wr_ack I 来自取指控制单元的写使能信号
clk I 时钟信号
data_in[15:0] O 数据端口,可以同时输出两字节
[0130] 表5:
[0131]
[0132]
[0133] 表6:
[0134]接口 I/O 描述
data_in[15:0] I 数据端口,预译码单元输出的参数信息
index[2:0] I 寄存器组中写入参数的位置
clk I 时钟信号
rst_n I 控制装置复位信号,低电平有效
jreg_wr I 向寄存器中写入参数的写使能信号
sign_extend I 写参数时是否进行符号扩展的信号
branch[15:0] O 跳转辅助寄存器的输出端口
int1[31:0] O 第一个int型常数寄存器的输出端口
int2[31:0] O 第二个int型常数寄存器的输出端口
sht1[15:0] O 第一个short型常数寄存器的输出端口
sht2[15:0] O 第二个short型常数寄存器的输出端口
[0135] 在表3至表6中,I或者O表示接口的信号为输入信号或者输出信号,在上文描述应用于智能卡虚拟机运行的控制装置的处理流程中,已对所述表3至表6中的部分信号进行了说明。
[0136] 本发明实施例还提供了应用于智能卡虚拟机运行的控制装置的接口示意图,如图13所示,结合图13,给出表7,用于描述图13所示的控制装置的接口示意图中的所有接口信息。
[0137] 表7:
[0138]接口 I/O 描述
PC[15:0] I 启动控制装置时的程序指针
rom_data[7:0] I 数据输入端口
clk I 时钟信号
rst_n I 控制装置复位信号,低电位有效
ins_ack I 后级译码执行单元请求新指令的信号
branch[15:0] I 跳转辅助寄存器的输出端口
int1[31:0] I 第一个int型常数寄存器的输出端口
int2[31:0] O 第二个int型常数寄存器的输出端口
sht1[15:0] O 第一个short型常数寄存器的输出端口
sht2[15:0] O 第二个short型常数寄存器的输出端口
newop[7:0] O 新指令输出端口,输出给后级译码执行单元
finish O 预译码工作结束信号
length[3:0] O 输出新指令消耗字节码数目,用以后级更新PC
ins_excep O 指令异常信号,信号有效时,表示读到非法指令
jFC[15:0] O 输出给ROM的取指指针
R1[8:0] O 第一个位置辅助寄存器
R2[8:0] O 第二个位置辅助寄存器
R3[8:0] O 第三个位置辅助寄存器
[0139] 本领域技术人员可以理解,上述应用于智能卡虚拟机运行的控制装置的全部或部分可以基于可编程逻辑器件实现,所述可编程逻辑器件包括:可编程阵列逻辑(Programmable Array Logic,PAL)、通用阵列逻辑(Generic Array Logic,GAL)、现场可编程门阵列(Field-Programmable Gate Array,FPGA)、复杂可编程逻辑器件(Complex Programmable Logic Device,CPLD)中的一种或多种,本发明对此不做具体限制。
[0140] 通过本实施例提供的应用于智能卡虚拟机运行的控制装置,可以有效将效率低下的基于堆栈操作的原指令转化为基于寄存器操作的新指令,构造得到的新指令集较原指令集减少很多指令,使得新指令集的指令密度增加,进一步,由于新的指令集中的指令是基于寄存器操作的指令,其指令执行速度会更快,可以有效提高指令的处理效率,提高系统的处理性能。
[0141] 在本实施例中,利用预先设置的位置寄存器、常数寄存器以及跳转寄存器即可辅助预译码单元简单、方便的实现预译码工作,利用较小的硬件代价即可实现从基于堆栈操作的原指令转化为基于寄存器操作的新指令。
[0142] 在本实施例中,指令转换单元可以在时钟信号的下降沿执行指令转换,取指缓冲单元可以在时钟信号的上升沿读取字节码,且寄存器单元可以在时钟信号的上升沿存储操作数,利用时钟的上升沿、下降沿执行不同的操作,形成二级流水,进一步,前级预译码单元可以与后级译码执行单元可以形成二级流水,所以,可以有效提高指令的处理速度。
[0143] 本实施例提供的应用于智能卡虚拟机运行的控制装置可以被应用于各种智能卡系统中,不需要改动通用的CPU的流水线结构,也不需要对所下载的程序做额外的处理,使得各种智能卡系统的通用型CPU都可以简单、方便实现执行的基于寄存器操作的新指令的功能,所述控制装置的可移植性、通用性更强,有效提高各种智能卡系统的指令的处理效率,提高系统性能。
[0144] 本发明还提供一种智能卡虚拟机,所述虚拟机包括存储器和指令执行单元,所述指令单元用于执行译码后的新指令,所述智能卡虚拟机还包括如上所述的应用于智能卡虚拟机的控制装置。
[0145] 虽然本发明披露如上,但本发明并非限定于此。任何本领域技术人员,在不脱离本发明的精神和范围内,均可作各种更动与修改,因此本发明的保护范围应当以权利要求所限定的范围为准。