便携式数据载体中的存储器管理方法转让专利

申请号 : CN200480011319.9

文献号 : CN1781127B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 托马斯·斯托克乔格·克拉姆波斯特休伯

申请人 : 德国捷德有限公司

摘要 :

本发明涉及一种用于在通过便携式数据载体(10)执行程序(30)时的存储器管理的方法,该便携式数据载体(10)包括第一和第二存储器区域(34、36),用于存储在程序执行时生成的对象(38、40、44)。首先,至少部分地在第二存储器区域(36)中创建对象(38、40、44)。如果在进一步的程序执行期间生成对该对象(38、40、44)的持久引用(42),则将该对象传送到第一存储器区域(34)。根据用于将源程序(80)转换为可执行程序(40)的方法,在编译时,检查是否生成对要被新创建的对象(38、40、44)的持久引用(42)。取决于此检查的结果,生成在第一或至少部分地在第二存储器区域(34、36)中创建对象(38、40、44)的程序代码。本发明提供了一种用于在便携式数据载体(10)中的存储器管理的装置,其改善了高效可写存储器区域的利用率。

权利要求 :

1.一种用于在由便携式数据载体(10)执行程序(30)时的存储器管理的处理方法,该便携式数据载体(10)具有第一和第二存储器区域(34、36),用于存储在程序执行时生成的对象(38、40、44),其中,执行对第二存储器区域(36)的写操作比执行对第一存储器区域(34)的写操作更高效,该处理包括以下步骤:-至少部分地在第二存储器区域(36)中创建在程序执行时生成的对象(38、40、44),以及

-如果在进一步的程序执行的过程中,生成对该对象(38、40、44)的持久引用(42),则将该对象(38、40、44)传送到第一存储器区域(34)。

2.如权利要求1所述的处理方法,其特征在于,在程序(30)的方法(30.x)的执行期间生成对象(38、40、44);并且,在该方法(30.x)终止时,至少在该方法(30.x)不返回对对象(38、40、44)的引用时,释放可能仍由对象(38、40、44)占用的第二存储器区域(36)中的存储器空间。

3.如权利要求2所述的处理方法,其特征在于,在方法(30.x)终止时,至少在该方法(30.x)不返回对位于第二存储器区域(36)中的对象(38、40、44)的引用时,将指示第二存储器区域(36)的占用的填充级别指示符(48)重置为在调用方法(30.x)时当前的级别。

4.如权利要求1至3中的任一项所述的处理方法,其特征在于,当在第二存储器区域(36)中创建对象(38、40、44)时,检查在第一存储器区域(34)中是否有足够的空间用于可能变得必要的对象(38、40、44)的传送。

5.如权利要求1至4中的任一项所述的处理方法,其特征在于,在第一存储器区域(34)中,创建在程序(30)的安装期间生成的对象(38、40、44)。

6.如权利要求1至5中的任一项所述的处理方法,其特征在于,最初仅在第二存储器区域(36)中创建在从源程序(80)生成程序(30)时已被标识为局部对象的对象(38、40、44)。

7.一种用于将源程序(80)转换为供便携式数据载体(10)执行的程序(30)的处理方法,其中,该数据载体(10)具有第一和第二存储器区域(34、36),用于存储在程序执行时生成的对象(38、40、44),并且其中,执行对第二存储器区域(36)的写操作比执行对第一存储器区域(34)的写操作更高效,其特征在于,在转换包含对象(38、40、44)的生成的源程序(80)的一部分时,至少近似地检查在所转换的源程序(80)的一部分中是否生成对对象(38、40、44)的持久引用(42);并且,取决于该检查的结果,生成在第一存储器区域(34)中创建对象(38、40、44)的程序代码,或者生成至少部分地在第二存储器区域(36)中创建对象(38、40、44)的程序代码。

8.如权利要求7所述的处理方法,其特征在于,所生成的程序(30)被配置为:在由数据载体(10)执行时,执行根据权利要求1至6中的任一项所述的处理。

9.如权利要求1至8中的任一项所述的处理方法,其特征在于,在第二存储器区域(36)中创建的对象(38、40、44)是局部、且仅仅临时需要的对象。

10.如权利要求1至9中的任一项所述的处理方法,其特征在于,第二存储器区域(36)包括局部堆和/或堆栈存储器(32)。

11.如权利要求1至10中的任一项所述的处理方法,其特征在于,数据载体(10)为Java卡;并且程序(30)为Java卡小应用程序。

说明书 :

技术领域

本发明一般涉及在由具有处理器的便携式数据载体执行程序时的存储器管理的技术领域。特别地,这种便携式数据载体可以为各种构造形式的芯片卡、或芯片模块。更具体地说,本发明涉及使用数据载体的两个不同的存储器区域,以便存储在程序执行期间生成的对象。

背景技术

在便携式数据载体中,一般提供了以各种存储器技术构造的多个存储器区域。典型地,将存储器细分为易失性读/写存储器(RAM),非易失性可写存储器(EEPROM)、以及屏蔽编程(mask-programmed)固定值存储器(ROM)。写入到RAM(write-to-RAM)操作需要相当短的时间-例如,其是写入到EEPROM(write-to-EEPROM)操作所需时间的1/30。另一方面,RAM中的一位比EEPROM中的一位在数据载体的半导体芯片上占据大得多的区域,使得通常仅提供相对小的RAM。因而,存在以尽可能最佳且最灵活的方式来利用快速但稀少的RAM的问题。
例如,在商标Java CardTM下,具有复杂的存储器管理功能的便携式数据载体是公知的。可从因特网址“http://java.sun.com/products/javacard”得到的、由“Sun Microsystems,Inc.,Palo Alto,USA”公司于2002年6月公布的文档“Java CardTM 2.2Runtime Environment(JCRE)Specification”描述了为程序(Java卡小应用程序)的执行而在Java卡中提供的环境。第5章描述了典型地将持久对象(persistent object)存储在数据载体的EEPROM中,而典型地在RAM中创建暂时对象(transient object)。为了安全的原因,不允许将暂时对象存储在EEPROM中。
例如,如在可从上述因特网址得到的、由“Sun Microsystems,Inc.,PaloAlto,USA”公司于2002年6月公布的文档“Java CardTM 2.2RuntimeEnvironment(JCRE)Specification”的第81至85页上所描述的那样,在刚才描述的Java卡的存储器管理中,使用特殊的系统调用来生成暂时对象。这限制了在实践中利用暂时对象的程度。除此之外,这样的暂时对象具有潜在的不被限制的寿命;术语“暂时”仅指存储在对象中的数据。因此,在存储器管理中,使用暂时对象仅带来灵活性的小幅增加。
在对Java卡进行编程中,惯用且推荐的实践为:在安装程序(小应用程序)时,静态地创建在该程序的整个寿命期间需要的所有对象。这在具有预先指定的名称“install(安装)"的方法中进行。然而,所述实践产生具有低灵活性的存储器管理,因此不是最优的。例如,当在程序中创建暂时字段(field)、以便存储用于加密操作的临时数据时,在RAM中为其静态保留的存储器空间通常不可用于其它程序。在该程序内,这样保留的存储器空间还用于其它任务的程度取决于程序员的专业技能。因此,改善RAM中的稀少存储器空间的利用率、以及自动化存储器管理将是所期望的。

发明内容

因而,本发明的问题在于:至少部分地避免现有技术的问题,并使用于便携式数据载体中的存储器管理的技术可用,利用该技术,改善高效可写存储器区域(典型为RAM存储器)的利用率。特别地,本发明会使在不涉及程序员的大量工作的情况下的RAM存储器的灵活利用成为可能。
为了全部或部分地解决该问题,根据本发明,提供了一种用于在由便携式数据载体执行程序时的存储器管理的处理,该便携式数据载体具有第一和第二存储器区域,用于存储在程序执行时生成的对象,其中,执行对第二存储器区域的写操作比执行对第一存储器区域的写操作更高效,该处理包括以下步骤:至少部分地在第二存储器区域中创建在程序执行时生成的对象,以及如果在进一步的程序执行的过程中,生成对该对象的持久引用,则将该对象传送到第一存储器区域。
另外,根据本发明,提供了一种用于将源程序转换为供便携式数据载体执行的程序的处理,其中,该数据载体具有第一和第二存储器区域,用于存储在程序执行时生成的对象,并且其中,执行对第二存储器区域的写操作比执行对第一存储器区域的写操作更高效,其特征在于,在转换包含对象的生成的源程序的二部分时,至少近似地检查在所转换的源程序的一部分中是否生成对对象的持久引用;并且,取决于该检查的结果,生成在第一存储器区域中创建对象的程序代码,或者生成至少部分地在第二存储器区域中创建对象的程序代码。
此外,根据本发明,提供了一种便携式数据载体,特别是芯片卡或芯片模块,其具有处理器、以及至少一个存储器,其中,存储器包含程序命令,其使处理器执行上述用于在由便携式数据载体执行程序时的存储器管理的处理。
另外,根据本发明,提供了一种计算机程序产品,特别是编译器,其包括程序命令,该程序命令使计算机执行上述用于将源程序转换为供便携式数据载体执行的程序的处理。
构成本发明的基础的基本思想在于,在高效可写存储器区域中(例如,在RAM中)自动地创建在便携式数据载体执行程序时生成的特定对象。为了该目的,特别地,开始考虑仅具有短寿命的那些对象。在本文档中,这种对象被称为“局部对象”。例如,本发明所理解的局部对象可以为在出现异常时所生成的异常对象。一旦捕获了所述异常,异常对象的寿命便终结。
利用本发明,可使临时需要的存储器空间在短周期中、且动态地可用一即,以局部对象的形式。在RAM或其它高效可写存储器中部分或全部地创建局部对象。作为本发明的自动和动态存储器管理的结果,尤其良好地利用了该存储器,这在处理速度方面、以及在有效可用于所执行的程序的存储器空间的方面,提高了数据载体的效率。
通常,当不再存在对对象的引用时,该对象的寿命处于终结,这是因为随后不再可能访问该对象。特别地,可通过不存在对对象的持久引用的事实来定义局部对象。在这里,将“持久引用”理解为对对象的引用,该引用被持久存储在例如对象的字段、静态字段或数组的字段中。一旦将对对象的引用写入到所述字段中的一个,该对象便不再能够成为局部对象。相反,例如包含在操作数堆栈或局部变量中的对对象的非持久引用不影响将对象分类为局部或非局部对象。
可在程序编译时候或运行时候、或者部分地在程序编译时候而部分地在运行时候,作出有关将对象视为局部还是非局部对象的区分。在运行时候作出区分的情况下,首先,在第二高效可写存储器区域中创建至少一些新生成的对象。在进一步的程序执行期间,执行有关是否创建对该对象的持久引用的监控。一旦处于该情况,该对象便不再被视为局部对象。随后,将它传送到第一非易失性存储器区域中。
在编译时候作出区分的情况下,编译器针对是否创建对对象的持久引用而分析包含对象生成的源程序部分。取决于分析的结果,编译器随后生成在第一或者——全部或部分地——在第二存储器区域中创建对象的程序代码。在本文档的术语中,术语“编译器”意指包括执行自动转换过程的所有程序。因而,除了狭义的Java编译器之外,“编译器”还意指:例如,表示用于生成CAP文件(Card Application File,卡应用文件)的转换器、以及优化程序。
通常,在编译时候的源程序分析能够提供仅为近似的结果,其被理解为意味着:至少将一定程度的不确定性与作为局部或非局部的对象的两个类别中的一个相关联。因此,可作出这样的规定,使得仅在第二存储器区域中创建被确定地识别为局部的对象,而在第一存储器区域中创建所有其它对象。相反,在可替换实施例中,仅在第一存储器区域中创建被确定地识别为非局部的对象,而在第二存储器区域中创建所有其它对象。随后,另外,至少对于不可能被确定地识别为局部的对象,进行上述运行时候监控。在某些形式的实施例中,提供编译器指令(编译指示),对象可通过其而被特征化(characterize)为局部或非局部。
在优选实施例中,应用简单的标准(根据需要,在运行时候或编译时候),以便确定要在第一还是最初在第二存储器区域中创建对象。例如,可作出这样的规定,使得在第一存储器区域中创建由程序的安装方法生成的对象。在不同形式的实施例中,既可最初在第二存储器区域中创建所有其它对象,也可仅创建个别种类的对象。例如,这种对象可为异常对象、或仅仅临时需要以便执行加密操作的对象。
通常,局部对象的寿命随着生成该局部对象的方法的终止(由于返回或异常而引起)而终结,这是因为在那个时刻,清除了可能存在的对该对象的局部引用。随后,可释放第二存储器区域中对于该对象可能仍需要的存储器空间。在使用该对象作为生成了该对象的方法的返回参数时,应用刚才提到的规则的例外。在该情况下,调用方法接收对该对象的引用,使得该对象至少直到该方法的终止也不会被清除。
为了能够利用第二存储器区域中被释放的存储器空间来创建新对象,在一些形式的实施例中,提供了存储器清理(垃圾回收)。然而,这在程序执行期间是耗时的,并增加了运行时候环境的复杂度。优选地,因此,使用特别简单的处理,其中,填充级别(fill-level)指示符表示第二存储器区域的占用。在方法的终止时,通常将填充级别指示符重置为在该方法被调用时其所处的状态。在优选实施例中,仅当通过重置而被释放的第二存储器区域的该部分包含用作该方法的返回参数的对象时,才产生该规则的例外。
为了确保在需要时可将对象从第二存储器区域传送到第一存储器区域,优选地,在第二存储器区域中创建对象时,已经检查在第一存储器区域中是否也有用于该对象的足够空间可用。优选地,还在进一步的程序执行期间确保:在创建新对象时,在第一存储器区域中总是有足够的空间用于潜在必要的对象传送。
在优选实施例中,第一存储器区域位于数据载体的EEPROM、或其它非易失性可写存储器中,而第二存储器区域被安排在RAM或其它高效可写存储器中。特别地,第二存储器区域可为局部堆和/或堆栈存储器的形式。对于已经在编译时候被标识为局部对象的对象来说,堆栈存储器中的存储是尤其有利的。
根据本发明的计算机程序产品包括程序命令,以便实现根据本发明的转换处理。这种计算机程序产品可为在其上存储了用于执行根据本发明的处理的程序的物理介质,例如半导体存储器、或磁盘、或CD-ROM。然而,该计算机程序产品还可为非物理介质,例如通过计算机网络而传送的信号。优选地,该计算机程序产品为供惯用的工作站计算机执行而使用的编译器,以便生成用于便携式数据载体的程序。
在优选实施例中,数据载体和/或计算机程序产品具有与上述和/或在从属处理权利要求中提到的特征相对应的特征。

附图说明

将从下面对示范实施例和多个可替换实施例的特定描述中显现出本发明的其它特征、优点和功能。对附图进行参照,其中:
图1是根据本发明的示范实施例的便携式数据载体的方框图;
图2是在创建新对象时执行的过程的流程图;
图3通过例子而图解了在程序执行期间,在堆栈存储器和局部堆中的存储器占用;
图4是在方法的终止时执行的过程的流程图;以及
图5是将源程序转换为可执行程序的图示。

具体实施方式

在本示范实施例中,图1中示出的数据载体10是根据Java卡标准的芯片卡的形式。数据载体10在单个半导体芯片上具有处理器12、以各种技术构造的多个存储器区域、以及用于无接触或接触捆绑(contact-bound)通信的接口电路14。在本示范实施例中,作为存储器区域而提供固定值存储器16、非易失性可写存储器18、以及写/读存储器20。固定值存储器16是屏蔽编程ROM的形式,非易失性可写存储器18是电可擦写和可编程EEPROM的形式,而写/读存储器20是RAM的形式。对非易失性存储器18的写操作相对费力,并且,例如,需要对写/读存储器20的写操作的30倍的时间。
数据载体10的操作所需的系统程序22包含在固定值存储器16中——并且,还部分地包含在非易失性存储器18中。采用在本质上公知的方式,系统程序22包括操作系统24、以及用于实现虚拟机26的程序代码26,其中虚拟机26在本示范实施例中是JVCM(Java卡虚拟机)的形式。还提供了类库28,其产生可用的应用编程接口。在初始化数据载体10时,将Java卡小应用程序形式的程序30加载到非易失性可写存储器18中;在可替换实施例中,程序30可以全部或部分地位于固定值存储器16中。尽管在图1中仅示出了单个程序30,但还可提供其它的程序,用于由便携式数据载体10的处理器12执行。程序30包括多个方法30.1、30.2、30.3、30.4,其在下文中被总称为30.x。采用在本质上公知的方式,方法30.x包括:被称为“安装”方法的方法,用于程序30的安装;被称为“处理”方法的方法,用于处理输入数据包;以及可选地,“选择”和“取消选择”方法,其在数据载体10的多个程序之间改变时被调用。
位于写/读存储器20中的堆栈存储器32在程序执行期间存放(take up)操作数、返回地址、局部变量、以及其它数据值。在图1中用阴影线示出了堆栈存储器32的空闲区域。
在非易失性存储器18中,保留了第一存储器区域34,采用在本质上公知的方式,第一存储器区域34是持久堆的形式。根据惯用的Java卡架构,将在此持久堆中创建所有对象、静态数据字段、以及非暂时数组。相反,在本示范实施例中,仅选择性地使用该持久堆。不在第一存储器区域34中、而是在写/读存储器20中的第二存储器区域36中创建预期仅具有短寿命、且无持久引用来引用其的局部对象。第二存储器区域36还被称为局部堆,这是因为它类似于持久堆而用于对象的存储。
为了说明刚才描述的情形,图1作为例子示出了在第一存储器区域34中创建的两个对象38、40,其各自包括多个数据字段。第一对象38的数据字段中的一个包含对第二对象40的引用42。引用42还被称为“持久引用”,这是因为它包含在持久存储的数据字段中。第二对象40不是局部对象,而是持久对象,这是因为持久引用42引用它。在第二存储器区域36中,作为例子示出了局部对象44。例如包含于在堆栈存储器32中创建的局部变量中的局部引用46引用局部对象44。作为填充级别(fill-level)指示符48,堆栈存储器32中的另一个值表示第二存储器区域36中的空闲存储器的开始;在图1中用阴影线示出了该空闲存储器。
在由数据载体10执行程序的时候,当通过命令“新建(NEW)”来请求创建新对象时,执行图2中示出的过程。首先,在步骤50中,检查在第一存储器区域34中是否有足够的存储器空间是空闲的,以便创建新对象。如果没有足够的存储器空间可用,则通过错误消息来终止对象的生成。在本示范实施例中,无论要被创建的对象的性质如何,均进行步骤50中的检查,以便确保甚至最初在第二存储器区域36中创建的对象也可随时被传送到第一存储器区域34。
在本示范实施例中,作出这样的规定,使得由程序30的“安装”安装方法创建的对象总被认为是持久对象,因此将其存放(take up)到第一存储器区域34中。因此,在步骤52中,查询当前是否正在执行程序安装。如果是,则在步骤54中,在第一存储器区域34中作为持久对象生成新对象。在步骤54中执行的生成过程与在惯用的Java卡的情况下执行的在持久堆中创建对象相对应。
如果在步骤52中确定程序执行处于安装方法之外,则在本示范实施例中,要被创建的新对象最初被视为局部对象。随后,倘若在步骤56中检查出在第二存储器区域36中有足够的存储器空间是空闲的,则在第二存储器区域36(局部堆)中创建它。如果在局部堆中有足够的存储器空间可用,则在步骤58中,在其中的下一个空闲位置(与迄今使用的区域紧邻)创建该对象,并且相应地更新填充级别指示符48。然而,如果局部堆已经过满,则在步骤54中执行第一存储器区域34中的对象创建的惯用过程,在该区域中,当然,如在步骤50中所检查的那样,仍有足够的空闲存储器空间可用。
在由数据载体10进一步执行程序30的期间,每当生成或修改持久引用时,检查该引用是否引用位于第二存储器区域36中的对象。如果是,则将该对象从第二存储器区域36传送到第一存储器区域34中。由于步骤50中的查询而确保了这随时都是可能的。
在本示范实施例中,类似于堆栈存储器而组织第二存储器区域36,以便在终止方法30.x之后,可以简单的方式来释放在该方法30.x中生成的局部对象所占用的存储器空间。为了说明该过程,图3作为例子示出了具有几个堆栈帧60.1、60.2、60.3的堆栈存储器32的占用。采用在本质上公知的方式,当调用每个方法30.x时,创建新堆栈帧60.x,其在终止方法30.x时再次被清除。堆栈帧60.x包含到调用方法的返回地址、管理和安全性数据,并且可选地还包含被调用方法的局部变量。
在本示范实施例中,每个堆栈帧60.x还具有填充级别字段62.x,其包含在执行所述方法30.x期间的填充级别指示符48。在作为例子给出的图3的图解中,填充级别字段62.3包含当前填充级别指示符48,而填充级别字段62.2包含在调用与堆栈帧60.3相对应的方法时当前的填充级别。部分64.3表示自从当前执行的方法被调用以来已被该方法新占用的局部堆中的部分。局部堆中的部分64.1和64.2分别由其调用引起存储器帧60.1和60.2的创建的那些方法来填充。
在目前描述的示范实施例中,作出了这样的规定,使得在终止方法时,通常完全地释放由该方法在第二存储器区域36中占用的空间。这利用这样的事实而不费力地发生,该事实即:在终止方法时,丢弃(discard)对应的堆栈帧60.x(包括其中所包含的填充级别字段62.x),并使用具有存储在其中的其占用内容的下一个最旧堆栈帧60.(x-1)的填充级别字段62.(x-1),作为新填充级别指示符48。因而,例如,在终止其调用引起堆栈帧60.3的创建的那个方法之后,使用填充级别字段62.2的内容,作为新的填充级别指示符48,以便释放整个存储器部分64.3。
在刚终止的方法向调用方法返回对它已在第二存储器区域36中创建的局部对象的引用时,存在在前一段落中给出的规则的例外情况。在该情况下,将当前填充级别字段62.x的内容复制到下一个最旧的堆栈帧60.(x-1)中,以便防止局部对象被覆写。例如,在图3的存储器占用配置中,当已创建了存储器帧60.3的方法返回对位于存储器区域64.3中的对象的引用时,将填充级别字段62.3的值复制到前一个堆栈帧60.2的填充级别字段62.2中。
在图4中再次图解了刚才描述的在终止方法时的过程。取决于步骤70的结果,重新激活前一个堆栈帧60.(x-1)的填充级别字段62.(x-1)(步骤72),或将当前填充级别指示符48的值转移(carry over)到前一个堆栈帧60.(x-1)中。
图5示出了本质上公知的由编译器82将Java源程序80翻译为CAP文件(卡应用文件)84的翻译过程。然后,由加载程序86将CAP文件84加载(例如,在初始化数据载体10时)到数据载体10中,作为程序30。在这里描述的示范实施例中,除了用于将源程序80翻译为字节码的实际编译模块之外,编译器82还具有转换器,其进行各种正确性检查,并且,其还被称为“离卡虚拟机(off-card Virtual Machine)”。
在迄今描述的处理的情况下,为了决定应当在第一还是第二存储器区域34、36中生成新创建的对象,在步骤52中在运行时候执行简单的查询。在持久引用的创建和更新时,进行进一步的运行时候检查。相反,在可替换实施例中,作出这样的规定,使得所述检查全部或部分地提前到编译器82的级别。
利用对源程序80或中间代码的抽象(abstract)分析,编译器82可获得有关要在以后的程序执行期间新创建的对象被视为局部还是非局部对象的信息。取决于分析的结果,编译器82则生成程序代码,其引起在第一存储器区域34中或在第二存储器区域36中创建对象。在可替换实施例中,在堆栈存储器32中创建已在编译时候被确定地识别为局部的对象,如局部变量。取决于是否在写/读存储器20中额外提供局部堆,那些实施例中的堆栈存储器32形成整个第二存储器区域36、或第二存储器区域36的一部分。
通常,将向源程序提供用于生成对象的命令,其中在编译时候不能无歧义地将所述对象分类为局部或非局部对象。既可在第一存储器区域34中直接创建这样的对象,也可以前述方式在第二存储器区域36中将这样的对象最初创建为局部对象,并仅在需要时将其传送到第一存储器区域34。