1
开放式运行环境定位
字符常量池是什么意思安全芯片内部嵌入式操作系统架构如图 1所示。
图 1 安全芯片内部嵌入式操作系统架构
嵌入式操作系统分为 3 层,即应用层、安全运行环境和硬件驱动层。其中,安全运行环境是一个运行在硬件驱动层和应用层之间的中间平台层,安全运行环境与硬件驱动层分离,便于安全运行环境在不同芯片硬件平台之间移植切换;安全运行环境提供一系列应用程序接口(Applic
ation Programming Interface,API) 给应用层,供应用开发者开发各种行业应用,这些应用在产品发行后也可以下载到安全运行环境进行加载、运行。安全运行环境负责对芯片中的应用进行管理,保护应用本身以及应用相关数据信息的安全。
2
开放式运行环境总体架构
本文提出的面向资源受限安全芯片的开放式运行环境包括芯片外部的上位机编译器和芯片内部的虚拟机解释器 2 个部分,总体架构如图 2 所示。
图 2 开放式运行环境总体架构
在总体架构中,芯片外部的上位机编译器将源文件编译转换成可执行二进制文件,芯片内部的虚拟机解释器加载并解释执行该可执行二进制文件。架构中各模块定义如下:(1)源文件是指基于通用语言规范限定编写的源代码;(2)编译转换是指将源代码编译为中间指令集;(3)可执行二进制文件是指包含方法组件的特定格式文件;(4)解释执行是指加载可执行二进制文件中的字节码,在虚拟机中解释执行。
2.1 通用语言规范限定资源受限
安全芯片因 Flash 空间和随机存取存储器(Random Access Memory,RAM)空间受限,只能运行基于 16 位操作指令的虚拟机,不能基于通用语言规范来编写应用源代码,因此,需要对通用语言规范做以下限定。(1)数据类型支持限定。支持布尔类型(boolean)和数值类型,数值类型包括字节型(byte)、短整型(short)及整型(int)等,不支持字符型(char)、长整型(long)和浮点型。(2)操作指令限定。在虚拟机中运行的基本数据单元为 16 位数据,boolean 类型、byte 类型、short 类型及引用类型的存储参数、局部变量和中间运算结果占用 1 个基本数据单元,int类型的存储参数、局部变量和中间运算结果占用 2 个基本数据单元,boolean 和 byte 类型的数值在算术运算时先将数值类型提升为 short 类型,
若其中一个操作数类型为 int 类型,则再将数值类型提升为 int 类型。(3)数值类型提升限定。应用于算术运算符的操作数包括一元数值类型提升和二元数值类型提升,比如:当操作数在编译时的类型为byte,则须通过宽化类型转换方法将其转换为short 类型;若其中一个操作数类型为 int 类型,另一个操作数类型也转换为 int 类型。(4)数组创建和访问限定。数组类型和索引为 short 类型,只支持一维数组。(5)关键字限定。不支持复杂关键字,例如,线程同步 synchronized、枚举 enum、断言 assert 等。
2.2 编译转换
编译转换过程如图 3 所示。
图 3 编译转换过程
编译器将源文件编译转换为可执行二进制文件,转换过程包括词法分析、语法分析、语义分析以及代码生成 4 个阶段。其中,词法分析阶段是将源代码转换为索引流;语法分析阶段是将词法分析后形成的索引流中的索引组合成符合语法规范的语法节点,形成一棵基本的抽象语法树(Abstract Syntax Tree,AST);语义分析阶段依据语言规范对 AST 进行严格语法检查,还需要为后续的代码生成阶段准备各种数据;代码生成阶段将 AST 转换为字节码。中间指令集是代码生成阶段中的一种中间指令,中间指令集格式经各种技术优化后,可生成最终的优化指令码。部分中间指令集如表 1所示。
表 1 中间指令集
针对通用语言规范限定要求,编译器在处理字面量时需按照值大小确定类型,例如,在short 类型表示范围内,则按 short 类型处理,在超出 short 类型表示范围时,则按 int 类型处理;编译器在处理操作符表达式时须做类型提升,运算符对应的表达式类型是其操作数提升后的类型,只能是 short 类型或 int 类型;编译器在生成栈和局部变量操作、类型转换、操作符表达式、方法调动返回等中间指令集的过程中,boolean类型、byte 类型、short 类型及引用类型的局部变量编译后占用 1 个索引位置,int 类型编译后则占用 2 个索引位置。
2.3 常量池组件
中间指令集通过压缩转换,生成目标指令并以可执行二进制文件的格式存储。可执行二进制文件中的常量池组件,将每种引用类型放在一起形成一个子常量池,具体包括:(1)将所有的类引用类型放在一起形成类子常量池;(2)将所有的静态方法引用类型放在一起形成静态方法子常量池;(3)将所有的虚方法引用类型放在一起形成虚方法子常量池;(4)将所有的 super 方法引用类型放在一起形成 super 方法子常量池;(5)将所有的静态域引用类型放在一起形成静态域子常量池;(6)将所有的实例域引用类型放在一起形成实例域子常量池。通过上述过程,常量池形成 6 个子常量池,包括:(1)类引用;(2)静态方法引用;(3)虚方法引用;(4)super 方法引用;(5)静态域引用;(6)实例域引用。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论