JAVACARD减少应用开发风险的建议
参考Java Card & STK Applet Development Guidelines by gemalto文档。
由于EEPROM和闪存的寿命有限,应用频繁的读写同一位置可能导致运行故障。本文主要描述了如何设计程序,尽量最小读写内存的必要。如果不遵守本文的建议的话,实际运行过程中可能会导致严重的问题,javacard可能会导致意想不到的行为。
1.检查所有的变量的存储位置,如果NVM存在压力风险,移动这些变量的位置。(保证100000的EEPROM和FLASH的擦写次数)。
java和javacard内存模型是不同的:javacard中,对象的位置存储在NVM。包括:所有基本数据类型(byte,short)的全局变量;使用new创建出来对象。
存储在RAM的内存部分包括:局部变量、方法的参数。通过专用Javacard.framework.APIs显式创建的瞬态对象,其引用存放于NVM,被引用的数组存放于RAM中。
如下代码所示,i,j,k,counter,workingBuffer,transientBuffer,是全局变量,存储于NVM区域,reg是ToolkitRegistry类型的对象,也在NVM中。
apdu是一个方法的参数,存储于RAM中。
public class exampleF1 extends Applet { byte counter=0; byte[] workingBuffer; byte[] transientBuffer; short i, j, k; private ToolkitRegistry reg; void process(APDU apdu){ short i, j, k;//located RAM byte[] reference;//located RAM … } public exampleF1 () { transientBuffer = //transientBuffer是一个全局变量,存储于NVM。其引用的数组存放于RAM中 JCSystem.makeTransientByteArray((short)10 0, JCSystem.CLEAR_ON_RESET); workingBuffer = new byte[12];//全局变量,located NVM } }
2.在接收状态更新事件的时候,避免在NVM中的写操作。
当有一个STATUS APDU命令进来的时候,一个相应的注册状态事件将会被处理。特别要注意的是,在应用程序处理过程中的NVM读写部分。
public class exampleF2 extends Applet implements ToolkitInterface{ byte[] workingBuffer; byte[] transientBuffer; short s; public exampleF2() { transientBuffer = JCSystem.makeTransientByteArray((short)20 0, JCSystem.CLEAR_ON_RESET); workingBuffer = new byte[200]; } void processToolkit(byte event){ short i; switch (event) { case EVENT_STATUS_COMMAND: for (s=0; s<200; s++) { workingBuffer[s]=(byte)s;//workingBuffer是全局数组,s也是全局变量,都存放于NVM中,注册事件可能导致频繁的读写NVM,一段时间后NVM寿命会很快耗尽。 } default: break; } void processToolkit(byte event){ short i; switch (event) { case EVENT_STATUS_COMMAND: for (i=0; i<200; i++) { transientBuffer[i]=(byte)i;//i和transientBuffer存在RAM中。 } default: break; }
3.1避免传递太多参数在函数中(最多4,5个);
3.2避免在每个方法中声明太多的局部变量;
3.3减少方法调用嵌套问题。
一个javacard存储所有方法的参数和局部变量在RAM的专用区域中,叫做J-Stack。并且RAM资源是有限的。
4.所有的对象创建,需要在初始化的过程完成。
和java不同的是,javacard不需要使用垃圾回收器。因此,建议所有的对象创建的时候在应用初始化的时候完成(例如在install()和构造函数中完成初始化)。
5. 插入一个MORE TIME主动命令,当你的toolkit处理过程大于2s的时候,这样可以防止在等待的过程中用户打断手机处理。
6.注意FLAH是使用页面。
SIM卡越来越多的使用FLASH技术,FLASH技术使用page为单位,一page包含64个字节、128个字节或者256个字节。因此每一次你更新一个字节的话,一整个page将会更新。所以,如果程序设计不好的话,flash的page将会更新很频繁,导致缩减寿命。
6.1避免声明循环次数较多的变量在同一个位置;
6.2循环文件会降低flsh的寿命。