智能卡COS底层无关性设计
2012-08-08李代平
蔡 姣,李代平
(广东工业大学 计算机学院,广东 广州 510006)
智能卡在计算机技术、网络技术、数据库处理技术、高频技术、数据保护和密码学等的应用日趋广泛,因此智能卡的数量也在直线上升,因此在各个卡之间应用的移植问题引起了人们的关注。
智能卡操作系统 COS(Chip Operating System)是针对某一种特定芯片开发的,该操作系统通常由芯片生产商开发,因为只有他们才真正了解芯片底层的技术细节。每个厂家芯片COS开发的环境都不一样,在COS支持的上层应用不变的情况下,当更换不同的硬件时,需要了解新硬件COS的开发环境、新硬件底层的技术细节,重新将上层逻辑应用移植到新的硬件上时,移植的工作量非常大,不低于重新编写一次COS,而且移植过后COS的稳定性也需要重新测试,这样极大制约了智能卡应用的快速发展。另外,智能卡COS目前使用的开放式系统研发环境,存在较高的版权费用,软件成本偏高;而使用自然语言开发的COS,目前大多使用层次结构,效率较低,编写的代码量较大,降低了硬件的效率并增加了存储成本。针对以上问题本文提出了解决不同硬件之间操作系统移植的解决方案。通过对COS结构底层模块的研究,结合Java卡的硬件无关的优点,设计出与底层无关的COS。
1 COS结构模型
智能卡的设计一般分为三层结构:硬件抽象层、核心层和应用层。其中硬件抽象层设计与智能卡芯片物理结构相关的功能,使其对上层透明;核心层包含了智能卡的主要结构和功能:卡启动程序及初始化、内外部认证、命令解析、安全问题及文件系统等核心功能;应用层主要提供基于硬件抽象层和核心层的不同应用。随着技术的发展,应用层将提供更多的有利且方便用户的应用[1]。智能卡结构如图1所示。
图1 智能卡三层结构图
2 Java智能卡
Java卡是在智能卡硬件系统基础上通过软件构造的一个支持Java程序下载/安装并运行的软/硬件系统。通过引入Java虚拟机技术,Java智能卡在保留了原有智能卡应用的便捷、安全等特性的同时,继承了Java技术的硬件无关特性,将智能卡应用程序的开发同智能卡硬件系统相分离,简化了应用程序的开发,提高了应用程序的可重用性。Java智能卡包括:智能卡硬件系统、与智能卡硬件系统相关的本地方法集、Java智能卡虚拟机JCVM、Java智能卡类库、Java智能卡应用管理组件、Java智能卡运行环境JCRE以及Java智能卡应用[2]。其系统结构如图2所示。
图2 Java卡系统结构图
智能卡COS与Java卡的区别:
从图1、图2可以看出,智能卡模块之间的调用是直接利用下层的函数与各模块的相互作用来实现应用程序,而Java卡是通过一个虚拟机来实现。此虚拟机即是Java卡与硬件无关特性的关键模块,卡内的虚拟机负责依据不同的智能卡硬件和操作系统特性来执行安装到卡上的CAP文件中的字节码。
3 智能卡的设计及其可行性分析
根据Java卡的特性,提供本地方法集将与硬件相关的问题包含在一个模块内,同时提供Java智能卡类库,为应用程序调用下层函数提供统一接口。同时Java智能卡类库还包含了所有可能用到的类库及应用扩展类库,以方便用户安装尽可能多的应用。
将此思想应用到C编写的智能卡,可以将所有智能卡底层的硬件驱动全部包含进来,使得硬件驱动模块成为硬件驱动集模块,同时又保持API接口不变,这样上层应用设计时就不需改变调用接口,还是以同一接口调用,即可完成应用的移植问题。
硬件驱动集,使上层都使用统一接口。考虑到所有函数调用都使用相同意义的参数,根本无法区别驱动集中的任一相应函数。因此,不可能将所有驱动的参数都放到接口的参数列表中来调用对应的底层函数。因为这样从参数的个数来区别驱动集的函数不可行。为此本智能卡的设计采用了如下方法:
(1)借鉴网络编程时,通过参数来指定协议确定通信,因此可以增加一个参数来指定智能卡的类型来确定需要调用的函数。例如对于readflash函数:void fs_read_Flash(unsigned char*XRamAddr,unsigned long sAddr,unsigned int Length)通过增加参数char TYPE来确定类型。此时函数变为:
void fs_read_Flash(char TYPE,unsigned char*XRamAddr,unsigned long sAddr, unsigned int Length)然后通过swith…case即可以区分各个驱动函数从而实现驱动集的分类。而对于各个具体的驱动函数则通过它们的硬件名来命名其函数名以区分各个驱动函数。这样就不会混合各个驱动函数。改进的微内核层结构如图3所示。
图3 改进的微内核层结构图
此方法应用到Java卡的类库的特点是并非所有的库函数都会用到,但对于所有的可能情况都考虑到了,因为智能卡的种类是有限的,因此通过swith语句来区分各个卡的驱动函数,此方法是可行的。
但此方法存在一个问题是:对于上层调用硬件驱动时需指明硬件类型,因此当硬件改动时,应用层的移植需要修改所有硬件类型。虽然可利用工具查找并替换来完成,但这也是此方法的一个缺点。
此外,也可以将驱动层与硬件绑定,每个功能相同的驱动采用同一函数名,同时驱动层的各驱动的参数相同,因此在上层调用接口不变的情况下就可以调用不同硬件的相应驱动,无需改变任何函数及参数。
(2)借鉴 Java卡的特点,可以将硬件与本地方法即硬件驱动绑定在一起,而上层接口保持不变。若各个与硬件绑定的驱动函数参数不一致,可以在函数内部进行调整使得对上层接口保持一致性。
(3)最简单的方法就是将所有的智能卡硬件设定一个规范,所有的智能卡都遵循此规范,这样某一智能卡的COS在所有智能卡中都可以使用,某一智能卡上的应用在其他智能卡上也可以同时使用,这样就实现了智能卡的移植问题。即制造统一的智能卡芯片,所有的智能卡的硬件驱动层相同,此时上层调用的接口也相同,所有的应用都是在相同的底层基础上开发的,相互之间的移植也是完全适用的。
在智能卡的迅速发展中,对于此移植问题的解决,可以保证上层应用开发的一致性,使得更多的应用可以在卡间相互应用,使智能卡的整体性能得到提升,应用也更加广泛。
[1]李春风.欧阳小星RF_SIM卡的多应用COS研究与设计[J].计算机工程与应用,2011(2):57-59.
[2]张大伟.靳伟 Java智能卡原理与应用开发[M].北京:电子工业出版社,2007.