增强智能卡可靠性的方法
【技术领域】
[0001]本发明属于嵌入式软件领域中的智能卡软件范畴,特别涉及智能卡可靠性方法。
【背景技术】
[0002]智能卡是一种IC卡,卡内的集成电路包括中央处理器CPU、R0M、EEPR0M(或其它介质)、RAM和存储在卡内的智能卡软件和数据。
[0003]智能卡通常有电压保护、频率保护等硬件可靠性保护措施,但仍然存在在某些非正常工作条件下(如电源不稳定、带电插拔、电磁干扰等的条件),智能卡程序指针跑飞的情况。智能卡程序指针跑飞,通常会使程序返回错误的状态。根据智能卡应用的特点,程序跑飞会带来两种后果。一是对于大多数程序跑飞的情况而言,程序将可能返回错误状态,仅会造成应用中断,因为智能卡应用的上位机及后台服务器通常有针对应用中断的处理,因此影响很小;另一种后果是,因为智能卡内是有擦写程序的,如果程序跑飞并调用了擦写程序导致擦写了不应该擦写的数据甚至擦写了程序代码,则卡片会成为无效卡片。如果在生产环节出现此问题,会造成成品率的下降;如果在用户手中出现此问题,则给持卡人带来不便,造成发卡商投诉率上升。
[0004]通常嵌入式软件中为提高可靠性级别时,会采用N版本程序设计的方法,即设计N个相同功能的相异程序,各版本先后运算出来的结果相互比较来确定输出。但这种方法会造成开发周期长,性能较低,占用空间大,通常而言是不适合智能卡的应用场景的。
[0005]芯片硬件有时也会采取一些可靠性的设计,例如硬件设计为在擦写等动作前要先写入一定的指令序列,否则不启动擦写。但通常擦写函数是将该指令序列和启动擦写放在一个函数中的,一旦程序跑飞到函数入口,则会顺序写入指令序列和启动擦写,就会造成误擦写。
【发明内容】
[0006]智能卡由于本身的特点,需要嵌入式软件来增强智能卡整体的可靠性。在智能卡可靠性问题中较严重的一种问题,就是智能卡在受到干扰时程序指针跑飞造成程序代码或数据被误擦写的情况。本发明正是为解决这一问题而设计的一种方法。
[0007]本发明提供的这种增强智能卡可靠性的方法,设计了一个软件开关来控制智能卡非易失性存储器擦写函数的擦写使能,将软件开关的开启和关闭操作放置在擦写函数之夕卜,同时将软件开关的开启和关闭操作和正确的程序运行流程紧密结合。如果软件开关没有打开,则程序不会执行擦写函数或硬件的擦写指令。将软件开关的开启和关闭操作和正确的程序运行流程紧密结合,则使得程序跑飞时软件开关极大概率的处于关闭状态。从而当程序没有按正常的程序流程执行而跑飞到擦写函数时,擦写函数或硬件的擦写指令不会被成功执行。
[0008]本发明包含如下软件开关程序调用方法A:
[0009](I)在智能卡开始运行的初期,将软件开关关闭;
[0010](2)进行智能卡程序的初始化;
[0011](3)在进入智能卡应用程序处理前,将软件开关关闭;
[0012](4)等待接收智能卡应用命令;
[0013](5)接收到智能卡应用命令后,将软件开关打开;
[0014](6)处理接收到的智能卡应用命令(含有调用擦写程序),并返回数据,然后将软件开关关闭;
[0015](7)重复执行步骤4?步骤6。
[0016]该方法有效果的依据之一是:如果是因为干扰程序跑飞,几乎不能完整的执行步骤4?步骤6,特别是执行在第4步的接收环节中,就会因为收不到正确的命令而中止,因此在程序跑飞到擦写函数时,软件开关会极大概率的处于关闭的状态。
[0017]本发明包含如下软件开关(Switch_Variable,采用变量的开关)程序设计方法B:
[0018](I)软件开关的打开或关闭,决定了擦写操作是否被允许执行;
[0019](2)软件开关代表的数字要在4个字节以上,即232个数据以上;
[0020](3)软件开关可拆成一组开关变量,以增加开关的判断次数,例如I个变量表示I个字节的子开关或I个变量表示2个字节的子开关;
[0021](4)软件开关等于一组特殊值时,表示开关关闭,例如0x00000000 ;
[0022](5)软件开关等于一组特殊值时,表示开关开启,例如0x6780904F。
[0023]本发明包含如下结合了软件开关的非易失性存储器的擦写程序的设计方法C:
[0024](I)将待写入的数据写入硬件擦写操作的缓冲区;
[0025](2)调用判断软件开关函数。该函数功能是判断软件开关(Switch_Variable,表示基于变量的开关)是否处于开启状态(由上述的方法A、方法B决定),如果是关闭状态,则直接执行芯片异常中断或退出擦写程序;如果是开启状态,则执行下一步骤;
[0026](3)启动智能卡芯片的擦写硬件操作;
[0027]特别可以利用某些CPU的指令特点来作为另一种软件开关,例如指令的条件执行属性,即当CPU内部的某SFR的某bit不满足条件时,CPU将不执行当前这句条件指令(通常称含有条件执行属性的指令为条件指令)。下面以ARM SC100 CPU的条件指令为例进行说明。
[0028]STREQ R2,[R1];例如,假设本句指令表示硬件启动写操作,但因为有EQ这两个字母表示的条件执行属性,则说明需要在“z”这个CPU标记(该类标记是CPU内部的状态标记,一般存储在寄存器cpsr中)为I时,STREQ这句指令才会被CPU执行(R2\R1是指令的操作数)。如果只在执行该指令之前才将“z”设置为1,并且使得设置z的语句的存储位置远离STREQ这句指令(通过将设置z的语句封装在另一个函数中就能使的存储位置远离),这样就基本完全杜绝了程序直接跑飞到STREQ这句启动写的指令时,造成误擦写的情况。
[0029]本发明包含如下结合了条件指令的软件开关的非易失性存储器的擦写程序的设计方法D:
[0030](I)将待写入的数据写入硬件擦写操作的缓冲区;
[0031](2)将条件指令的开关(Switch_Instruct1n,表示基于指令的开关)设为关
[0032](3)调用判断软件开关函数。该函数功能是判断当前开关(Switch_Variable)是否处于开启状态(由上述的方法A、方法B决定),如果是关闭状态,则直接执行芯片异常中断或退出擦写程序;如果是开启状态,则将条件指令的开关设为开,并执行下一步骤;
[0033](4)启动智能卡芯片的擦写硬件操作(采用条件指令);
[0034]设计方法D比设计方法C的效果更好,但需要CPU指令的支持。
[0035]其他能增强本发明效果的辅助手段还有:利用函数合并等手段将“启动智能卡芯片的擦写硬件操作”的软件操作数量尽可能的降到最少,将能提升本发明的效果;如果设计成由硬件在启动擦写前来识别软件开关的开启(例如硬件设计为在擦写等动作前要先写入一定的