(机械设计及理论专业论文)动态多应用智能卡中的卡操作系统研究及实现.pdf_第1页
(机械设计及理论专业论文)动态多应用智能卡中的卡操作系统研究及实现.pdf_第2页
(机械设计及理论专业论文)动态多应用智能卡中的卡操作系统研究及实现.pdf_第3页
(机械设计及理论专业论文)动态多应用智能卡中的卡操作系统研究及实现.pdf_第4页
(机械设计及理论专业论文)动态多应用智能卡中的卡操作系统研究及实现.pdf_第5页
已阅读5页,还剩56页未读 继续免费阅读

(机械设计及理论专业论文)动态多应用智能卡中的卡操作系统研究及实现.pdf.pdf 免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

i 摘摘 要要 智能卡技术在金融、社保、海关等信息安全领域得到广泛运用。动态多应用智能 卡是智能卡的发展趋势,它使一张卡片上可以同时容纳多个应用,在不同的场合使用 不同的应用。在智能卡的生命周期中,持卡者可以根据需要下载或删除应用。动态多 应用技术给供卡方、发卡方和持卡方都带来了好处,有利于提高当前国内智能卡的应 用水平,实现“轻松持卡、方便用卡” ;同时,还能减少重复发卡,避免无序发卡, 提高应用系统的投资效率。 卡操作系统是动态多应用智能卡的重要组成部分, 本文在分析了国外 java 卡和 multos 卡技术的基础上,提出基于国产芯片的动态多应用系统方案,其中包括动 态多应用系统管理平台和卡操作系统体系结构, 并重点对卡操作系统的各组成部分及 关键技术进行了详细的分析,其中包括 i/o 通信模块、加密算法、文件系统、安全机 制和多应用管理模块等。 虚拟机技术是实现动态多应用智能卡操作系统的关键技术之一, 也是实现动态多 应用的技术根本。本文在分析虚拟机技术基本原理基础上,结合实际需要设计了动态 多应用虚拟机,分析了其结构以及寄存器、处理器、虚拟机上下文、地址转换器、过 程调用机制和应用防火墙的工作原理。另外,本文从实现出发,详细地实现了动态多 应用虚拟机的内存管理、寄存器处理、处理器和虚拟机上下文等功能。 最后, 本文通过实例介绍了动态多应用系统平台的操作过程及动态多应用智能卡 操作系统执行结果。 关键词:关键词:动态多应用智能卡 卡操作系统 虚拟机 动态多应用虚拟机 ii abstract the technology of smart card is widely used in the information security fields of finance、social security、ciq relations. dynamic multi-application card (dmac) leads the trend of the development in smart card. it can contain multiple applications with the capability of using different applications in different fields. the cardholders can download or delete any applications in the lifecycle of the card. this technology provides benefit to the card manufactures, the card developers and the cardholders, and makes for enhancing the application level of smart card in china to carry out “holding card easily and using card conveniently”. furthermore, it can heighten the investment efficiency of application system by decreasing reduplicate card and avoiding wrong card. card operation system (cos) is a key factor of dmac. this article presents the architecture of dmac system based on analysis of java card and multos card technology, which includes dynamic multi-application system management platform and cos architecture. moreover, this article analyzes all compositions and key technologies of cos, including i/o communication, encryption arithmetic, file system, secure mechanism, multi-application management module, etc. virtual machine technology is a key technology for carrying out dmac operation system, and also a keystone. this article designs dynamic multi-application virtual machine based on postulate of virtual machine by thinking over actual requirement, and analyzes its framework and register, processor, virtual machine context, address transform machine, process call mechanism and work principle of application firewall。 in addition, this article carries out dynamic multi-application virtual machine including memory management, register management, processor, virtual machine context, etc. at last, this article introduces the operation process of dynamic multi-application system platform and the result of dmac operation system. key words: dynamic multi-application card, card operation system, virtual machine, dynamic multi-application virtual machine 1 1 绪论绪论 智能卡1 4,23,24又名智慧卡、 聪明卡, 英文名称为 smart card 或 integrated circuit card,是法国人 roland moreno 于 1970 年发明的,同年日本发明家 kunitaka arimura 取得首项智能卡的专利,距今已有近 30 年的历史。随着超大规模集成电路技术、计 算机技术和信息安全技术等的发展,智能卡技术也更成熟,并获得更为广泛的应用。 早期的智能卡是单应用智能卡,即一张卡片中只有一个应用,只提供一种功能, 如公交卡上只有一个应用,只能做公交刷卡用。 随着芯片和智能卡技术的发展,单应用智能卡已不能满足社会的需求而产生了静 态多应用智能卡。 静态多应用智能卡在一张卡片中同时存在多个应用, 实现多个功能。 静态多应用智能卡的好处是充分利用芯片资源,节约了成本。但静态多应用智能卡中 的应用必须在卡片初始化时写好,而在其生命周期中不能更改。 为了能使一张卡片上可以同时容纳多个应用,在不同的场合使用不同的应用,同 时应用本身还可以根据需要随时下载到卡中或从卡中删除,动态多应用智能卡产生。 这给供卡方、发卡方和持卡方都带来了好处。现在我们一般讲的“一卡多用”为动态 多应用。 动态多应用智能卡是智能卡发展的趋势,国际上普遍采用的两种动态多应用智能 卡平台分别是基于 java 卡技术和 multos 标准的,二者目前都得到了广泛应用。 1.1 动态多应用智能卡国内外概况动态多应用智能卡国内外概况 1.1.1 动态多应用智能卡国外概况动态多应用智能卡国外概况 1.1.1.1 java 卡技术 java 卡9 17,3133的体系结构如图 1.1 所示。 2 os 另一种方式是通过段地址(segment address)来访问, 段地址将数据空间作为一个整体来进行地址编码, 则 pb=st=静态空间大小, db=pt= 静态空间大小公共空间大小,由于公共空间大小是固定的,且当应用被选定后其静 态空间大小也是固定的,因而在一个应用中,段地址可以唯一确定。 另外,对于地址寄存器,在整个应用运行期间 sb、st、pb、pt 和 db 是固定不 变的,而 lb 和 dt 随着应用的执行,处理器会改变其值,它们之间的关系如图 3.3 所示: 静态空间静态空间公共空间公共空间动态空间动态空间 sbsb stst pbpb ptpt dbdb lblb dtdt 图 3.3 地址寄存器逻辑关系 24 我们使用动态空间作为数据操作栈,用于存储中间结果,dt 表示数据操作栈顶。 lb 表示局部基地址,提供过程调用与局部变量管理的功能。 3.4 处理器处理器 处理器根据指令的类型可以对数据空间中的数据进行读与写操作,而对于寄存器 而言, 操作指令可以对除 cp 外的 8 个寄存器进行读操作, 但只能对 ccr 进行写操作。 结合智能卡的特殊性,处理器提供 6 种指令类型,分别为:系统控制指令、流程 控制指令、栈操作指令、数值操作指令、单元操作指令和双元操作指令。下面分别给 予阐述: 1)系统控制指令分为系统指令与原语指令。系统指令用于设置命令的执行结果 (如 la,sw1,sw2)和应用结束。原语指令用于执行虚拟处理器提供的原语操作。 原语是更高级的方法,由虚拟处理器提供,来简化应用程序的开发量,如加密运算原 语等。 2)流程控制指令用于有条件或无条件地控制程序的流程,如 branch、jump 等。条件控制时运用 ccr 状态位来决定流程方向。 3)栈操作指令分为三类:一类是加载,用于将目标空间的数据内容或地址加载到 动态空间;二类是存储,用于将动态空间里的内容存储到目标空间;三类是索引,用于 计算数组索引地址。 4)数值操作指令用于将目标空间中指定的字节或字的内容与数值进行运算 (包括 加、减、赋值、比较等) 。 5)单元操作指令是指在指令中有且仅有一个目标空间数据块参与操作,如 clearn 用于将目标空间中指定数据块进行复位。 6)双元操作指令是指在指令中有两个目标空间数据块参与操作,如 addn 用于 将第二个目标空间指定数据块的内容加到第一个目标空间指定数据块的内容上。 处理器支持三种寻址方式,分别为:立即寻址、直接寻址和间接寻址。立即寻址 是指立即数据存在于指令中,不需要一个地址或者寄存器,立即数据在一个程序中固 定不变。直接寻址是数据的地址存在于指令中,而不是数据的值,指令中的数据在程 序执行过程中可以改变。间接寻址是指在指令中使用数据地址的地址进行寻址,这样 数据的位置不是固定的,可以被更改。例如:addb sb0001, 10,对于此指令第 25 一个操作数使用直接寻址方式,而第二个操作数则使用立即寻址方式。 3.5 虚拟机上下文虚拟机上下文 为了对卡中的多个应用进行区别和操作,我们提出虚拟机上下文的概念。虚拟机 上下文是对某一应用选择后的相关信息的概括。在应用被选择后,由虚拟机上下文保 存当前被选择应用的一些信息,直到其它应用被选择或卡系统退出。 由于在目前的设计中,系统只支持在同一时刻仅一个应用被选定,因而虚拟机上 下文的作用是当某应用选择期间,保存该应用的一些基本信息,主要需要保留的数据 为当终端选择一个应用后进行初始化的数据和一些运行状态。其中初始化数据有:应 用代码在文件系统中保存的相对位置(代码空间的物理地址) 、数据在文件系统中保 存的相对位置(静态空间的物理地址) 、标识应用代码的 sessiondata(即应用程序的 全局变量)长度;运行状态数据有:虚拟机是否需要继续解释应用代码标识(即判断 应用是否执行完成) 、虚拟机在解释执行应用时是否出现异常情况标识。在上下文中 没有提供公用空间和动态空间的物理地址,因为它们是固定的,不由应用的不同而改 变。 虚拟机上下文的使用原理如图 3.4 所示: 图 3.4 虚拟机上下文使用原理 因而在同一时刻仅有一个应用被选择,因而虚拟机上下文被应用共用,由虚拟机 进行管理。当某个应用被选择后,虚拟机上下文便与之绑定并根据应用的基本信息进 行初始化设置。 26 3.6 地址转换器地址转换器 3.6.1 基于各空间的地址转换基于各空间的地址转换 因为在此虚拟机中,代码空间、静态空间、公用空间及动态空间是一个虚拟的概 念,在实际的执行过程中,则必须通过地址转换器将其转换成为实际的物理空间,从 而实现应用与硬件平台无关。 在此虚拟机中,地址转换器需要四个基址,它们分别为代码空间、静态空间、公 用空间及动态空间的物理基地址。如图 3.4 所示,在实际的转换中,将基址与空间相 对地址相加得到实际物理地址。在应用中,我们采用的是 16 位寻址,但在智能卡硬 件平台上,寻址不小于 16 位即可。 代码空间 静态空间 公用空间 动态空间 空间相对地址tag 按tag选择 相应的空间 得到其物理 地址 加 实际地址 图 3.4 基于各空间的地址转换 3.6.2 基于段地址的地址转换基于段地址的地址转换 由于虚拟机提供间接寻址的访问方式,因为我们必须对数据空间(即静态空间、 公用空间和动态空间)进行统一编址。如图 3.5 所示,当对段地址进行物理地址转换 时,首先判断段地址属于那一个空间并计算出在该空间的相对地址,再依据基于各空 间的地址转换原理进行转换。 27 段地址 根据段地址 判断在那个 空间和相对 地址 寄存器 在相应的空 间得到物理 地址并加上 相对地址 静态空间 公用空间 动态空间 实际地址 图 3.5 基于段地址的地址转换 3.7 过程调用机制过程调用机制 为了使应用编码精简,在虚拟机中提供了过程调用机制,即支持应用程序中的函 数调用。过程调用机制中主要发挥作用的是 lb 与 dt 两个寄存器。当应用开始时 dt=lb=db+会话数据长度(会话数据相当于公用变量,在整个会话过程中存储在动 态空间的开始端,见图 3.6) ,随着应用的执行,dt 始终指向动态空间的栈顶,而当 发生函数调用时 lb 将改变,具体的过程如图所示: 会话数据会话数据 dblbdblb 局部操作栈局部操作栈输入参数输入参数 dtdt 控制数据控制数据 lb dt lb lb dt lb 1 2 3 121 2 3 12 局部操作栈局部操作栈返回值返回值 dtdt3 3lb dt lb dt 0 0 0 0 局部操作栈局部操作栈返回值返回值 lblb4 4dtdt4 4dbdb 图 3.6 过程调用机制 当应用开始执行时 dt0=lb0=db+会话数据长度,当应用执行到一定时间时,假 设 lb 变为 lb1,在 lb1以上的空间为局部操作栈,当需要执行运程调用时,将发生 如下变化: 28 1)将输入参数压入栈顶,dt 变为 dt1。 2)执行过程调用指令,虚拟机将控制数据(cp、ccr、lb 共 6 个字节)压入栈 顶,cp 寄存器转向过程代码地址,lb 与 dt 分别变为 lb2与 dt2。 3)执行过程,在过程中需要调用输入参数可以通过 lb-n来访问,因为控制数 据为定长,过程可以很方便地得到输入参数的值。 4)过程执行结束时,将返回值置于栈顶,此时 lb 与 dt 分别变为 lb3与 dt3。 5)退出过程时,虚拟机会将用 cp=lbfffe,2、ccr=lbfffc,2和 lb=lbfffa,2进行复原。另外虚拟机将输入参数及以上的数据出栈,并将返回 值压入栈顶,此时 lb 与 dt 分别变为 lb4与 dt4。对于虚拟机如何知道输入参数和 返回值的长度,我们通过退出过程的指令来实现,如指令“ret 4,2”表示输入参数 长度为 4 个字节,返回值长度为 2 个字节。 除上面的方案外,还有下面一种常规方案: 会话数据会话数据 dblbdblb 局部操作栈局部操作栈输入参数输入参数 dtdt 控制数据控制数据 lb dt lb lb dt lb 1 2 3 121 2 3 12 局部操作栈局部操作栈返回值返回值 dtdt3 3lb dt lb dt 0 0 0 0 局部操作栈局部操作栈返回值返回值 lblb4 4dtdt4 4dbdb 图 3.7 另一种过程调用机制 当应用开始执行时 dt0=lb0=db+会话数据长度,当应用执行到一定时间时,假 设 lb 变为 lb1,在 lb1 以上的空间为局部操作栈,当需要执行运程调用时,将发生 如下变化: 1)首先预留返回值空间,再将输入参数压入栈顶,dt 变为 dt1。 2)执行过程调用指令,虚拟机将控制数据(cp、ccr、lb 共 6 个字节)压入栈 顶,cp 寄存器转向过程代码地址,lb 与 dt 分别变为 lb2与 dt2。 3)执行过程,在过程中需要调用输入参数可以通过 lb-n来访问,因为控制数 据为定长,过程可以很方便地得到输入参数的值。 4)过程执行结束时,将返回值写到返回值空间,此时 lb 与 dt 分别变为 lb3与 29 dt3。对于虚拟机如何知道输入参数和返回值的长度,这是由编译器在编译时计算出 来的。 5)退出过程时,虚拟机会将用 cp=lbfffe,2、ccr=lbfffc,2和 lb=lbfffa,2进行复原。另外虚拟机将输入参数及以上的数据出栈,并将返回 值压入栈顶,此时 lb 与 dt 分别变为 lb4与 dt4。 考虑到编译器设计的方便性,我们选择了第一种过程调用机制。 3.8 应用防火墙功能应用防火墙功能 应用防火墙是指在应用之间设置防火墙,禁止一个应用读写另一个应用的私有数 据。对于安全性要求很高的智能卡开发,某一个应用只能访问属于它自己的私有存储 区和公共区,而没有访问其它应用私有区的权限。因此我们在虚拟机中必须提供防火 墙机制,在各应用之间构筑防火墙,保证应用只能访问它自己的内容,防止其它数据 的非法访问。 在应用被下载到智能卡时,应用管理模块必须在卡上注册该应用,其中主要注册 的数据包括应用代码在 eeprom 中的存储地址及长度、 应用数据在 eeprom 中的存 储地址及长度等。 其中存储地址用于地址转换, 应用代码长度用于确定代码空间大小, 应用数据长度用于初始化 st 等,确定静态空间的大小。通过固定代码空间大小来校 验应用代码的范围。通过固定静态空间大小和对静态空间数据访问时的地址校验来保 证应用只能访问属于它自己的私有存储区。而对于公共区的数据,同样可通过地址校 验来保证其访问权限。图 3.8 说明了虚拟机对应用数据、应用代码和公共数据区的边 界限制, 从而实现应用防火墙功能。 其中边界值可以通过寄存器和虚拟机上下文得到。 虚拟机 eeprom 虚拟机 eeprom 应用数据应用数据 应用代码应用代码 静态 空间 代码 空间 静态 空间 代码 空间 边界 边界 边界 边界 ramram 公共数据区公共数据区边界边界 图 3.8 虚拟机防火墙功能 30 3.9 本章小结本章小结 本章从虚拟机的原理出发,设计了动态多应用虚拟机结构,分析了各个部分的功 能。另外,对寄存器、处理器、虚拟机上下文、地址转换器、过程调用机制和应用防 火墙等几个重要技术进行了深入地分析和阐述。 31 4 动态多应用虚拟机实现动态多应用虚拟机实现 根据前章对动态多应用虚拟机的设计,本章主要从实现出发对虚拟机的主要组成 部分进行详细阐述。动态多应用虚拟机有自己的内存空间需要管理,需要对寄存器进 行访问、修改和判断。处理器作为虚拟机的重要部分提供指令和原语的处理机制。另 外,虚拟机上下文将虚拟机与当前选择应用联系起来。 4.1 内存管理内存管理 由于应用代码是过程式的语言,而非面向对象式语言,因而相对 java 卡,我们 的内存管理可实现性好。 在 eeprom 方面,由于底层操作系统提供了文件系统,因而虚拟机可以直接调 用文件系统提供的 api。eeprom 内存管理的工作由文件系统的 fat12 机制去完成。 在 ram 方面,由于应用代码是非面向对象式,不需要进行堆操作与管理,只需 要对栈进行管理即可。在我们的系统结构中,此栈即为我们设计的动态空间,是一块 固定空间,结构如图 4.1 所示: 栈栈 ( 动 态 空 间 ) ( 动 态 空 间 ) lblb dtdt dbdbbottombottom toptop 图 4.1 栈组织图 其中动态空间的物理地址处于bottom, top,db、lb 和 dt 三个寄存器分别保 存相对于数据空间的地址。 32 4.2 寄存器处理寄存器处理 对于设计的 8 个 16 位寄存器和 1 个 8 位寄存器,为了方便程序开发定义寄存器 的数据结构为: typedef struct tagregister word wcodepointer; word wstaticbottom; word wstatictop; word wpublicbottom; word wpublictop; word wdynamicbottom; word wlocalbase; word wdynamictop; byte bconditioncode; register; 它们分别保存 cp、sb、st、pb、pt、db、lb、dt 和 ccr 的值。寄存器提供 相应的 api, 让处理器对寄存器中的值进行修改或进行条件判断。 下面进行详细说明: 1)wcodepointer 为代码空间中的 cp 值, 其随着虚拟机对代码的解释执行而改变。 2)wstaticbottom = 0。 3)wpublicbottom = wstatictop = 静态数据长度。 4)wdynamicbottom = wpublictop = wpublicbottom + 公共空间的长度。 5)wlocalbase 为局部基址,初始化时 wlocalbase = wdynamicbottom + 会话数 据长度,其随着函数调用而改变。会话数据长度从上下文中可以得到。 6)wdynamictop 为动态区的栈顶,其随着虚拟机对代码的解释执行而改变。 7)bconditioncode 为条件代码。目前用于“零位标识”和“进位标识”两个位, 其它的保留。 可以看出寄出器中的一些值固定不变,如 wstaticbottom,wstatictop, wpublicbottom,wpublictop,和 wdynamicbottom;另外一些是随着虚拟机对应用代 码的解释执行而改变, 如 wcodepointer, wlocalbase, wdynamictop, bconidtioncode。 33 对于固定不变的部分,主要用于辅助虚拟机实现地址转换和应用防火墙功能(应用数 据和动态空间的防火墙控制) 。 4.3 处理器处理器 4.3.1 指令编码指令编码 图 4.2 显示二进制格式的 cel 陈述结构。陈述是应用最小的完整单元,它由指令 字节和其后的指令所必需的一些操作数据组成。 opt op op t t b1b2b3b4 b1 opt op op t t b1b2b3b4 b1 w1w1 w2 w2 w2 w2 图 4.2 指令编码 上图显示了最大长度的一个 cel 陈述。第一个字节包括操作码和标识符,它被 指定为指令字节。保留字节被指定为 b1、b2、b3、b4 或 w1、w2、w3,这依赖于操 作数和它们大小的数值。 第一个字节是指令字节,由操作码和标识符组成。前面 5 位为操作码,后面 3 位 为标识符。举例:指令“addn sb0 x02, 2”如图 4.3 所示: 指令指令 addnaddn opcodeopcode 0 x020 x02 tagtag 1 1 block lengthblock length 2 2 address offsetaddress offset 0 x020 x02 0 0 0 1 00 0 0 1 00 0 1 0 0 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 0 10 0 0 0 0 0 1 00 0 0 0 0 0 0 0 0 0 0 0 0 0 1 00 0 0 0 0 0 1 00 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 图 4.3 指令举例 cel 有 31 个操作码,一条指令一个,它们被限制最大值 0 x1f。其中支持的操作 指令如表 4.1: 34 表 4.1 指令表 操作数 指令 实现 0 x01 addb byte 级的加法运算 0 x02 addn n 个 byte 的加法运算 0 x03 addw word 级的加法运算 0 x04 andn n 个 byte 的与运算 0 x05 branch pc 的相对地址跳转 0 x06 call 函数调用 0 x07 clearn 对 n 个 byte 的地址空间进行清零 0 x08 cmpb byte 级的比较 0 x09 cmpn n 个 byte 的比较 0 x0a cmpw word 级的比较 0 x0b decn n 个 byte 的数据值进行减一 0 x0c incn n 个 byte 的数据值进行加一 0 x0d index 数组空间的地址计算 0 x0e jump pc 的绝对地址跳转 0 x0f load 直接寻址式的数据加载 0 x10 loada 直接寻址式的段地址加载 0 x11 loadi 间接寻址式的数据加载 0 x12 notn n 个 byte 的取反运算 0 x13 orn n 个 byte 的或运算 0 x14 primret 调用原语 0 x15 setb byte 级的赋值 0 x16 setw word 级的赋值 0 x17 stack 栈操作 0 x18 store 直接存储 0 x19 storei 间接存储 0 x1a subb byte 级的减操作 0 x1b subn n 个 byte 的减操作 0 x1c subw word 级的减操作 0 x1d system 与公共空间有关的操作 0 x1e testn n 个 byte 的零比较 0 x1f xorn n 个 byte 的异或运算 35 标识符用来规定关于指令的附加信息,表示指令的操作空间选择、判断条件或指 令子类型,具体如下: 1)判断条件。其仅用于 branch 和 jump 命令,具体情况为: 其中 z 和 c 分 别为条件代码寄存器(ccr)中的零位状态位和进位状态位。 表 4.2 tag 判断条件表 tag 类型 条件代码 说明 1 eq z 相等时 2 lt c 小于时 3 le c or z 小于等于时 4 gt !(c or z) 大于时 5 ge !c 大于等于时 6 ne !z 不等时 7 a always 无条件跳移 2)指令子类型。其仅用于 primret、stack 和 system,具体情况不细叙。 3)操作空间选择。其用于余下的所有指令,具体情况是: 表 4.3 tag 操作空间选择表 tag 说明 0 相对于 pt 1 相对于 sb 2 相对于 st 3 相对于 db 4 相对于 lb 5 相对于 dt 6 相对于 pb 7 相对于 pt 4.3.2 处理器的实现处理器的实现 处理器是虚拟机的核心部分,其用于对应用代码进行解释执行。当操作系统将一 个命令交给虚拟机后, 处理器从头对应用代码进行解释执行, 直到应用退出返回响应。 36 主要过程如下: 虚拟机的 run() 虚拟机的 run() 操作系统 (主程序) 操作系统 (主程序) 初始化上下文 初始化寄存器 初始化上下文 初始化寄存器 选择应用选择应用 其它相 应处理 其它相 应处理 firstbyte = readcodebyte(); opcode = firstbyte 3; g_binstructiontag = firstbyte firstbyte = readcodebyte(); opcode = firstbyte 3; g_binstructiontag = firstbyte 其它 交给虚拟 机处理 否则得到指令操作 码和指令标识符 其它 交给虚拟 机处理 否则得到指令操作 码和指令标识符 指令执行 (g_binstructiontag 可能会被使用) 指令执行 (g_binstructiontag 可能会被使用)元语执行 (g_binstructiontag 可能会被使用) 元语执行 (g_binstructiontag 可能会被使用) 操作数来选择相 应的指令执行 如果是元语则根 据元语标识选择 相应的元语 操作数来选择相 应的指令执行 如果是元语则根 据元语标识选择 相应的元语 操作系统 提供的api 操作系统 提供的api 如果需要调用操 作系统的api 如果需要调用操 作系统的api 是否有被选 择的应用 是否有被选 择的应用 判断判断 失败失败 无则失败无则失败 应用是 否退出 应用是 否退出 有则判断有则判断 解释执行完成解释执行完成 图 4.2 处理器程序调用过程 当操作系统将命令交给虚拟机后,虚拟机首先调用 run()进行执行。在 run()中首 先判断当前是否有被选择的应用,然后通过一个 while 循环对代码进行解释执行直到 应用退出。在解释执行过程中,虚拟机根据代码选择相应的指令操作和原语操作。 处理器的主要代码如下所示: typedef struct tagaaminstructiontable byte binstructionid; /指令 id void (* execution)(void); /指令执行函数 aaminstructiontable; 37 typedef struct tagaamprimitivetable byte bprimitvieid; /原语 id void (* execution)(void); /原语执行函数 aamprimitivetable; const aaminstructiontable g_saaminstructiontable = /包含所有的指令 0 x01, instruction_addb, 0 x1f, instruction_xorn, ; const aamprimitivetable g_saamprimitivetable0 = /参数为 0 字节的原语 0 xa2, primitive_create_file_end, 0 xa3, primitive_delete_file, 0 x00, 0 x00 /结束 ; const aamprimitivetable g_saamprimitivetable1 = /参数为 1 字节的原语 0 x11, primitive_add_bcdn, 0 xe2, primitive_verify_asymmetric_and_retrieve_general, 0 x00, 0 x00 /结束 ; const aamprimitivetable g_saamprimitivetable2 = 38 /参数为 2 字节的原语 0 x01, primitive_bit_manipulat_byte, 0 x02, primitive_shift_right, 0 x00, 0 x00 /结束 ; const aamprimitivetable g_saamprimitivetable3 = /参数为 2 字节的原语 0 x01, primitive_bit_manipulat_word, 0 x80, primitive_call_extension, 0 x00, 0 x00 /结束 ; void runapplication() /处理器解释执行 byte firstbyte; byte opcode; byte i; g_saamregister.wcodepointer = 0; /从 cp = 0 开始解释 g_saamcontext.biscontinuerun = 1; /应用没有结束 while(g_saamcontext.biscontinuerun /读取第一个字节 opcode = firstbyte 3; /得到指令操作码 g_binstructiontag = firstbyte /得到指令的 tag i = 0; while(i 31) /一共 31 个指令 39 if(g_saaminstructiontablei.binstructionid = opcode) /找到相应指令 g_saaminstructiontablei.execution(); /执行该指令 break; i+; if(i = 31) /如果没找到相应指令 g_saamcontext.bhaveerror = 1; /错误 static void instruction_primret() byte b; byte i; aamprimitivetable* tabletemp4 = (aamprimitivetable*)g_saamprimitivetable0, (aamprimitivetable*)g_saamprimitivetable1, (aamprimitivetable*)g_saamprimitivetable2, (aamprimitivetable*)g_saamprimitivetable3 ; switch(g_binstructiontag) case 0: 40 case 1: case 2: case 3: b = readcodebyte(); i = 0; while(tabletempg_binstructiontagi.bprimitvieid != 0) if(tabletempg_binstructiontagi.bprimitvieid = b) tabletempg_binstructiontagi.execution(); break; i+; if(tabletempg_binstructiontagi.bprimitvieid = 0) /没有找到相应原语 g_saamcontext.bhaveerror = 1; /错误 break; case 4: break; case 5: break; case 6: break; case 7: 41 break; 4.4 虚拟机上下文虚拟机上下文 根据实际需要,我们把应用选择后特定数据和虚拟机运行的状态数据保存在虚拟 机上下文中,数据结构为: typedef struct tagaamcontext word wcodestartaddr; word wcodelen; word wstaticstartaddr; word wstaticlen; word wsessiondatalen; byte biscontinuerun; byte bhaveerror; aamcontext; 其中 wcodestartaddr 用于标识应用代码在文件系统中保存的相对位置 (代码空间 的物理地址) , wcodelen 用于表示应用代码的长度, wstaticstartaddr 用于标识应用数 据在文件系统中保存的相对位置(静态空间的物理地址) ,wsessiondatalen 用于标识 应用代码的 sessiondata(即应用程序的全局变量)长度,biscontinuerun 用于标识虚 拟机是否需要继续解释应用代码(即判断应用是否执行完成) ,bhaveerror 用于标识 虚拟机在解释执行应用时是否出现异常情况。 虚拟机上下文解决了下面几个问题: 1)可以通过虚拟机上下文和寄存器的 cp 值得到实际的应用代码地址,从而得到 应用代码。 2)可以通过虚拟机上下文和寄存器的 sb 与 st 值得到实际的应用数据地址,从 而得应用数据。 42 3)由于提供了 wcodelen 和 wstaticlen 值, 可以分别对应用代码和应用数据进行 防火墙控制。 4)wsessiondatalen 初始化动态区的 sessiondata 区。 5)根据 biscontinuerun 判定应用解释执行是否完成。 6)根据 bhaveerror 判定应用解释执行是否成功。 4.5 本章小结本章小结 本章从动态多应用虚拟机实现的角度, 对其进行了详细阐述, 其中包括内存管理、 寄存器处理、处理器指令编码及其实现和虚拟机上下文。本章根据 3 章的设计实现了 以处理器为核心,寄存器、虚拟机上下文、地址转换器、过程调用机制和应用防火墙 为辅助的动态多应用虚拟机。 43 5 实例实例 5.1 实例的提出实例的提出 在高校学习生活中,学生会用到各种证件,为了方便管理与使用,可以考虑用动 态多应用技术将各种不同的证件集成到一张卡片。不同的应用由不同的部分进行管 理,各负其责。 目前主要考虑三个方面的应用: 1)学生证。将学生的学籍信息保存在此应用中,可以由学籍管理者进行修改。 2)图书证。将学生的图书证信息保存在此应用,可以由图书馆管理者进行修改。 3)电子消费。由后勤集团进行管理,用于学生的电子钱包。 5.2 应用的编写应用的编写 5.2.1 学生证应用学生证应用 根据实现情况定义静态空间的内容: 1)院系代号,占 3 字节,用 bcd 码表示; 2)学生证号,占 10 字节,用 bcd 码表示,左对齐,右补充 0; 3)姓名,占 10 字节,左对齐,右补充 0; 4)籍贯代号,占 2 字节,用 bcd 码表示,右补充 0,为电话号码区号; 5)出生日期,占 4 字节,用 bcd 码表示,如 2004 01 01; 6)pin,占 10 字节,用 bcd 码表示,用于管理员的 pin 校验,只有通过 pin 验 证的使用者才能对学生信息进行修改。 另外,考虑到有一 pin 校验的标识位,因而设定 1 字节的会话数据。提供的操作 及自定义的相应命令有(其中 cla = 0 x90): 1)读/写院系代号,ins = 0 x10/0 x20,p1 = p2 = 0; 2)读/写学生证号,ins = 0 x30/0 x40,p1 = p2 = 0; 3)读/写姓名,ins = 0 x50/0 x60,p1 = p2 = 0; 44 4)读/写籍贯代号,ins = 0 x70/0 x80,p1 = p2 = 0; 5)读/写出生日期,ins = 0 x90/0 xa0,p1 = p2 = 0; 6)更新 pin,ins = 0 xb0,p1 = p2 = 0; 7)校验 pin,ins = 0 xc0,p1 = p2 = 0; 根据上面的需求,代码为: static byte department3; /院系代码 static byte number10; /学生证号 static byte name10; /姓名 static byte nativeplace4; /籍贯 static byte birthday4; /出生年月日 static byte pin10; /pin /全局变量,即为会话数据 byte verify; void main(void) if(cla != 0 x90) exitsw(0 x8001); /cla 不匹配 switch(ins) case 0 x10: /读院系代号 checkcase(2); /no command, response blockcopy(3, department, /将代号拷贝到动态区 exitla(3); break; case 0 x20: /写院系代号 if(verify = 0) exitsw(0 x8000); /没有权限 45 checkcase(3); /command, no response blockcopy(3, /将动态区写到代号 exit(); break; case 0 x30: /读学生证号 checkcase(2); /no command, response blockcopy(10, number, /将学生证号拷贝到动态区 exitla(10); break; case 0 x40: /写学生证号 if(verify = 0) exitsw(0 x8000); /没有权限 checkcase(3

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论