基于MMU架构的JavaCard系统组件更新方法

文档序号:6429919阅读:196来源:国知局
专利名称:基于MMU架构的Java Card系统组件更新方法
技术领域
本发明涉及Java Card技术、嵌入式系统及二进制代码重定位技术,主要是实现一种基于MMU新架构解决Java Card系统组件动态更新的方法。
背景技术
Java Card是一种能运行Java小应用程序的智能卡,它以其多应用的支持、良好的安全特性、面向对象的编程环境、应用程序动态下载等优点得到了快速发展,在SIM/ USIM应用、身份认证以及金融等领域的应用越来越广泛。Java Card是一种嵌入式系统, 在资源极其受限的智能卡上运行一个java运行时环境,其最大的优势在于可以在卡片发行之后动态地下载及更新卡上的应用程序,实现了灵活的多应用卡。然而,由于目前Java Card平台的存储特性,系统组件(包括java运行时环境,系统API,卡片操作系统等)在发卡后被固化在ROM中,如果发卡后出现系统组件故障或漏洞就只能通过更换新卡的方法来解决,由于智能卡的发卡量极大,这种方法将给发卡方带来巨大的损失,所以有必要开发出一种新的架构或方法来解决发卡后系统组件的更新问题。目前,国内外对标准的面向对象程序的类动态更新的研究已经非常多了,对动态类的实现主要有三种方法1)、通过对JVMCJava Virtual Machine)进行修改,使JVM能够支持Java类的动态更新操作;2)、利用库函数的支持,如C++中的相关实现;3)、通过Java 语言的某些机制,编写合理的算法和类装载机制来支持类动态更新。对于Java的动态更新,Alessandro提出了一种基于类重命名和代码重写的技术来实现Java类动态更新,使用一个叫DUSC的工具在运行时动态切换类,但是这种方法非常耗时,且对存储空间浪费严重,不适合计算和存储资源极其受限的Java Card环境;另外一个支持在线更新的JVM是JV0LVE,其利用相关工具查找到所需更新的类列表,然后动态装载类并利用JIT技术将其编译用以替换现有类,最后利用修改了的垃圾收集器将原对象引用修改为新对象引用。因为Java Card平台不支持类动态装载及JIT机制,所以必须对这种方法进行修改,Agnes C. Noubissi提出了一种类似的方法,并用于Java Card平台,在卡外通过相应的工具得到更新列表,卡内通过软件查找所有需替换的类,通过传入数据创建新类及实例,并修改所有对原实例的引用来实现动态更新,其使用纯软件的方法来实现查找、 替换及更新操作,导致效率比较低,且智能卡赖以生存的安全问题难以得到保证。

发明内容
本发明针对上述技术缺陷,提出一种基于MMU架构的Java Card系统组件更新方法。为了解决上述技术问题,本发明的技术方案如下
基于MMU架构的Java Card系统组件更新方法,其特征在于,包括卡外操作和卡内操
作,
所述卡外操作步骤如下1)通过对比修改后的工程代码和原始工程代码,给出代码修改项目列表;
2)查找代码修改项目列表中项目在目标文件中的虚拟地址入口及二进制长度,给出系统组件更新任务列表;
3)对所述系统组件更新任务列表中虚拟地址接近的项目进行合并,生成卡内MMU修改信息表和代码实际二进制修改信息表;
所述卡内操作步骤如下
4)传输代码修改数据,将更新后的代码数据写入卡内EEPROM空间,并以所述更新后的代码数据在卡内EEPROM空间的新地址作为参数处理之后进行系统调用;
5)卡内操作系统进行认证,如通过认证则修改MMU的TLB初始化表,并重启卡内操作系统进行初始化。作为可选方案,所述步骤2)中给出系统组件更新任务列表包括对原项目修改、对原项目删除和对原项目的新增,
所述对原项目修改操作步骤如下
如果修改后项目的二进制代码长度不大于原项目的长度,则找到原项目的虚拟地址入口地址,在MMU的TLB表中新增一个表项,将所述虚拟地址入口地址映射到EEPROM中,并保持字节长度相等,在EEPROM新开辟的位置写入修改后的项目二进制码,多余的位置补入空操作,如果新修改项目的二进制代码长度大于原项目的长度,则将此修改可以分为原项目删除与原项目的新增的组合;
所述对原项目删除操作步骤如下 将所有引用被删除项目的代码进行修改; 所述对原项目的新增操作步骤如下
新增项目代码只可能在修改后的代码中被引用,对其处理可分两个步骤在EEPROM中划分一块区域,将新项目代码写入;然后利用逆向工程将修改代码中引用新增项目的地址更改为新地址。作为可选方案,当多个更新项目的虚拟地址跨度小于更新项目实际地址占用空间的两倍,即更新空间利用率高于50%的时候,可将更新项目在存储空间实现步骤3)中对所述系统组件更新任务列表中虚拟地址接近的项目进行合并。作为可选方案,步骤5)中所述修改MMU的TLB初始化表采用将一定长度的虚拟地址空间映射到等长的物理地址空间中,所述TLB初始化表格式分为logiC_addr_base、 Length和physical_addr_base,所述logic_addr_base表示MMU所要映射的虚拟地址段的基地址,所述Length表示此逻辑地址段的长度,所述physical_addr_base表示本段逻辑地址所映射到的物理地址的基地址。本发明的有益效果在于
1.本发明把更新操作分为卡外和卡内操作,大量的工作在卡外完成,借助于普通 PC或工作站比Java Card强大的多的性能,对更新任务做了足够的优化,大大提高了更新效率。2.本发明提出了一种卡内MMU的设计及初始化方法,采用软硬件结合的方法实现系统组件的动态更新,简化了卡内修改量,方法简单容易实施。3.本发明保证了 Java Card系统组件更新的安全性,通过对处理器和操作系统的设计,提供了三种处理器工作模式,MMU初始化表只有处理器工作在最高权限模式时才能访问,通过系统调用进行,此时要进行发卡商认证,保证了安全性。


图1为现有技术中Java Card平台存储系统架构; 图2为本发明的步骤流程图3为一个典型的更新任务列表;
图4为针对图3的卡内MMU修改信息表;
图5为针对图4第一条更新例,卡内更新操作流程示意图。
具体实施例方式下面将根据附图和具体实施例对本发明做进一步的说明。基于一种MMU机制的卡内存储架构,以及利用MMU解决Java Card系统组件升级的方案。该方案需要一系列的卡外和卡内操作来实现,卡外通过对比代码的修改将其修改位置在系统二进制目标文件中定位,形成一个更新任务列表,并采用一定的算法优化该列表以减少更新项数及通信量;卡内将修改后的代码片段存储在EEPROM中,并采用修改 TLB (Translation Lookaside Buffer)表的方法,来改变虚拟地址到物理地址的映射,将原虚拟地址映射到修改后项目的存储位置,实现代码重定位,达到更新系统组件的目的。在本发明中,所提出的Java Card架构通过一个简单的MMU来管理卡内存储资源, 实现虚拟地址到物理地址的转换,将虚拟地址分段并静态地映射到等长的一段物理存储器上,初始状态下每个物理存储器对应一个TLB映射表项,多余的TLB入口项设为无效,以供系统组件更新时增加映射项目使用。卡外操作的主要目的是找出系统组件中所有的修改信息,并将其在最终二进制文件(.bin)中准确定位,以便将修改内容和位置信息传入卡内进行更新。位置信息可通过查看工程文件编译时生成的.map文件(工程使用IAR Embedded Workbench编译)得到其虚拟地址入口和二进制长度,由项目入口地址、长度及修改后内容, 即可建立一个更新任务,所有更新任务组成一个更新任务表。对更新任务表的优化体现在两个方面1)、合并任务表项,减少卡内MMU映射数目,可将地址相近的更新任务合并,在减少MMU映射数目的同时,不至于浪费过多存储空间;2)、项目实际修改内容的映射,减少数据传输量,对项目内容的实际修改往往只是其地址空间的一小部分,可将实际修改值及其偏移量为传输信息,而未修改部分则直接从卡内ROM中原始位置拷贝,以提高速度并减少信息传输量。卡内操作使用卡外操作得到的更新数据以及地址映射表,在EEPROM中写入更新代码,并修改MMU的TLB映射,达到更新系统组件的目的。卡内提供一个服务程序接收并处理更新数据,调用卡片操作系统来完成MMU初始化表的修改。MMU初始化表存放于EEPROM 中特定区域,只有提供MMU初始化表修改的系统调用sysMmuModify可以访问该区域,当发生该系统调用时,系统首先进行发卡商认证,如认证通过则提供调用,否则退出系统。如果系统调用成功完成,则系统重新启动以完成初始化,至此Java Card系统组件更新成功,带有新系统组件的卡片即可正常使用。具体如下所述如图1所示,显示了 Java Card平台的存储架构,智能卡操作系统(COS),Java Card运行时环境(JCRE),系统API以及一些内置小应用程序等系统组件存放在ROM中,这个过程是在卡片生产的时候烧入的,一旦写入即不可更改,这就为以后的升级更新带来了麻烦,一旦系统组件出现漏洞,就必须回收所有已发卡,并制发新卡,智能卡往往发卡量巨大,将给发卡商带来较大损失。图2显示了本发明的总体操作流程,主要分为以下几个步骤
201,DIFFGenerator 对修改后的工程和原始工程代码进行比较,给出代码具体修改项目的列表(DIFF List);
202,DIFF Mapper 根据步骤201提供的代码具体修改项目列表,查找这些项目在目标文件中的虚拟地址入口及二进制长度,给出系统组件需更新的任务列表(Mapped List);
203,ListOptimization 对系统组件需更新列表进行优化,减少卡内MMU映射数量及卡内外数据传输量,产生卡内MMU修改信息表(MMU map Info)以及代码实际二进制修改信
(Changed Data Info);
204,DataProcessing & System Call Java Card卡内提供程序对系统更新操作进行处理,并调用卡片操作系统进行MMU初始化表数据的修改;
205,Authentication& MMU TLB Modify 操作系统提供修改MMU初始化表的系统调用并进行发卡商认证,如通过认证则调用服务修改MMU的TLB初始化表,完成之后系统重启, 完成初始化之后进入用户模式,MMU的TLB表已经修改为新映射,代码重定位完成,运行新系统组件的Java Card卡片即可正常使用。图3给出了经过步骤202处理之后的一个典型的更新任务列表(Mapped List),具体如下
通过查看IAR Embedded Workbench编译生成的工程.map文件,可以清楚地找到每个函数及常量在系统中的虚拟地址入口及其二进制长度,通过对比两个版本工程的.map 文件以及前一步骤得到的修改信息列表(DIFF List),即可得到一个所需更新的任务列表 (Mapped List),为了更清晰地展示系统代码修改前后的差异,将未修改的项目忽略,只列出项目的修改、删除及增加,如图3所示,其中old map和new map分别显示了代码修改前后的内存分配情况,使用字母和数字表示函数和常量名,可以看出新版本代码中修改了 a, b, c, d, e五个函数;删除了 f,g, h, i四个函数;新增了 j,k两个函数;修改了常量cons. 2 以及系统API类的mask数组。对于源代码项目更新的不同操作采取以下不同的方法处理 (1)对原项目的修改
如果新修改项目的二进制代码长度不大于原项目,则找到原项目的入口地址,在TLB 表中新增一个表项,将此入口地址映射到EEPROM中,并保持字节长度相等,在新位置写入修改后的项目二进制码,多余的位置补入空操作。如果新修改项目的二进制代码长度大于原项目,则将此修改分为删除原项目与新增项目的组合。所以应该尽量使得修改后项目代码长度不大于原代码,这样可以节省卡内存储空间。(2)对原项目的删除
将所有引用被删除项目的代码进行修改,被删除代码即失效,所以新项目代码中将不会引用原项目中的删除代码,对删除操作可不予处理。(3)项目的新增新增项目代码只可能在修改后的代码中被引用,对其处理可分两个步骤首先,在 EEPROM中划分一块区域,将新项目代码写入;然后利用逆向工程将修改代码中引用新增项目的地址更改为新地址。 图4给 出了图3所示的任务列表经过步骤203优化之后产生的卡内MMU修改信息表(MMU map hfo),具体如下
对于表项的合并,类似于内存碎片的合并,有些更新项目的地址非常接近,尤其是对同一目标文件中的函数其地址往往接近于连续分布,即使中间有间隔也非常小,完全可以将其合并,统一映射到新地址,减少需映射的项数,但此方法必将造成一部分的存储空间的浪费,所以必须有个折中的方法。为此给出公式(1),表示当多个更新项目的地址跨度小于更新项目实际地址占用空间的两倍,即更新空间利用率高于50%的时候,可将更新项目在存储空间上合并。
利用上述规则对图3中的项目进行处理,可得结果如图4所示。图4中logical address表示所合并的更新项目在原工程中的虚拟地址范围,physical address表示合并之后的更新项目在工程中的地址范围和内容,其中new address表示在EEPROM中新分配的物理地址,items表示这段新地址空间中所存放的更新项目内容。图中的每一条记录就形成了一个MMU映射项目。如图4中的第一条记录,既是将图3中前三条修改记录合并为一条修改记录,因为图3中前三条记录中函数ι b, c的在空间上连续分布,可将三个函数的代码存储空间整个映射到新的空间来进行代码重定位,这样可以减少MMU中TLB表的映射数量。
权利要求
1.基于MMU架构的JavaCard系统组件更新方法,其特征在于,包括卡外操作和卡内操作,所述卡外操作步骤如下1)通过对比修改后的工程代码和原始工程代码,给出代码修改项目列表;2)查找代码修改项目列表中项目在目标文件中的虚拟地址入口及二进制长度,给出系统组件更新任务列表;3)对所述系统组件更新任务列表中虚拟地址接近的项目进行合并,生成卡内MMU修改信息表和代码实际二进制修改信息表;所述卡内操作步骤如下4)传输代码修改数据,将更新后的代码数据写入卡内EEPROM空间,并以所述更新后的代码数据在卡内EEPROM空间的新地址作为参数处理之后进行系统调用;5)卡内操作系统进行认证,如通过认证则修改MMU的TLB初始化表,并重启卡内操作系统进行初始化。
2.根据权利要求1所述的基于MMU架构的JavaCard系统组件更新方法,其特征在于,所述步骤2)中给出系统组件更新任务列表包括对原项目修改、对原项目删除和对原项目的新增,所述对原项目修改操作步骤如下如果修改后项目的二进制代码长度不大于原项目的长度,则找到原项目的虚拟地址入口地址,在MMU的TLB表中新增一个表项,将所述虚拟地址入口地址映射到EEPROM中,并保持字节长度相等,在EEPROM新开辟的位置写入修改后的项目二进制码,多余的位置补入空操作,如果新修改项目的二进制代码长度大于原项目的长度,则将此修改可以分为原项目删除与原项目的新增的组合;所述对原项目删除操作步骤如下将所有引用被删除项目的代码进行修改;所述对原项目的新增操作步骤如下新增项目代码只可能在修改后的代码中被引用,对其处理可分两个步骤在EEPROM中划分一块区域,将新项目代码写入;然后利用逆向工程将修改代码中引用新增项目的地址更改为新地址。
3.根据权利要求1所述的基于MMU架构的JavaCard系统组件更新方法,其特征在于, 当多个更新项目的虚拟地址跨度小于更新项目实际地址占用空间的两倍,即更新空间利用率高于50%的时候,可将更新项目在存储空间实现步骤3)中对所述系统组件更新任务列表中虚拟地址接近的项目进行合并。
4.根据权利要求1所述的基于MMU架构的JavaCard系统组件更新方法,其特征在于,步骤5)中所述修改MMU的TLB初始化表采用将一定长度的虚拟地址空间映射到等长的物理地址空间中,所述TLB初始化表格式分为logic_addr_base、Length和physical_addr_ base,所述l0giC_addr_base表示MMU所要映射的虚拟地址段的基地址,所述Length表示此逻辑地址段的长度,所述physical_addr_base表示本段逻辑地址所映射到的物理地址的基地址。
全文摘要
本发明公开了基于MMU架构的Java Card系统组件更新方法,包括卡外和卡内操作,具体包括1)通过对比修改后的工程代码和原始工程代码,给出代码修改项目列表2)查找代码修改项目列表中项目在目标文件中的虚拟地址入口及二进制长度,给出系统组件更新任务列表3)对所述系统组件更新任务列表中虚拟地址接近的项目进行合并,生成卡内MMU修改信息表和代码实际二进制修改信息表4)传输代码修改数据,将更新后的代码数据写入卡内EEPROM空间,并以所述更新后的代码数据在卡内EEPROM空间的新地址作为参数处理之后进行系统调用5)卡内操作系统进行认证如通过认证则修改MMU的TLB初始化表,并重启卡内操作系统进行初始化。
文档编号G06F9/445GK102243595SQ20111021981
公开日2011年11月16日 申请日期2011年8月3日 优先权日2011年8月3日
发明者吴健, 尹建伟, 曹晓, 李莹, 殷中科, 邓水光 申请人:浙江大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1