首页> 中国专利> 在配备数据处理资源的多用途平台式系统中加载应用的方法,对应的执行系统和方法

在配备数据处理资源的多用途平台式系统中加载应用的方法,对应的执行系统和方法

摘要

本发明涉及向多用途嵌入式系统加载应用的方法,对应的嵌入式系统和执行嵌入式系统的某个应用的方法。将应用从一个站点加载到嵌入式系统中的方法的特征在于转换包括静态链接多组被存储在嵌入式系统的相同名称空间,被称作模块的包并且构成一个应用程序接口模块或对应于应用的一个服务模块,转换还包括为各个模块分配一个标识符(MID),为各个类(NCI),各个方法(NM)和各个属性(NA)分配一个引用编号,其中嵌入式系统包括一个运行时间环境,该环境包含一个虚拟机和应用编程接口(API),该虚拟机包括一个中间伪码语言解释程序,在上述站点上编写应用的源代码,并且源代码被编译成伪码,被验证和转换。针对一个模块的链接伪码中的一个方法或属性的引用被编码成三个字节,该引用由一个指示有关某个在模块内部(II)或外部(IE)的类的引用的指示符,类(NCI)的编号,和方法(NM)或属性(NA)的编号构成,一个针对某个外部类的引用被虚拟机有条理地解释成针对一个应用程序接口模块的引用。

著录项

  • 公开/公告号CN1341238A

    专利类型发明专利

  • 公开/公告日2002-03-20

    原文格式PDF

  • 申请/专利权人 布尔CP8公司;

    申请/专利号CN00804077.X

  • 发明设计人 克里斯蒂·戈雷;琼-保罗·比顿;

    申请日2000-11-17

  • 分类号G06F9/445;G07F7/10;

  • 代理机构中国国际贸易促进委员会专利商标事务所;

  • 代理人王以平

  • 地址 法国卢旺茨那斯

  • 入库时间 2023-12-17 14:15:13

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2010-01-13

    专利权的终止(未缴年费专利权终止)

    专利权的终止(未缴年费专利权终止)

  • 2005-08-10

    专利申请权、专利权的转移专利权的转移 变更前: 变更后: 登记生效日:20050701 申请日:20001117

    专利申请权、专利权的转移专利权的转移

  • 2004-08-18

    授权

    授权

  • 2003-02-12

    实质审查的生效

    实质审查的生效

  • 2003-01-29

    实质审查的生效

    实质审查的生效

  • 2002-03-20

    公开

    公开

查看全部

说明书

技术领域

本发明涉及向配备数据处理资源的多用途嵌入式系统加载应用的方法,对应的嵌入式系统和执行一个对应的嵌入式系统的某个应用的方法。

背景技术

更具体地说,本发明涉及在共享系统中相同存储器空间的模块之间建立一个防火墙,上述系统被嵌入到使用中间伪码和一个相关虚拟机的多用途便携对象内。

Sun提出的“Java”(注册商标)技术基于一种面向对象编程语言“Java”和一个相关的虚拟机。在此后被称作常规Java平台,具有高CPU性能和大约1兆字节的大容量存储器的站点或PC上开发出这种技术。

若干年来,Java技术的概念已经得到采用并且适于在具有信用卡或SIM微型模块的形式的便携对象中的嵌入式系统上运行,上述信用卡或SIM微型模块引入了一个微处理器并且被通称为智能卡,GSM(全球移动通信系统)便携电话,PCMCIA卡或任何其他便携终端。此后,术语“卡”会被用来指称任何便携对象。现在可以通过类似Java的高级语言完成以前只能使用汇编语言来实现的嵌入式系统编程,这使得能够加速客户端应用的开发。

这种特定于便携对象的嵌入式系统,此后被称作特定平台的新型平台构成了常规平台的一个子系统。差异来自于嵌入式系统的较小环境。通常,如图4a所示,一个智能卡(10)包括一个连接到微处理器(14)的输入输出系统(11),一个易失RAM(随机访问存储器)(12),一个由ROM(只读存储器)构成的非易失存储器和一个由闪光RAM或EEPROM(电可擦除可编程只读存储器)构成的可编程非易失存储器(15)。所有这些单元通过一个链接总线被连接到微处理器。例如在使用当前最新的现有部件的最佳情况下,一个智能卡包括一个ROM,一个32千字节的EEPROM和一个2千字节的RAM。

在常规Java系统中,在一个站点或PC编写一个应用。其源代码被编译成独立于所使用的平台的机器代码,被称作“Java字节代码”或字节代码的中间伪码。接着应用被下载到目标平台或常规Java平台上。由一组被称作客户端类,其方法已经被编译成伪码的类构成的被加载应用基于的是应用程序接口或API。应用程序接口使得控制一个编辑器,键盘或打印机的用户接口能够标准化。常规平台的虚拟机包括一个伪码验证程序,一个动态类加载程序,一个将伪码转换成机器代码的伪码解释程序和一个安全管理程序。

常规虚拟机和嵌入式系统被称作特定虚拟机的虚拟机之间的主要区别是嵌入式系统的虚拟机被分成两个分离部分。根据图4b,虚拟机包括一个部件(30),部件(30)在特定平台(40)外部,被称作“非平台式”虚拟机并且包括一个转换程序(32),而部件(41)在构成特定平台(40)的卡的内部,被称作“平台式”虚拟机并且包括一个伪码解释程序。

因而,在使用特定平台的情况下,应用的源程序(21)被编写出来,被编译器(22)编译成中间伪码,并且被一个常规站点(20)中的一个中间伪码验证程序(31)验证,接着被位于相同站点(20)或另一个站点内的转换程序(32)转换。在可能经过一个签名程序(34)的处理之后,应用被下载到便携对象或特定平台(40)的EEPROM(15)中。由一个加载程序执行这个加载,上述加载程序包括一个被称作下载程序(33)的非平台式部件和一个被称作加载程序(42)的平台式部件。与一个站点的常规平台的构成不同的是,特定平台(40)中和操作系统(48)一起位于ROM中的虚拟机(41)不能包含一个中间伪码验证程序,中间伪码验证程序过大以致无法在便携对象中存储和/或运行。特定平台(40)也不包含一个动态类加载程序。事实上,对于本发明的应用领域,在非平台式虚拟机(30)中,验证程序(31)验证所编译的类构成正确并且验证特定于特定平台的描述的语言违例。转换程序(32)完成加载类和解析引用所需的工作。转换程序处理类的静态链接,并且解析针对卡中已经出现的类,方法和属性的符号引用。它分配存储和建立表示类的数据结构,建立静态或本地方法与属性,并且初始化静态变量。

特定平台的运行时间环境(或RE)包括限于一个解释程序的“平台式”虚拟机(41),一个API平台和相关的所谓本地或静态方法(43)。API平台包括定义了一组被称作系统类(45)的类的API(应用程序接口)(44)和被应用用来访问运行时间环境(RE)与静态方法(43)的调用约定。静态方法(43)执行卡的存储器分配,输入和输出,与密码服务。

卡(41)的“平台式”虚拟机的解释程序支持Java语言并且逐个指令地顺序读取中间伪码。解释程序按照微处理器的语言解释这个中间伪码的各个常规指令,接着由微处理器来执行。通常,中间伪码的常规指令使得能够处理诸如算术处理和对象操作的高级功能。对象的概念涉及诸如列表,数据数组或类似结构的数据处理对象。应用的所谓客户端类(46)和API的系统类(45)全部被载入相同存储器空间并且通过一个类列表(47)来管理。

虚拟机(41)还负责管理类和对象,并且负责维护应用之间的隔离或防火墙以便允许安全共享也被称作属性,变量或字段的数据。

在使用类似智能卡的便携对象的情况下,当卡接收到一个由服务或终端发送的选择APDU(应用协议数据单元)时,运行时间环境(RE)可以直接激活特定平台的一个应用。

为了限制共享相同存储器空间的代码部件对数据的访问,常规平台中的一个常规方法以源代码中声明的可见性显式限制为基础。根据图4c,方法(NM1,NM2)和(NM3,NM4)以及属性(NA1,NA2)和(NA3,NA4)分别被封装成类(NCI3)和(NCI2),上述两个类分别属于包(包1)和(包n),各个包均包含若干个类。相对于一个包而言,一个类可以是类似(NC11或NC12)的公共类或类似(NCI3)的专用类,专用类意味着只有相同包中的类才可以访问这个类。一个类(NCI3)的方法(例如NM2)和数据(例如NA1)对于类(NM1,NA1)而言可以是专用的,而类(NM1,NA1)对于包(包111)而言是专用的,而对于包(例如NM1,NA2)而言是公共的。这种可见性限制允许在相同名称空间存储的各组包(包1,包n)中间获得灵活的访问,但也有若干缺点。常规或特定平台不支持子封装的概念。一个大规模应用的客户端类必须分布在各种子包中,子包仅代表虚拟机的不同包。为了在这些子包中间共享这些资源,这些资源必须被声明成公共资源,因而使其可被任何其他的包看见。因而难以清晰组织大规模应用的各种应用的封装并且难以在应用之间实现防火墙。

在使用常规平台的情况下,在一个站点中,根据动态验证维护源程序中声明的资源保密性。为了执行这些动态验证,虚拟机必须具有关于各个类,方法或属性的访问限制声明的全部信息,对于使用非平台式虚拟机的预链接中间伪码或字节代码的平台式虚拟机中的可用存储器空间而言这是不可能的。在使用便携对象的特定平台的情况下,访问限制可以在编译期间静态验证并且可以由非平台式部件的验证程序重新验证。由于转换期间的信息损失导致特定平台中无法执行验证,所以基本假定载入便携对象特定平台的内容是正确的。并且,不保证一个包不可以被不同源的新类扩展或修改,这就完全破坏了所有基于专用包的安全性。

常规平台虚拟机提供的第二个手段是名称空间隔离的概念。对于常规平台的动态链接模式,可以从本地文件系统被称作“ClassPath”的目录,本地文件系统的其它目录或远程服务器加载类,其中在此之前声明了构成系统类位置的第一种目录,而系统类构成了常规API平台。一个应用在“ClassPath”以外的客户端类必须通过专门编程的类加载程序加载。这个特征被专门用于通过授权的Java浏览器加载Java应用。因而通过不同的类加载程序加载有不同来源的应用。对于通称为URL(统一资源定位符)的各个定位符,使用一个“应用类加载程序”类的特定实例。一个类的外部名称由<包名>+<类名>组合而成。当加载一个类时,这个类被存储在一个内部类列表中,并且一个涉及被用来加载这个类的类加载程序的引用被加到这个类所属的包的名称的前缀中。因而类名称是<<类加载程序引用>+<包名>+<类名>>。因而被声明成属于相同包但由不同类加载程序加载的类未被虚拟机认为属于相同的包。

在引用解析期间,类加载程序的常见策略是首先在系统类中搜寻,并且在出现故障的情况下搜寻在加载程序可以加载类的位置上出现的整个类文件。根据加载程序的这种操作原理,一个应用不能直接访问由不同类加载程序加载的另一个应用的客户端类。一个应用可以访问ClassPath的公共类的所有公共资源,但是ClassPath的类不能直接访问一个应用的类,虽然通过将其转换成ClassPath中定义的公共类型可以引用应用的客户端类的实例。一个应用不能扩展或修改ClassPath的系统类所属的包或不同类加载程序加载的任何其他应用所属的包。除了Java语言提供的完整类型定义之外,通过把一个类加载程序引用插入类名称来使用名称空间隔离,使得能够在应用之间提供一个有效的防火墙。固有的名称空间隔离机制使得便于加载新应用。通过插入专门为此编程并且位于“ClassPath”的类,应用可以交换对象。在来自一个不同的类加载程序加载的另一个应用的一个对象可以被改变成“ClassPath”中定义的公共类型的情况下,一个应用可以使用这个对象。

不幸的是,不能在特定平台中实现这个基于常规虚拟机及其动态链接过程的名称隔离机制。由于特定平台的虚拟机需要允许存储常规Java平台具有未解析引用的类文件的存储器空间,上述虚拟机不能执行动态链接。在一个特定平台中,在具体的名称空间中不隔离API的系统类和应用的客户端类。

发明内容

本发明的目标是提供一个解决方案,上述解决方案的优点是在具有一个双部件虚拟机的嵌入式系统环境中进行名称隔离,其中通过非平台式部件实现静态链接模式。

在诸如支付终端的多用途嵌入式系统环境中,在具有诸如不同支付系统(Visa,MasterCard等等)的不同来源的Java应用之间有必要具有高性能防火墙。上述特点可用于允许在来自不同来源的应用之间进行灵活的协作。在不干扰已经加载的应用的前提下,还应当易于通过下载新应用,新应用模块或通过升级来更新嵌入式系统。

本发明的第一个目标是提供一个加载方法,该方法允许在应用之间实现健壮的防火墙,同时允许在应用之间进行协作并且使得能够升级应用或加载其它应用。

通过将应用从一个站点加载到一个基于本发明的嵌入式系统中的方法来实现这个目标,其中包括一个运行时间环境,该环境包含一个虚拟机和应用编程接口(API),该虚拟机包括一个中间伪码语言解释程序,在上述站点上编写应用的源代码,并且源代码被一个编译器编译成伪码,得到一个验证程序的验证,被一个转换程序转换并且被一个加载程序加载,其特征在于:

-转换包括静态链接多组被存储在嵌入式系统的相同名称空间,被称作模块的包,其中通过为各个模块分配一个标识符(MID),为封装在模块的类中的各个类,各个方法和各个属性分配一个引用编号来实现这种静态链接,

-针对一个模块的链接伪码中的一个方法或属性,被编码成三个字节的引用,该引用由一个指示有关某个在模块内部或外部的类的引用的指示符,类的编号,和方法或属性的编号构成,

-被加载的模块是一或多个被称作API模块的应用程序接口模块,其中包括均对应于一个应用的系统类或服务模块,一个针对某个外部类的引用被虚拟机有组织地解释成一个针对某个应用程序接口模块的引用。

根据另一个特征,将模块加载进嵌入式系统包括存储至少一个表示模块的数组,介于0到n之间、被链接程序与一个模块关联起来并且构成上述模块在数组中的索引的编号,和一个存储表示上述模块的标识符(MID)的数组中索引的关联的列表,上述数组和列表被存储在可编程非易失存储器中,一个针对伪码中某个外部模块的外部引用被虚拟机的解释程序解释成一个索引,该索引用于访问与模块数组中一个模块等价的模块。

根据另一个特征,加载针对各个模块存储一个表示其各个类的数组,其中包括有关其模块的索引的引用,并且针对各个类,还包括一个表示属性和方法的数组。

根据另一个特征,在一个单独的模块数组中引用各个模块,系统类被包含在一个单独的API模块中,并且虚拟机会将有关伪码中某个外部类并且不同于n的任何引用解释成一个有关上述API模块的引用。

根据另一个特征,以公共类后跟专用包中的类的顺序将类声明成公共类,在专用包中将属性和方法声明成保护类型,在专用包或专用类中对类进行编号;转换程序按照专用包和专用类中的公共,保护属性或方法的顺序对属性或方法进行编号。

根据另一个特征,系统类被包含在若干个可以被分别加载的API模块中,加载程序在可编程非易失存储器中维护两个表示模块的数组和两个对应的MID/IMi关联列表,其中一个用于API模块而另一个用于非API模块,加载程序根据其模块头中指定的模块性质将模块加载到两个数组中的一个数组内,任何有关模块数组中某个模块的外部引用均被解释成一个有关API模块索引的引用。

根据另一个特征,以这样的方式对一个模块进行静态链接,即有关中间伪码中一个非API模块的某个外部类的引用是一个模块的块头数组中的一个索引,其中各个条目是一个被引用API模块的一个标识符(MID),将上述模块加载到目标平台包括用根据API模块MID/IMi关联列表中的标识符(MID)获得的API模块索引的编号替换上述引用。

本发明的另一个目标是提供一个对应的嵌入式系统。

通过以下措施来实现这个目标,即基于本发明的嵌入式系统包括一个虚拟机和一个API平台,API平台包含应用程序接口,一个固定非易失存储器,一个可编程或可修改非易失存储器和一个随机访问存储器,其特征在于可编程非易失存储器包括至少一个包含系统类和服务模块的API模块,至少一个表示模块并且模块被加以索引的数组,和一个将表示模块的数组内的一个模块的索引与上述模块的标识符相关联的列表,其中各个类被编上索引并且各个类具有一个针对其模块索引的引用,各个类包括一个表示属性和方法的数组,其中属性和方法被编上索引,被编码成至少三个字节并且有关一个方法或一个属性的引用对应于一个有关在模块内部或外部的某个类的引用,模块的一个外部引用构成API模块在模块数组中的索引,一个类编号对应于表示模块的类的列表中的类的索引,一个方法或属性编号对应于表示模块的类的方法或属性的数组中的索引或方法或属性。

根据另一个特征,嵌入式系统包含将编码出一个针对某个方法或属性的引用的三个字节中的第一字节与一个指定数值n相比较以便判定其是一个内部类或外部类的装置。

根据另一个特征,嵌入式系统包括一个主模块,这个主模块包括系统的主程序。

根据另一个特征,以公共类后跟专用包中的类的顺序将类编上索引,并且按照专用包和专用类中公共,保护属性或方法的顺序将属性和方法编上索引。

根据另一个特征,可编程非易失存储器包括若干含有系统类的API模块,两个表示模块的数组和两个分别对应于一个表示模块的数组的MID/IMi关联列表,其中上述两个表示模块的数组中一个数组用于API模块而另一个数组用于非API模块和主模块。

根据另一个特征,嵌入式系统包括一个API模块的一个“访问管理程序”访问管理程序类,这个类包括一个允许通过主模块建立某个服务模块的一个实例的方法,上述类具有一个禁止其拥有不止一个实例的保护措施。

本发明的另一个目标是提供执行某个在多用途嵌入式系统中提供的应用的方法。

通过以下措施来实现这个目标,即执行多用途嵌入式系统的一个应用的方法包括一个运行时间环境,上述运行时间环境包含一个虚拟机和应用编程接口(API),上述虚拟机包括一个中间伪码语言解释程序,其特征在于在执行某个对应于一个应用,在模块数组中被引用的服务模块的中间伪码期间,一个模块外部引用被虚拟机解释成一个关于API模块数组或模块中某个API模块的索引的引用,其中针对伪码中的某个方法或属性,被编码成至少三个字节的引用对应于一个有关模块内部或外部某个类的引用,一个类编号和一个方法或属性编号。

根据另一个特征,在接收到执行一个具有某标识符的服务模块的请求时,通过一个将标识符与一个被引用模块的数组中的模块索引关联起来的列表,运行时间环境访问一个包括系统主程序的主模块的输入类,主模块建立一个API模块的某个控制对服务模块的访问的“访问管理程序”特殊类的一个实例并且使用这个类的一个方法产生请求的服务模块的输入类的一个实例,该方法将实例返回到主程序。

附图说明

通过阅读下列结合附图进行的描述会更清晰地理解本发明的其它特征和优点,其中:

-图1图示了加载一个基于第一实施例的便携对象所需的各种单元;

-图2图示了加载一个基于第二实施例的便携对象所需的各种单元;

-图3示出了一个模块的内部表示;

-图4a示出了一个智能卡的常规图例;

-图4b示出了构成一个嵌入基于现有技术的智能卡的虚拟机所需的系统。

-图4c示出了一个应用的类的结构。

具体实施方式

下面会以非限制性的方式针对在由一个智能卡或类似便携对象构成的特定类型嵌入式系统中实现本发明的情况并且结合图1-3描述本发明的方法。指定的字节代码或字节代码程序包括任何中间伪码或程序。

便携对象构成一个智能卡并且其结构类似于前面针对图4a和4b描述的结构,该结构具体包括一个RAM,ROM和EEPROM。特定平台(60)和一个常规站点(80)在ROM中具有一个运行时间环境(RE),这个运行时间环境包括API(62)和一个“平台式”虚拟机(61)。特定平台(60)在图1中被表示成包括存储器ROM和EEPROM。应当注意,特定平台(60)更具体地是指运行时间环境(RE)和EEPROM中提供的单元。便携对象在ROM中具有一个操作系统(63)。ROM中提供的API(62)构成API平台的基本API,基本API被平台式虚拟机加载以便后者运行。

虚拟机在便携对象外部的部件(90)包括一个中间伪码验证程序(91),一个转换程序(92)并且可能还包括一个签名程序(94)。签名程序提供一个签名以验证通过验证程序和转换程序的权利。便携对象在加载时会验证这个签名。由一个加载程序将应用或补充基本API的新API加载到EEPROM中,加载程序可以由两个部件组成,一个是可以安装在便携对象(90)的外部虚拟机中并且被称作下载程序(93)的便携对象外部部件,另一个是被称作加载程序(68)的特定平台内部件。

在一个第一实施例中,特定平台(60)包括两个特殊模块,即一个API模块(65)和一个主模块(66)。其它模块被称作服务模块(67)。各个模块对应于一组会被存储在相同名称空间内的包。API平台指定基本API(62)和所有定义API模块(65)或API平台的模块的系统类。主模块包括定义主程序的主类。除API模块(65)以外,各个模块具有一个被称作“入口类”的具体类,这种类构成了模块的访问点。对于主模块,这个“入口类”是主类(CP),主类包含一个被称作“main”的静态方法。对于服务模块,则是一个具有唯一一个构造函数的类,这个构造函数没有参数并且实现了API平台中定义的一个特殊公共“service”接口。加载一个应用对应于加载一个服务模块。各个模块接收一个特定标识符。这种被称作MID的标识符可以是一个编号,字符串或数组。为了举例,标识符是一个字符串。

当它们被不同于特定平台虚拟机的下载机制载入到平台中时,模块接收一个介于0和n之间的编号。因而根据这个约定,特定平台中最多可以出现n+1个模块。在加载新服务模块期间,模块下载程序(93)和加载程序(68)维护一个表示模块的数组(TRM)(69)。与一个模块关联的编号是这个模块在数组中的索引(IM)。加载程序(68)还维护一个将索引(IM)与各个模块的标识符(MID)关联起来的列表(70)。对于索引IM0,API模块按理接收到编号0,而对于索引IM1,主模块接收到编号1。各个模块的块头包含一个允许加载程序确定模块性质-“main”,“service”,或“API”模块的指示符。

加载程序(68)只能加载被授权驻留在便携对象中的模块,即具有一个能被便携对象识别的签名的模块。因而加载程序(68)包含验证一个接收模块的签名,将上述签名与便携对象能识别的签名相比较,并且在比较出不同的情况下禁止加载的装置。

通常,正如上述现有技术中定义的,编写一个应用的源程序(81),用一个编译器(82)进行编译,并且由验证程序(91)进行验证。

由转换程序(92)中一个被称作链接程序的部件在转换程序中执行的静态链接会通过以下分配来解析符号引用

-为一个模块的各个类分配一个编号(NCI),

-为一个类中的各个方法分配一个编号(NM),并且

-为一个类中的各个属性分配一个编号(NA)。

所有这些编号(NCI,NM,NA)均介于0和n之间,并且可以通过一个字节来表示。例如,所有这些编号均介于0和255(n=255)之间。因而对类的一个方法或属性的引用会被编码成模块的方法的双字节链接伪码。伪码会包含这两个字节,<NCI>用于类,<NA>用于一个属性,或<NM>用于一个方法。

根据图3,有关一个API模块(65),一个主模块(66),或一个服务模块(67)的内部表示会包含一个表示类的数组(TRC);被嵌入式系统外部的链接程序与各个类关联起来的编号(NCI)是在数组(TRC)中表示这个类的索引(ICi)。各个类也具有一个针对其模块的索引IMi的引用。类似地,各个类的表示包含一个表示方法的数组(TRMe)和一个表示属于类的属性的数组(TRA)。被嵌入式系统外部的链接程序与各个方法关联起来的编号(NM)是在数组(TRMe)中表示这个方法的索引IMi,被嵌入式系统外部的链接程序与各个属性关联起来的编号(NA)是在数组(TRA)中表示这个属性的索引(IAi)。

例如,我们想要一个模块能够只引用其自身的类和API平台的系统类,即对应于常规平台的“ClassPath”的类的系统类。根据本发明,为了能够区分对模块内部类的引用和对系统类(或模块的外部类)的引用,在对一个方法或属性的引用中加入一个内部(II)或外部(IE)指示符。被解析的引用接着被编码成三个字节:<IE/II><NCI><NM>或<IE/I><NCI><NA>。    

根据一个已有的约定,对于第一个字节<IE/II>的数值n,n在我们的例子中为255,对应于模块的一个内部引用<II>,第一个字节的任何其他数值对应于模块的一个外部引用<IE>。

虚拟机在便携对象(90)外部的转换程序(92)的链接程序首先链接在其伪码中没有任何外部引用<IE>的API模块(65),并且产生一个对应于其类及其方法和属性的符号名称模式的布局或排列。在链接其它模块期间,这个布局会被用来建立对API模块(65)的系统类的外部引用。

根据我们对引用的编码字节的约定,在API模块中最多可以有256(n+1)个类,在各个附加模块中最多可以有256个类。

在一个服务模块的执行期间,当虚拟机(61)在伪码中发现针对一个方法(<NM>)或属性<NA>的某个引用时,在已知在类<NCI>中发现这个引用的情况下,虚拟机可以直接检索有关模块的索引<IMi>,后者对应于外部(IE)或内部(II)引用。虚拟机会有条理地将一个服务模块的伪码中的任何外部引用<IE>解释成一个针对API模块的引用。除了API模块的类之外,服务模块或主模块不能引用任何其他模块的类。这个API模块的系统类不能引用服务模块或主模块的类。针对一个模块的一个类,对应于第一字节的数值n的内部引用不需要有关要分配给模块的名称空间的任何先验知识。在转换期间没有以先验方式定义任何固定名称空间的事实允许加速引用解析并且在转换之后的加载期间确定一个模块的名称空间。在解释一个针对伪码中某个属性或方法的引用期间,虚拟机使用三个级联索引<IE/II><NCI><NM>或<IE/II><NCI><NA>。在确定模块的存储器空间的情况下,索引<NCI>确定有关模块的类的数组(TRM)中的期望条目,接着上次的索引<NM>或<NA>指定方法数组(TRMe)或属性数组(TRA)中的期望条目。

API模块包括一个被称作“访问管理程序”类的特殊类(64),这个类包括一个本地方法(getServiceInstance),其作用是根据模块的标识符(MID)返回一个对象,这个对象是所请求的服务模块的输入类的一个实例。这个方法使用MID/IMi关联列表(70)在模块数组(69)中搜寻所请求的模块的索引,接着产生这个模块的输入类的一个实例,这个实例被方法返回。根据本发明,根据一个禁止这个类具有不止一个实例的方法通过构造过程保护“访问管理程序”类(64)。这个方法(getServiceInstance)属于主模块包含的主程序。在使用便携对象时首先被激活的主模块“访问管理程序”类的一个并且唯一的一个实例,这允许上述实例使用方法getServiceInstance,但禁止任何其他服务产生另一个使用这个方法的实例。

在操作中,就象在常规平台中那样,运行时间环境(RE)访问主模块的输入类(EC)并且激活其输入方法(main)。由于为了激活其它服务主模块必须已经具有访问类的这种实例,首先被激活的主模块在任何其他服务之前建立“访问管理程序”类的一个实例。

这个简单设备允许重新产生与常规平台中名称空间概念相关的保护效应。一个服务模块被载入模块数组并且外部引用在伪码中的任何出现均被虚拟机解释成针对API模块的引用这一简单事实致使这个模块完全不能被其它模块直接访问,因而产生了一个总体上的防火墙。

这个第一实施例可以获得双部件虚拟机中名称空间隔离产生的防火墙优点。然而这个实施例不是非常灵活并且具有两个缺点。

首先,该实施例禁止对已经预链接的模块的系统类进行任何修改或扩展。常规Java体系结构允许在不影响附加模块已经编译的类的情况下修改和扩展API平台的类。但在上述实施例中,虽然对于不同模块是不可见的,对系统类的任何修改仍然会修改API平台的布局并且使得有必要修改各个模块的预链接伪码,其中上述各个模块已经与布局的先前版本和解释程序进行链接。

其次,假定预链接模块可在各种嵌入式平台或终端之间移植,这需要所有这些平台均具有相同的API平台布局,因而禁止利用任何非公共的扩展。

为了部分补救这些缺点,第一实施例的一个变体包括需要在布局的编号方式中公共类排在专用包的类之前。另外,公共方法或公共属性排在保护方法或保护属性以及专用包和专用类中的方法或属性之前。这允许向API模块(API)自由增加新的公共类。

图2示出了允许升级API平台的第二实施例。与单独由一个API模块构成的方式不同,API平台由若干个可以分别加载的API模块(100)构成。

在这个实施例中,下载程序(93)和虚拟机共享两个模块数组和两个MID/索引关联列表而不是其中的一个,其中一个数组(101)和一个关联列表(102)用于API模块,而一个数组(103)和一个关联列表(104)用于对应于服务模块(67)和主模块(66)的非API模块。

各个模块在其块头中含有一个指示其性质是“Service“还是”API”的指示符,这允许加载程序把模块加载到API模块数组(101)或非API模块数组(103)中。在编译期间这个指示符被转换程序放在模块的块头中。

仅在非API模块之间提供由名称空间的隔离构成的防火墙。对一个服务模块的任何外部引用会被平台式虚拟机的解释程序解释成API模块数组的一个索引。

非API模块的编号从0开始,最多为255,在这个例子中n=255。例如,0是主模块(66)的索引。API模块(100)的编号为0到254,0可以是一个所谓的主要API模块的索引,其中包含所有的本地方法。根据上述约定,这允许API平台中最多有255(n)个不同的模块。对伪码中一个方法或属性的引用为:

<<IE/II><NCI><NM/NA>>

象在第一实施例中那样,第一字节的数值255(n)指示一个模块内部引用。不同于255的各个数值指示对API平台的API模块数组的一个特定模块(100)的外部引用。

在非平台式链接程序(92)进行链接之后,一个模块的伪码包含一个块头,其中具有一个被用来链接当前模块的被引用模块数组。这个被引用模块数组最多包括255个条目,每个条目对应于一个API模块(100)的标识符(MID)。因而伪码中一个外部一个的第一个字节会是这个数组中的一个索引。当一个非API模块(67,66)被载入平台时,与API模块(100)相关的索引号是已知的,并且使用API模块(100)的MID/IMi关联列表(102)由与被引用的API模块相关索引号替代外部引用的各个第一字节。这个替换是加载程序(68)在特定平台中执行的纯链接操作,其中MID/IMi关联列表(102)仅被用于执行这个链接操作。

对于这个例子,假定在一个服务模块“TEST”的伪码中我们具有针对一个标识符(MID)为“F00”的API模块的编号为7的类的编号为5的方法的引用。还假定“F00”是在服务模块“TEST”中发现被引用的第四外部API模块的标识符。因而伪码中的引用由下列三个数值构成:3,7,5。

编号3对应于被引用模块的数组内出现在模块块头中的第四索引,该模块位于伪码的开始处,并且这个条目的值是标识符(MID)“F00”。假定在加载API模块“F00”时在API模块的关联列表(102)中内部索引34已经被分配给目标平台中的内容。所以,通过使用关联列表(102),加载程序(68)修改服务模块“TEST”的伪码中的引用以便其变成:34,7,5。

在执行一个模块的伪码期间,虚拟机有条理地将一个模块外部引用解释成API模块数组中的一个条目。非API模块数组的模块对于彼此以及其它API模块仍然不可见。这个简单设备允许重新产生与常规平台中名称空间概念相关的保护效应。一个模块被载入非API模块数组的简单事实使其完全不可被其它模块直接访问,因而产生了一个总体上的防火墙。

API模块数组(101)包括一个被称作“API访问”模块的特定模块(105),这个模块包括一个“访问管理程序”类中的一个本地方法(getServiceInstance),其作用是返回一个对象,这个对象是所请求的服务模块的输入类的一个实例。这个方法使用MID/IMi关联列表(104)在非API模块数组(103)中搜寻所请求的服务模块的索引,接着产生这个模块的输入类的一个实例,这个实例被方法返回到主程序。推荐的安全策略是使“访问管理程序”类成为一个保护类,其构造函数和方法被声明为保护类型。另外,“API访问”模块(105)包含一个禁止“访问管理程序”类具有不止一个实例的保护措施。为主模块(66)中包含的主程序保留这个方法。首先被激活的主模块产生访问管理程序模块的一个实例,这允许上述实例使用方法getServiceInstance,但禁止任何其他服务产生另一个使用这个方法的实例。因而,主模块可以产生服务实例。

若干方法可用于获得这种禁止“访问管理程序”类具有不止一个实例的保护。例如,当一个实例已经存在并且触发一次安全异常时,“访问管理程序”类的构造函数可以禁止产生一个实例的请求。在操作中,就象在常规平台中那样,运行时间环境(RE)访问主模块(66)的输入类并且激活其输入方法(main)。首先被激活的主模块在任何其他服务之前建立“访问管理程序”类的一个实例。

为了允许一个服务模块激活另一个服务模块,通过向API访问模块(105)的“访问管理程序”类增加允许任何模块向其发送请求的公共类可以修改这个严格的安全策略。这些请求会得到主模块产生的唯一实例的处理和控制。这些公共类具体包含一个允许获得唯一实例的静态方法。一个访问属于“访问管理程序”类的实例的对象的模块可以激活另一个服务模块并使用它,但是在虚拟机没有引用的情况下不能直接引用其类,其方法或其属性,假定伪码中的任何外部引用均是模块的内部引用或一个API模块的外部引用。

对于这个解决方案的一个简单实施例,在API模块中间不必进行循环引用。因此,“引用”关系的传递闭包必须是一组模块上的部分严格顺序。因而在转换程序(92)的链接程序中可以设计一个简单策略,该策略通过首先处理尚未链接的最小单元来链接和产生API模块的布局。可以使用基于部分有序的相同策略下载API模块,以便在下载一个模块M时其引用的所有模块已经被下载并且已经为它们分配了编号。模块加载程序(68)通过为具有次序n的API分配索引n-1来实现目标平台内的内部索引分配。一个API模块不能引用另一个具有更高索引的API模块。

使用这个具有双模块数组(101,103)和双关联列表(102,104)的系统便于用若干可以分别加载的API模块替换一个单独的API模块。若干API模块对一个单独API模块的替换使得能够用新模块扩展API平台,其中不修改已经加载的模块的链接并且不改变防火墙提供的安全措施。当然,这两个实施例是不兼容的;必须明确针对一个实施例或另一个实施例预链接模块,其中涉及一个实施例的伪码不被移植到实现另一个实施例的平台上。此外,两个实施例的虚拟机的解释程序互不相同。在第一实施例中,虚拟机只操作一个数组和一个关联列表;一个引用的第一字节被虚拟机解释成任何数值等于n的内部引用和任何数值不等于n的纯API模块外部引用。在第二实施例中,虚拟机操作两个数组和两个关联列表:伪码中一个引用的第一字节被虚拟机解释成针对任何数值等于n的模块的内部引用,并且任何不等于n的数值会被直接当作API模块数组中的一个索引。在两个实施例中,虚拟机的解释程序包括将一个针对某方法或属性的引用的三个字节中的第一字节与一个指定数值n相比较以便判定其引用的是一个模块内部类或外部类的装置。在加载时可以确定API模块的编号方式以便以一种非常简单的方式固定设置伪码中的外部引用。

相同机制被用来处理两种模块,虽然其使用和获得安全保护的方式全然不同。由于其类是系统类,所以任何模块均可以自由访问API模块。模块化方案和服务模块一起被用来获得一个保护这些模块不受任何直接访问的强防火墙。

在具有诸如16Kb的ROM,8Kb的EEPROM和256k的RAM的有限资源的任何类型的便携对象中均可以实现基于本发明的方法。

本领域的技术人员能够进行的其它修改也属于本发明的宗旨的一部分。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号