具体实施方式
下面结合附图对本发明的具体实施方式进行说明。
本发明实施例中所述的智能卡应用程序是指运行在COS之上,通过COS完成各种不同需求的应用。例如有各种安全加密的应用程序、包括“超级号簿”、“***”等的电信STK(SIM Tool Kit,SIM卡工具箱)应用程序、支持Java的JavaApplet应用程序等等。
智能卡的外部存储设备是指整合到智能卡芯片上的存储设备,相对智能卡上内置的存储体来说,一般指外部大容量的存储设备,特别是M(兆)级的存储设备,比如目前使用较多的NAND闪存。
在外部存储设备与如PC等外部设备与智能卡的数据操作关系上,外部存储设备可以通过其芯片上的USB/MMC等快速通道作为可移动磁盘挂接到外部设备的windows、Unix等各种操作***上,并且外部存储设备的文件***能够被相应的操作***识别与进行操作;而COS通过内部的数据总线来访问外部存储设备,对外部存储设备进行数据文件的操作,如读取和修改等操作,同时,卡片上的应用程序也能够通过COS对外部存储设备进行有效的访问并操作。这样,通过USB/MMC等快速通道以及智能卡内部数据总线,外部设备能够与外部存储设备进行数据交互,智能卡也能够与外部存储设备进行数据交互。
在按前述方式与外部存储设备进行连接后,智能卡COS就可以对外部存储设备进行数据文件操作了,图2为智能卡COS对数据文件进行操作的方法实施流程示意图,如图所示,智能卡COS对外部存储设备进行数据文件操作可以包括如下步骤:
步骤201、智能卡COS获取外部存储设备配置信息,所述配置信息包括外部存储设备的容量及文件数据格式;
步骤202、当智能卡COS或智能卡应用程序进行数据文件操作时,智能卡COS根据所述配置信息在外部存储设备上进行数据文件操作。
实施中,当智能卡COS或智能卡应用程序进行ISO7816格式的数据文件操作时,智能卡COS或智能卡应用程序在外部存储设备的ISO7816格式的数据文件夹中进行操作,这样,由于COS对外部存储设备的操作是按ISO7816协议执行,并在ISO7816的数据文件中操作,因此并不会影响到PC等外部设备对原有操作的文件***,如FAT16、Ext3等;而当智能卡卡片操作***或智能卡应用程序进行目录文件***格式的数据文件操作时,智能卡卡片操作***或智能卡应用程序可直接在外部存储设备的目录文件***格式的数据文件夹中进行操作。
实施中,由于外部存储设备并不一定包括有ISO7816数据文件,所以智能卡COS获取外部存储设备配置信息时,还可以进一步包括:当配置信息中不含ISO7816格式的文件数据时,创建ISO7816格式的数据文件夹;当智能卡COS或智能卡应用程序进行ISO7816格式的数据文件操作时,智能卡COS或智能卡应用程序在所述外部存储设备的ISO7816格式的数据文件夹中进行操作;
或者,当智能卡COS或智能卡应用程序进行ISO7816格式的数据文件操作时,当所述配置信息中不含ISO7816格式的文件数据时,创建ISO7816格式的数据文件夹;智能卡COS或智能卡应用程序在所述外部存储设备的ISO7816格式的数据文件夹中进行操作。
创建ISO7816格式的数据文件是为了更合理有效的利用大容量的外部存储设备,它是在外部存储设备开辟一片区域专门用于存放7816规范定义的文件。可以按照ISO7816规范来对外部存储设备中创建的7816数据文件进行访问控制。
例如,在应用程序的发起访问请求需要对数据文件进行操作时,如果操作请求针对的是7816数据文件,则对访问的请求进行分析,在外部存储设备的7816数据文件***中进行查找,找到请求的文件,并完成读取或者写入的操作。
具体实施时可以相应的分为7816数据文件***识别配置、7816数据文件***目录结构解析和7816数据文件读写操作三个部分。7816数据文件***识别配置时在外部存储设备的根目录下建立一个对应于外部存储设备文件***的文件,所有保存到外部存储设备的7816数据文件都将保存在这个文件的内容中。7816数据文件***目录结构解析时负责对这个文件中的各个7816数据文件进行识别解析,找到指定的7816目录或文件。找到指定的7816目录文件后,就可以完成对7816数据文件的读取和写入等操作。
当然,如果应用程序的访问请求针对的是目录文件***,则在外部存储设备的目录文件***中进行查找,找到请求的文件,并完成读取或者写入的操作。
相应的,具体实施中也可以分为目录文件***识别、目录文件***目录结构解析和文件读写操作三个部分。目录文件***识别时首先读取外部存储设备起始扇区的内容,然后对起始扇区的内容格式进行分析,判断是FAT16文件***还是FAT32文件***或者Ext2、Ext3等其他文件***。目录结构解析时完成对目录结构的分析查找等操作,在完成外部存储设备文件***识别后,可以根据具体的文件***类别的对文件***目录结构进行解析,完成对指定目录或指定文件的查找,如对于FAT16或FAT32文件***来说,则是从根目录起进行目录表项的遍历和查找等。目录结构分析完成对指定目录或文件的查找定位后,即可完成对文件的打开,读写,以及相应的目录项修改的等操作。
智能卡COS根据所述配置信息在外部存储设备上进行数据文件操作,还可以进一步包括如下步骤之一或者其组合:
1、防插拔掉电保护步骤:当智能卡COS根据所述配置信息在外部存储设备上进行写入数据文件操作时,将所述数据文件写入智能卡数据备份区后写入外部存储设备;当外部存储设备上电时,若所述智能卡数据备份区与外部存储设备数据文件不一致时,将所述智能卡数据备份区的数据文件写入外部存储设备;
本步骤中,在对外部存储设备的访问过程中,由于智能卡本身使用环境的特殊性,访问过程中有可能出现忽然掉电的情况,为了使卡片和外部存储设备不在掉电过程中出现核心数据被破坏而导致整个卡片不能使用的情况,可以使用本步骤来对智能卡上的数据进行保护。具体地,可以当文件访问***模块需要读取外部存储设备数据时,不直接存取外部存储设备的数据,而是通过调用防插拔函数来完成数据的读取和修改。在接收到数据读取或修改的指令后,会先将数据写入到卡片中的备份区,备份区写入完成后,再对外部存储设备进行写入。而在每次重新上电时,首先检查备份区是否有要恢复的数据,如果有,则根据备份区的内容进行相应的恢复。
2、缓存步骤:智能卡COS根据操作规律在智能卡缓存区存储数据文件,智能卡操作***优先从所述缓存区读取需操作的数据文件;
由于外部存储设备物理设备的特性,COS访问外部存储设备的速度要远远低于直接访问智能卡内部存储器的速度。因此,本步骤可以预先读取外部存储设备中的内容到卡片的缓存区,用以提高访问的速度。当需要读取外部存储设备中的数据文件时,检查要访问的数据文件是否存在于缓存区中,如果存在于缓存区中,则直接返回缓存区中的数据文件内容;如果缓存区中没有需要的数据文件,则需要从外部存储设备中读取相应的数据文件,并将相关的数据文件拷贝到缓存区中即可。
具体实施时,可以根据COS读取外部存储设备的规律,例如读取频率高的数据文件等,预先读取外部存储设备中的这部分数据文件到缓存中,这样COS在访问外部存储设备时,就可以直接在缓存中进行读取,能够大大提高访问的速度。
3、中断和异常控制步骤:智能卡COS根据所述配置信息在外部存储设备上进行的数据文件操作发生中断时,保存操作执行状态,中断恢复后,根据所述保存的操作执行状态继续执行。
在访问外部存储设备的过程中,还可能会发生某个扇区物理损坏不能读取、找不到相应数据扇区、外部存储设备响应超时等异常情况,本步骤可以用于处理这些异常事件。实施中,当数据文件发送或者数据文件接收完成时、或数据文件传输时间片轮转时触发了相应的中断后,完成对中断的响应,并调用相应的中断处理函数来完成处理。具体的,当异常中断发生时,执行完当前指令后,将跳转到相应的异常中断处理程序处执行。当异常中断处理程序执行完成后,程序返回到发生中断的指令的下一条指令处执行。在进入异常中断处理程序时,保存被中断的程序的执行现场。从异常中断处理程序退出时,恢复被中断的程序的执行现场即可。
本发明实施例还提供了一种应用于与外部存储设备进行数据文件操作的智能卡,下面结合附图对智能卡的具体实施方式进行说明。
由于外部存储设备具有的文件***格式比较多样,为了实现智能卡COS及应用程序对外部存储设备的访问,实施例采用了层次结构的方案,将应用程序及COS对外部存储设备的访问操作封装成不同的功能层次,应用程序只需要调用COS最外层的功能模块,而操作控制、缓存、防插拔掉电等各模块都相应的封装在中间层,最底层则是统一的调用外部存储设备的物理读取模块;从而构建了快速、安全、有效,便于扩展的外部存储设备操作方案。
层次结构主要将构成的各个模块部分按照不同层次进行布局;层与层之间单向依赖,相邻层间通过界面相互作用,下层为上层提供服务,上层使用下层提供的服务以实现本层的功能。上层隐藏紧接下层的细节,下层所涉及的技术规范、实现技术被紧邻上层所屏蔽。
图3为智能卡结构示意图,本智能卡应用于与外部存储设备进行数据文件操作,如图所示,智能卡包括外存设备管理模块、文件操作请求模块、外存设备访问接口、文件访问控制模块,其中:
外存设备管理模块,用于获取外部存储设备的配置信息,所述配置信息包括外部存储设备的容量及文件数据格式,并根据配置信息在建立智能卡与外部存储设备的连接后提供对数据文件进行操作的通道;
文件操作请求模块,用于发起对数据文件的操作请求;
外存设备访问接口,用于在接收到所述文件操作请求模块的操作请求后,根据操作请求提供对外部存储设备进行操作的操作指令;
文件访问控制模块,用于在接收到操作指令后,根据所述配置信息按操作指令通过所述外存设备管理模块提供的操作通道在外部存储设备上进行数据文件操作。
下面对各模块的具体实施进行说明。
一、外存设备管理模块。
外存设备管理模块可以建立与外部存储设备的连接,完成读取外部存储设备中的数据以及将数据写入外部存储设备等操作。在获取外部存储设备的配置信息时,首先询问当前是否有可用的外部存储设备,在得到响应后,根据响应的结果继续查询具体的外部存储设备设备配置信息。在得到外部存储设备配置信息后,便可与外部存储设备建立连接,同时也可以对外部存储设备进行数据读取和写入等操作。
外存设备管理模块对连接的外部存储设备设备进行枚举,得到有效的外部存储设备设备配置信息,在设备配置信息中可以得到设备类型、支持的接口、外部存储设备的容量、文件***格式等信息,并据此与外部存储设备设备建立连接。
具体的,可以通过外部存储设备设备描述符获取外部存储设备的设备配置信息,并以此建立连接,从而对外部存储设备数据进行读写。外部存储设备设备描述符可以包括下表所示内容:
偏移 |
字段 |
大小(字节) |
值 |
描述 |
0 |
长度 |
1 |
10h |
描述符的长度 |
1 |
设备类型 |
1 |
|
NandFlash或其他存储介质 |
2 |
支持接口 |
1 |
|
MMC或USB等 |
3 |
产品ID |
2 |
|
生产厂商的ID号 |
5 |
外部存储设备容量 |
4 |
|
以k为单位 |
9 |
配置信息 |
1 |
|
bit0:1带掉电保护0不带bit1:1支持7816数据文件读写0不支持 |
二、文件操作请求模块。
文件操作请求模块中还可以包括卡片操作***请求单元、和/或应用程序请求单元,其中:
卡片操作***请求单元,用于在卡片操作***对数据文件进行操作时,发起对数据文件的操作请求;
应用程序请求单元,用于在应用程序对数据文件进行操作时,发起对数据文件的操作请求。
三、外存设备访问接口。
外存设备访问接口中可以包括目录文件***访问指令集存储单元、7816数据文件***访问指令集存储单元、指令提供单元,其中:
目录文件***访问指令集存储单元,用于存储目录文件***访问指令集;
7816数据文件***访问指令集存储单元,用于存储7816数据文件***访问指令集;
指令提供单元,用于在接收到所述文件操作请求模块的操作请求后,根据操作请求从目录文件***访问指令集存储单元或7816数据文件***访问指令集存储单元选取相应操作指令后,提供对外部存储设备进行操作的操作指令。
外存设备访问接口提供了应用程序通过操作***对外部存储设备进行访问的指令集。模块位于整个访问体系的最上层,应用程序及COS对外部存储设备的访问操作都可以封装在这个接口中,COS及应用程序通过直接调用该接口中的指令集实现对外部存储设备的操作访问。外存设备访问接口收到应用程序的访问请求后,根据请求进行处理,再调用相应的目录文件***或7816数据文件***访问的指令集。
考虑到外部存储设备中的文件***可能包括有目录结构和7816两种文件***,相应的指令集也分成目录结构文件访问指令集和7816数据文件访问指令集两部分,这些指令通过调用下层的文件***访问控制服务,来完成各自对文件的查找、读取、修改等操作命令功能。
实施中,由于指令集是COS访问外部存储设备的指令集合,所以在所有指令前可以增加前缀cm。输入参数的编码格式如果是纯英文数字,则用ASC码;如果包含中文字符,则可采用Unicode编码。
为了描述的简练,下面提到的目录信息包括7816数据文件目录和普通目录文件目录。
作为输入参数的文件名格式如果没有带目录信息,则为当前目录下文件,如果有目录信息,则必须包含完整的目录(从根目录起)。
1、读取外部存储设备文件和目录指令举例如下:
A)、例如改变当前目录命令可表示为:
Boolean cm_Cdir(byte[]DestDir)
即,将当前目录设置为DestDir所指目录。
在对外部存储设备的访问过程中,可以保留一个全局的变量,用以标识在对外部存储设备访问时当前访问位置的当前目录。通过定义这个当前目录,COS在继续访问时,如果被访问对象在当前目录下,就不必输入访问对象从根目录起的完整的绝对路径,而是可以输入比较简短的从当前目录起始的相对路径。
如输入参数:
Byte[]DestDir:
当DestDir为绝对路径时,目录格式为:分区号:\目录名\目录名;如果外部存储设备上进行了分区,则设外部存储设备上第一分区为0分区,第二分区为1分区,依次类推。如0:\dir1\dir2。如果DestDir为相对路径,则无分区号,格式为:目录名\目录名,如dir1\dir2,指当前目录下的子目录。DestDir的编码格式:如为纯英文数字,则是ASC码,如包含中文字符,则采用Unicode编码。
返回值:如果能够正确访问到目的目录,则返回true,否则返回false。
B)、例如查看当前目录下所有文件与目录列表命令可以表示为:
Boolean cm_List(byte[]listbuffer,byte listType)
即,将当前目录下文件和目录列表输入到listbuffer中。
Listbuffer:当前目录下的文件和目录以TLV(Tag Length Value,标记长度数值)的格式填充到这个缓存中。
按上面命令执行后会输出一组数据,而数据是按照这种表格中定义的TLV格式组织的:
TLV TLV TLV
具体的如:
如果输出:D0000474657374DF0008746573742E747874;
表示当前目录下有:目录test文件test.txt。
listType:0文件目录都输出到listbuffer中
1只把文件输出到到listbuffer中
2只把目录输出到到listbuffer中
返回值:如果能够正确访问到当前目录下的文件目录列表,则返回true,否则返回false。
C)、如读当前目录下指定文件命令可以表示为:
Boolean cm_ReadFile(byte[]destfile,short fileoffset,byte[]destBuffer,shortdestoffset,short length)
即,将指定文件的指定内容(偏移量+长度)输出到destBuffer的指定位置中(偏移量)。各命令分别为:
byte[]destfile:当byte[]destfile包含路径时,如果为绝对路径,格式为:分区号:\目录名\目录名\文件名;如果为相对路径,则指当前目录下的子目录中包含的文件。如果不包含路径,则指当前目录的文件。编码格式:如为纯英文数字,则是ASC码,如包含中文字符,则采用Unicode编码。
Fileoffset:从目的文件读内容的起始位置。
destBuffer:将文件内容存放的缓存区。
destoffset:存放读取的文件内容的缓存区的起始位置。
Length:读取的文件内容的长度。0表示读取整个文件。
返回值:如果能够正确访问到指定文件,则返回true,否则返回false。
D)、如查找指定范围内指定文件命令可以表示为:
Boolean cm_FindFile(byte[]destfile,byte[]destDir,byte[]result)
即,在指定目录范围内查找指定文件名的文件,返回其完整目录信息。各命令分别为:
Destfile:完整的文件名,不包括路径。
destDir:在该目录范围内进行查找,如果为相对路径,则指相对当前目录的路径。
Result:LV格式,L 2字节表示后续内容长度,V绝对路径,编码格式:如为纯英文数字,则是ASC码,如包含中文字符,则采用Unicode编码。返回值:如果能够找到指定文件,则返回true,否则返回false。
E)、如查看指定文件属性命令可以表示为:
Boolean cm_GetFileAttribute(byte[]destfile,byte AttributeType,byte[]AttributeBuffer)
其中各命令分别为:
Destfile:如果为绝对路径,格式为:分区号:\目录名\目录名\文件名;如果为相对路径,则指当前目录下的子目录中包含的文件。
AttributeType:返回的文件的属性类型。
AttributeBuffer:返回的文件属性输出缓存区。
返回值:如果能够找到指定文件的属性,则返回true,否则返回false。
上述的命令会根据输入的AttributeType返回对应的文件属性,而具体的如何对应则是根据表格的描述来进行的,如输入AttributeType为0x01,那么根据表格,对应的是查询文件的大小,于是会在AttributeBuffer处写入一组数据表示对应的文件大小属性,而具体的数据如何表示文件大小,也是在表格中定义的。
2、修改外部存储设备文件和目录指令举例如下:
A)、如修改指定文件文件名称指令表示为:
Boolean cm_ChgFileNm(byte[]destfile,byte[]NewFileName)
即,将Destfile指定的文件名称修改为NewFileName中定义的文件名称。各命令分别为:
Destfile:如果为绝对路径,格式为:分区号:\目录名\目录名\文件名;如果为相对路径,则指当前目录下的子目录中包含的文件。
NewFileName:新的文件名称。LV格式。L 2字节V文件名称,如为纯英文数字,则是ASC码,如包含中文字符,则采用Unicode编码。
返回值:如果修改文件名成功,则返回true,否则返回false。
B)、如修改指定目录名称指令表示为:
Boolean cm_ChgDirNm(byte[]destDirNm,byte[]NewDirNm)
即,将destDirNm指定的目录名称修改为NewDirNm中定义的目录名称。各命令分别为:
destDirNm:如果为绝对路径,格式为:分区号:\目录名\目录名;如果为相对路径,则指当前目录下的子目录。
NewDirNm:新的目录名称。LV格式。L 2字节V文件名称,如为纯英文数字,则是ASC码,如包含中文字符,则采用Unicode编码。
返回值:如果修改目录名成功,则返回true,否则返回false。
C)、如删除指定文件指令表示为:
Boolean cm_DelFile(byte[]destfile)
其中各命令分别为:destfile:如果为绝对路径,格式为:分区号:\目录名\目录名\文件名;如果为相对路径,则指当前目录下的子目录中包含的文件。
返回值:如果删除文件成功,则返回true,否则返回false。
D)、如创建文件指令表示为:
Boolean cm_CreateFile(byte[]destfile)
即,创建一个内容为空的文件。其中各命令分别为:
destfile:如果为绝对路径,格式为:分区号:\目录名\目录名\文件名;如果为相对路径,则指在当前目录下的子目录中创建文件。
返回值:如果创建文件成功,则返回true,否则返回false。
E)、如修改指定文件指令表示为:
Boolean cm_AmendFile(byte[]destfile,short FileOffset,byte[]SrcBuffer,short SrcOffset,short Length)
其中各命令分别为:
destfile:如果为绝对路径,格式为:分区号:\目录名\目录名\文件名;如果为相对路径,则指在当前目录下的子目录中包含的文件。如果在目录结构中找不到指定的文件,命令将自动创建该文件。
Fileoffset:从目的文件写内容的起始位置。
SrcBuffer:要写入的文件内容存放的缓存区。
SrcOffset:存放写入文件内容的缓存区的起始位置。
Length:写入的文件内容的长度。
返回值:如果写入文件成功,则返回true,否则返回false。
F)、如建立子目录命令表示为:
Boolean cm_MD(byte[]SubDirName)
其中各命令分别为:
SubDirName:如果为绝对路径,格式为:分区号:\目录名\目录名;如果为相对路径,则指在当前目录下的子目录。
返回值:如果创建子目录成功,则返回true,否则返回false
G)、如拷贝文件指令表示为:
Byte cm_CopyFile(byte[]destfile,byte[]destdir)
其中各命令分别为:
Destfile:如果为绝对路径,格式为:分区号:\目录名\目录名\文件名;如果为相对路径,则指当前目录下的子目录中包含的文件。
Destdir:如果为绝对路径,格式为:分区号:\目录名\目录名\;如果为相对路径,则指当前目录下的子目录。
返回值:0表示文件拷贝成功。
1表示读取复制文件失败
2表示目的目录下有同名文件,无法覆盖
H)、如删除目录指令表示为:
Boolean cm_DelDir(byte[]destdir)
其中各命令分别为:
删除该目录,及其目录下的所有子目录和子文件。不能删除当前目录。
Destdir:如果为绝对路径,格式为:分区号:\目录名\目录名\;如果为相对路径,则指当前目录下的子目录。
四、文件访问控制模块。
文件访问控制模块可以包括目录文件***访问控制单元、和/或7816数据文件访问控制单元,对外部存储设备上的目录文件***的分析和读写操作都可以封装在本模块中,其中:
目录文件***访问控制单元,用于在接收到操作指令后,根据所述配置信息按操作指令通过所述外存设备管理模块提供的操作通道在外部存储设备上进行目录文件***格式的数据文件操作;
7816数据文件访问控制单元,用于在接收到操作指令后,根据所述配置信息按操作指令通过所述外存设备管理模块提供的操作通道在外部存储设备上进行ISO7816数据文件格式的数据文件操作。
当外存设备访问接口在收到应用程序或COS的操作请求后,如果请求针对的是目录文件***,则调用目录文件***访问控制单元对访问的请求进行分析,在外部存储设备的目录文件***中进行查找,找到请求的文件,并完成读取或者写入等操作。
目录文件***访问控制单元可以分为目录文件***识别、目录文件***目录结构解析和文件读写操作三个部分。目录文件***识别部分首先读取外部存储设备起始扇区的内容,然后对起始扇区的内容格式进行分析,判断是FAT16文件***还是FAT32文件***或者Ext2、Ext3等其他文件***。目录结构解析部分完成对目录结构的分析查找等操作,在完成外部存储设备文件***识别后,可以根据具体的文件***类别的对文件***目录结构进行解析,完成对指定目录或指定文件的查找,如对于FAT16或FAT32文件***来说,则是从根目录起进行目录表项的遍历和查找等。文件读写操作部分是目录结构分析部分完成对指定目录或文件的查找定位后,由文件读写操作部分来完成对文件的打开、读写、以及相应的目录项修改的等操作。
当外存设备访问接口在收到应用程序或COS的操作请求后,如果请求针对的是7816数据文件,则调用7816数据文件***访问控制单元对访问的请求进行分析,在外部存储设备的7816数据文件***中进行查找,找到请求的文件,并完成读取或者写入的操作。
7816数据文件***访问控制单元也可以分为7816数据文件***识别配置、7816数据文件***目录结构解析和7816数据文件读写操作三个部分。7816数据文件***识别配置部分在外部存储设备的根目录下建立一个对应于外部存储设备文件***的文件,所有保存到外部存储设备的7816数据文件都将保存在这个文件的内容中。7816数据文件***目录结构解析部分负责对这个文件中的各个7816数据文件进行识别解析,找到指定的7816目录或文件。找到指定的7816目录文件后,7816数据文件读写操作部分完成对7816数据文件的读取和写入的操作
为了更合理有效的利用大容量的外部存储设备,可以在外部存储设备开辟一片区域用于存放7816规范定义的文件。因此智能卡还可以进一步包括第一创建模块、和/或第二创建模块,其中:
第一创建模块,用于在智能卡COS获取外部存储设备配置信息时,当所述配置信息中不含ISO7816格式的文件数据,则创建ISO7816格式的数据文件夹;
第二创建模块,用于当智能卡COS或智能卡应用程序进行ISO7816格式的数据文件操作时,当所述配置信息中不含ISO7816格式的文件数据时,创建ISO7816格式的数据文件夹;
这样,7816数据文件访问控制单元还可以进一步用于在接收到操作指令后,根据所述配置信息按操作指令通过所述外存设备管理模块提供的操作通道在外部存储设备上创建的ISO7816格式的数据文件夹进行ISO7816数据文件格式的数据文件操作。
具体的,目录文件***负责完成对外部存储设备目录文件***的访问,包括有文件***的识别、文件目录的解析、文件的读取和修改等。
文件***识别时,读取外部存储设备的主引导扇区的主引导分区表,通过分析主引导分区表中的***分区类型,就可以得到外部存储设备的文件***类型信息。
图4为文件目录解析实施流程示意图,如图所示,对于文件目录的解析可以按如下步骤完成:
步骤401、判断输入的List目录是否为绝对目录,是则转入步骤402,否则转入步骤403;
步骤402、读根目录扇区,返回根目录扇区内容,转入步骤404;
步骤403、读当前目录位置,找到当前目录的目录文件内容,转入步骤404;
步骤404、在目录项中查找是否有指定目录,有则转入步骤409,否则转入步骤405;在403步骤中读到了目录文件的内容,该内容包含了该目录下所有子目录和文件的目录项信息(目录项信息中有目录名或文件名),程序将这些目录项中的子目录名和要查询的目的目录的目录名进行比较,如果有相同的目录名,则完成整个解析,否则转入405。
步骤405、判断目录项中是否有未搜索过的目录的目录项,有则转入步骤406,否则转入步骤408;
步骤406、根据目录项与FAT表找到目录文件的内容,转入步骤407;在步骤405中得到了目录项,在目录项可以知道该目录文件内容的起始位置,再通过FAT表就可以知道该目录文件内容的结束位置,从而得到整个目录文件的内容;
步骤407、判断目录文件的内容中是否有指定目录的目录项,如果没有找到指定的目录,则返回到405,如果找到指定的目录,则转入步骤409;
步骤408、返回False,找不到List的目录。
步骤409、返回True,输出目录内容。
在文件的读取和修改时,对于读取文件,利用通过目录解析得到的文件数据起始扇区位置,调用底层的扇区读取函数,循环读入扇区内容,直至文件末尾,将读出的内容输出到指定的位置即可。对于修改文件,将要修改的内容按照扇区大小进行拆分,循环写入文件扇区的起始位置,即可完成文件的修改。
7816数据文件访问控制的处理流程与目录文件***类似,只是访问对象的具体细节不同,参照目录文件***的执行即可。
五、防插拔掉电保护模块、缓存模块、中断和异常控制模块。
COS以及应用程序通过COS在访问外部存储设备时,除了要读取或者改写外部存储设备的内容之外,还可以进一步考虑读写速度的问题、在读写过程中发生掉电保护的问题、有效访问外部存储设备的文件***的问题等,基于此,智能卡还可以进一步包括防插拔掉电保护模块、缓存模块、中断和异常控制模块之一或者其组合,其中:
1、防插拔掉电保护模块,用于当所述文件访问控制模块根据所述配置信息在外部存储设备上进行写入数据文件操作时,将所述数据文件写入智能卡数据备份区后写入外部存储设备;当外部存储设备上电时,若所述智能卡数据备份区与外部存储设备数据文件不一致时,将所述智能卡数据备份区的数据文件写入外部存储设备。
在对外部存储设备的访问过程中,由于智能卡本身使用环境的特殊性,有可能出现访问过程中忽然掉电的情况,为了避免智能卡和外部存储设备在掉电过程中出现核心数据被破坏而导致整个智能卡不能使用的情况,可以建立防插拔掉电保护模块对卡片上的数据进行保护。具体的,当文件访问***模块需要读取外部存储设备数据时,不能直接存取外部存储设备的数据,而须通过调用防插拔模块提供的函数来完成数据的读取和修改。防插拔模块在接收到数据读取或修改的操作指令后,会先将数据写入到智能卡的备份区,备份区写入完成后,再对外部存储设备进行写入;同时,在每次重新上电时,防插拔模块会首先检查备份区是否有要恢复的数据,如果有,则根据备份区的内容恢复相应的数据文件。
具体可按以下方式实施:
在智能卡中开辟一个备份区,要写外部存储设备时,先将要写入的内容按照备份区的格式写入备份区,备份区写入完成后,再对外部存储设备进行写入。每次上电时,首先检查备份区是否有要恢复的数据,如果有,则先应根据备份区的内容进行相应的恢复。
整个备份区的数据格式可以如下:
其中数据部分的格式可以如下:
数据标签 |
数据长度(M) |
数据内容(O) |
地址信息(M) |
校验信息(M) |
其中:备份标签用于表明整个备份区内数据是否有效。如用标签0xAA表明备份区内数据有效,其他表明无效。
数据标签用于表明该数据项是否有效,如用标签0x55表明该数据项有效,否则无效。
数据长度可以采用类似BER编码规范中长度表示方式,如:
当长度<128时,使用1个字节表示。
当长度>127时,使用多个字节表示,其中第一个字节的最高位为1,低7位表示长度所占的字节数n。后续n字节表示长度,高位在前。
当第一个字节为0xFF,认为是一个无效的长度。
采用该表示方式可以保存超过256字节的数据,以适应以后的应用需求。
特别的,当长度为0的时候,可以表示数据长度为一页(页面大小根据智能芯片而定),此时数据内容项为空,数据内容保存一个备份页当中。
数据内容指需要备份的数据。当长度为0的时候,该项为空。
地址信息可以根据芯片的容量采用2/3/4字节,该项分为两个部分,块号和块内偏移,块内偏移为2个字节,块号根据芯片的容量可以为0/1/2字节。
校验信息用于验证该备份数据是否有效。
则在备份区擦除可以首先破坏备份标签,将备份标签写成0x00,令整个备份区失效,然后再擦除整个备份区。
备份区的长度为可配置项。利用OS Configuration中的Backup Address项来实现,Backup Address为两个字节,第一个字节表示备份区在基本区地址的高位,第二个字节表示备份区所占的页面数。比如FF03,表示备份区在0xFF00起始的地址,备份区占3个页。
2、缓存模块,用于根据所述文件访问控制模块操作规律在智能卡缓存区存储数据文件,所述文件访问控制模块优先从所述缓存区读取需操作的数据文件。
由于外部存储设备物理设备的特性,访问外部存储设备的速度要远远低于直接访问智能卡内部存储器的速度。因此,可以利用高速缓存模块,预先读取外部存储设备中的内容到智能卡的缓存区,用以提高访问的速度。当文件访问控制模块需要读取外部存储设备中的数据时,缓存模块会检查要访问的数据文件是否存在于缓存区中,如果存在于缓存区中,则直接返回缓存区中的数据内容给文件访问控制模块;如果缓存区中没有需要的数据,则从外部存储设备中读取相应的数据,并将相关的数据拷贝到缓存区中。缓存模块可以利用特定的算法,如根据COS读取外部存储设备的规律,预先读取外部存储设备中的数据文件到缓存中,这样COS在访问外部存储设备时,就可以直接在缓存中进行读取,能够大大提高访问的速度。
图5为高速缓存实施流程示意图,如图所示为一种较为简单的高速缓存算法,易知,也可以采用其他比较成熟的高速缓存算法,则高速缓存实施时可以包括如下步骤:
步骤501、访问外部存储设备;
步骤502、判断高速缓存中是否有对应数据文件,有则转入步骤504,否则转入步骤503;
步骤503、调用底层函数读取外部存储设备中的对应数据文件;
步骤504、返回数据文件内容;
步骤505、将临近扇区的数据文件内容拷贝到高速缓存区。
3、中断和异常控制模块,用于所述文件访问控制模块根据所述配置信息在外部存储设备上进行的数据文件操作发生中断时,保存操作执行状态,中断恢复后,根据所述保存的操作执行状态继续执行。
在访问外部存储设备的过程中可能会发生某个扇区物理损坏不能读取、找不到相应数据扇区、外部存储设备响应超时等异常情况,中断和异常控制模块则负责对这些异常事件进行相应的处理,当数据发送或者数据接收完成、数据传输时间片轮转触发相应的中断时,中断和异常处理模块完成对中断的响应,并调用相应的中断处理函数来完成处理。具体的,当异常中断发生时,在执行完当前指令后,将跳转到相应的异常中断处理程序处执行。当异常中断处理程序执行完成后,程序返回到发生中断的指令的下一条指令处执行。在进入异常中断处理程序时,要保存被中断的程序的执行现场。从异常中断处理程序退出时,恢复被中断的程序的执行现场即可。
处理器响应中断的时候,总是从固定的地址开始的,为了使得上层应用程序与硬件中断跳转联系起来,可以编写一段中断解析程序来进行连接。图6为中断与异常实施流程示意图,如图所示,具体实施可以包括如下步骤:
步骤601、发起中断请求;
步骤602、跳转到固定地址;
步骤603、从起始固定地址跳转至用户自定义的固定地址的内存区,其中存放中断再跳转的解析程序;
步骤604、解析程序读取中断向量表,得到中断函数的目标地址;
步骤605、跳转至目标函数地址。
部分中断向量的定义可以如下:
THOR_DRV_USART_INTERRUPT =THOR_DRV_SET_LBIT(0),
THOR_DRV_MMC_INTERRUPT =THOR_DRV_SET_LBIT(2),
THOR_DRV_FLASH_INTERRUPT =THOR_DRV_SET_LBIT(3),
THOR_DRV_GPT1_INTERRUPT =THOR_DRV_SET_LBIT(6),
THOR_DRV_GPIO_INTERRUPT =THOR_DRV_SET_LBIT(10),
THOR_DRV_SMAP_INTERRUPT =THOR_DRV_SET_LBIT(15),
THOR_DRV_DMA_INTERRUPT =THOR_DRV_SET_LBIT(18)。
并定义相应的中断处理函数为:
typVoidFunc pFIQInterruptHandler;
typVoidFunc pMUARTInterruptHandler;
typVoidFunc pMMCInterruptHandler;
typVoidFunc pWDTInterruptHandler;
typVoidFunc pGPT1InterruptHandler;
typVoidFunc pGPIOInterruptHandler;
typVoidFunc pDMAInterruptHandler。
进一步的,实施中由于通过高速缓存模块和防插拔掉电保护模块对外部存储设备的访问都是基于逻辑数据的访问。而直接的物理地址寻址复杂,而且需要考虑坏块和负载均衡的情况,如果直接进行物理地址的数据文件访问的话,效率非常的低下。这样可以利用外部存储设备逻辑扇区访问接口模块封装逻辑地址与物理地址的转换、以及坏块和负载均衡的管理等问题,使得上层的文件访问操作可以方便的通过逻辑扇区访问接口模块对逻辑地址进行外部存储设备的数据访问。
外部存储设备逻辑扇区访问模块实际上是为上层提供了一种连续的、没有坏块的、以扇区为单位访问的地址空间以及存储接口。所述功能模块可以对外部存储设备的物理块进行管理,标识出坏块,并且实现将上层传来的逻辑地址映射为外部存储设备相应的物理地址。同时,由于flash的块有擦写次数的限制,所以还可以让每一个物理块有均匀的擦写机会,使新的数据尽量写到最少被使用的空闲块,而长期不变的数据要拷贝到另外的块中,原先占用的块由频繁更新的数据使用。由于FLASH写操作只能在空或已擦除的单元内进行,并且相对于读写操作,擦除操作的时间十分长。所以在更新数据时并不是把数据所在的块擦除后在写入数据,而是找一个新的空闲块写入数据,把先前的块标记为舍弃,在***空闲的时候擦除那些标记为舍弃的块。
逻辑扇区访问接口模块调用物理扇区访问接口模块中封装的函数完成对物理扇区的数据访问。不同厂商、不同FLASH结构都会导致闪存的控制命令的差异;而不同的容量会导致地址字节数不同;外部存储设备物理扇区访问模块则针对这些差异实现相应的驱动。并且对这些差异进行封装,向上层提供统一的接口,使得上层能够访问任意物理地址的数据,而不用关心控制命令序列和地址字节数。
有上述实施可以看出,即使各个智能卡公司的COS不一样,外部存储设备的存储介质及其上的文件***也不尽相同,但是本发明实施例可以实现卡片应用程序以及COS对外部存储设备快速安全有效的访问。本发明实施例通过采用层次结构的方案,将对外部存储设备的操作封装成不同的功能层次,操作时只需要调用COS最外层的功能函数即可,而具体的读写控制、缓存、防插拔掉电等各模块都相应的封装在中间层,最底层是调用外部存储设备的物理读取函数;从而构建一个快速、安全、有效,同时也便于扩展的智能卡访问外部存储设备的体系。
在本发明实施例的层次结构下,将构成***的各个部分按照不同层次进行抽象;层与层之间完全单向依赖,相邻层间通过界面相互作用,下层为上层提供服务,上层使用下层提供的服务以实现本层的功能。上层隐藏紧接下层的细节,下层所涉及的技术规范、实现技术及其复杂性完全被紧邻上层所屏蔽,越往上层其抽象程度越高,越来越呈现出统一性;而同时上层也弥补下层的缺陷和不足,提供功能更为完善的服务。
进一步的,本发明实施例在COS在访问外部存储设备时,除了读取或者改写外部存储设备的内容等操作之外,还提供了优化读写的速度、解决了在读写过程中发生的掉电保护问题、提高了有效访问外部存储设备的文件***、在外部存储设备上建立COS的目录文件结构等功能。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。