本文主要讲述智能卡系统的断电保护和数据备份相关知识,主要内容如下图,包括数据的备份、备份区的设计、均衡磨损技术以及数据恢复的时机等等。
1.数据备份的原因
在数据的一次写过程中,由于Flash物理特性,需要先擦除要改写的地址空间所在的页面,每次擦除的物理页面大小为512 Byte(假设一页大小为512Byte)。智能卡由外部供电,如果在写过程中突然掉电,导致卡内数据的丢失,就有可能导致COS崩溃或者用户数据写入不正确。因此,COS必须提供掉电保护机制保证卡内数据的读写安全。
数据备份就是COS的掉电保护机制,在写入数据时,将整个页面备份后再擦除写入,防止在改写过程中出现突然掉电,导致数据丢失。
2.数据备份的作用
备份机制设计的目的是采取一种措施,使COS在进行写操作时将其作为一个原子操作来完成,不因突然掉电或者恶意拔出而丢失数据,保证卡内数据的一致性和安全性。
掉电保护的软件措施主要包括两部分:
一是设计系统的数据备份算法,在系统突然断电之后,能有效地保存系统在数据更新前的正确运行状态;
二是在供电复位之后根据备份的运行状态和数据及时恢复,避免整个COS因关键数据丢失而崩溃。
3.数据备份区的位置
为了保证数据备份区的安全性,数据备份区一般选择通过文件系统不能访问到的位置。
4.数据备份的时机
数据备份要在写操作之前进行,这样无论掉电发生在什么位置,备份区数据或者将要写入的地址区总有一个位置的数据时正确的。
5.备份的数据
有两种备份数据的方式:
旧数据备份方式,优点如果写时发生掉电,系统的数据丢失,可以通过备份将系统恢复到没更新以前的状态。
新数据备份方式,因为备份的是即将写入的新数据,所以当写时发生掉电导致系统的数据丢失,不可能将系统的状态恢复到掉电之前的状态,只能到更新数据之后的状态。
6.备份的关键
备份操作的原子性。
7.备份的种类
页备份,另一种是日志备份(也有其他称呼,如字节备份),这是两种完全不同的机制。详见第八条。
8.备份与恢复的原理
FLASH具有写入前必须整块擦除的物理特性,所以在写之前必须对目标地址和备份区进行擦除。
在改写文件的数据时会遇到以下两种情况(如图):
一是需要写入的数据刚好在一个擦除块(假设为512B大小)中,则只需备份一块数据;
二是需要写入的数据刚好存储在两个擦除块中,则需要同时备份两块的数据,然后逐块地进行擦除写入。无论是备份一块或者两块都作为一个原子操作,更新不成功的时候都统一进行旧数据的恢复操作。
8.1 页备份机制
当写操作发生在一页之内时,页备份机制就可以满足掉电安全保护的需求。
这里使用备份旧数据的方式,具体过程如下:
1)将要改写数据段的Flash页面的所有数据备份到备份区中。
2)数据备份完成后,将备份标志位置为有效,并将有效的标志位和改写的地址保存到标志区。
3)数据开始更新,依次将数据写入目标地址。
4)备份标志位复位,表示改写成功,并将复位的标志写入到标志区。
安全写恢复流程:
查看Flash备份标志位是否有效,如果无效表示不需要进行数据安全写恢复操作,结束流程;如果有效,表示要进行数据安全写的恢复操作,步骤如下,
1)读取备份的数据,根据备份的地址,对数据进行恢复操作。
2)所有的数据恢复成功之后,将备份标志位复位,将复位的标志位写入标志区。
8.2 日志备份机制
智能卡中一次完整的事务流程里,有时会对多个页面的数据进行改写,必须要保证这个过程是原子性的,即所有数据要么被全部更新,要么一点也没有被更新。
当涉及到两个页面时,上面所述的掉电保护机制不能保证原子性,运行的事务在非正常状态下终止,可能会导致数据出现第三态,即部分数据被更新,而另一部分没有被更新。
日志备份机制可以保证数据的保证数据的一致性、完整性。在一个多次执行改写操作事务中,对需要处理数据的数据段在日志备份区以日志记录的方式对旧数据进行数据备份,记录此次事务下的所有完成的写操作,存储在智能卡的日志区。
当系统不正常断电后重启时,系统将进行自检,如若发现日志备份区有有效数据,则对非正常终止的事务进行回滚,自动恢复到断电前最后一个稳定状态,使系统恢复到一致状态。这里采用的是以记录为单位的日志文件,使用旧数据回写的方式来恢复数据。
在一个事务的执行过程中,记录每个事务的开始标记、结束标记,同一事务的每次更新操作均作为一个日志记录,具体执行流程如下所示:
1)事务的标志位,置为有效。
2)把要改写的旧数据以TLV格式备份到日志区中(T表示此次事务中第几次改写Flash;L表示要改写数据的长度与旧数据起始地址的长度和;V表示旧数据起始地址和旧数据)。
3)数据备份完成后,将备份标志位置为有效,并将有效的标志位和数据改写地址保存到指定的位置。
4)数据开始更新,依次将数据写入目标地址。
5)如果事务未完成,还有其他写操作,那么转向步骤2) 继续执行,同一事务的备份数据应有序保存,以便数据的恢复。
6)事务标志位复位,表示事务执行成功,并将复位的标志写入到Flash指定的位置。
数据恢复流程:
系统进行自检,查看事务标志位是否有效,如果无效则不需进行数据一致性写恢复操作,结束流程;如有效则进行写恢复操作,步骤如下,
1)读取最新事务的日志数据,根据备份的有效标志位,对数据进行有序的恢复操作。
2)所有的数据恢复成功之后,将事务标志位复位,将复位的标志位写入Flash指定的位置。在事务的一次处理过程中,可能涉及到多次的擦写,这是非常耗时的,也很不安全,采用了日志备份,把事务的处理过程以日志的方式记录下来,不需要频繁擦写;日志区是一个大的缓冲区,不过它也是容量限制的,当达到一定容量或关键值时,就需对日志备份区进行清理,这样就减少写操作的时间,提高了智能卡的整体性能。
9.数据恢复的时机
一般而言,备份数据的恢复时在上电之后立即进行的。
但是如果使用某种芯片时,备份数据的恢复时间过长,读卡器会认为连接已经断掉,这时会主动断开与卡片的连接,会导致数据恢复之后的第一条指令不能执行成功。这时,就需要把备份数据的恢复操作移动到第一条指令接收完毕之后。
10.其他考量因素
10.1 均衡磨损
因为FLASH的读写次数有限,而每次进行数据写时,不论写的位置是哪里,都要对备份区写。也就是说,备份区的写次数远远大于其他位置。
所以备份区的写次数至关重要,决定着卡片的寿命,是一个十分重要的考量因素。
我们要将对备份区的写操作次数降至最低。相关方案见下节,备份方案的设计。
10.2 性能
性能也是智能卡的一个重要的指标,而影响性能的主要因素就是Flash的写操作。
这也是我们想法设法减少备份区写操作的重要原因之一。
11.备份方案设计
备份方案设计是重中之重,设计得当,能保证掉电后卡数据的完整性,并能保证卡片的性能。
下面我们先来讨论一下页备份和日志备份的方案,再来着重讨论一下备份方案的改进。
1.一般的备份方案
页备份的流程,如下图。
日志备份的流程如下图:
上述方案虽然能保证掉电后数据的一致性,但是备份区写太过频繁,哪怕只写一个字节也会对备份区全部写一次。
2.备份方案的改进