• Javacard 解释器怎样在API类库中找到源文件调用的类、方法或者静态域?


    申明:本篇非本人原创,是在阅读各种论文文献之后,对论文文献的一种梳理。

    主要参考文献为:

     ----------------------------------------------------------------我是分割线---------------------------------------------------------------------------

    什么是Javacard API?

    Javacard API也被称为API类库或类库,按照包、类和接口/方法的层次结构提供了一系列标准的库函数,为Javacard 应用程序的开发人员提供了标准的接口。

    通过这个接口就可以请求系统服务和系统资源,应用开发者不需要了解复杂的智能卡系统就可以开发出智能卡applet了。

    这样的API设计也体现了分层思想。

    Javacard API 是怎样跟解释器集成的呢?

    上诉问题可以分解为三个问题:

    1、Javacard 解释器怎样在API库类中找到源文件调用的类、方法或者静态域?

    2、Javacard 解释器怎样处理找到的类、方法或者静态域?

    3、在API中是如何实现具体的类、方法和静态域?

    本篇文章首先解决第一个问题。

    概括地来说:

    在Java智能卡中,无论是类库还是应用程序applet,转换器已经为所有的类和实例化方法都分配了一个值,被称为token值。

    Applet运行时,解释器根据token值作为索引,利用CAP文件各组件中具体的包信息、类信息和方法信息,完成对类、方法和域引用的解析。这就是token动态链接原理。这个问题就是Applet对于调用外包的具体解析过程。

    下面详细讲解这个过程。

    Applet对于调用外包的解析设计到两个文件:CAP文件和Export文件。

    Export文件主要描述了Applet和引用包之间的关联关系,包含了当前类所在的包完整的公有方法的连接信息,并且为当前的类、方法和域都分配了不同的token值。

    CAP文件是通过卡外虚拟机convert将Java编译生成的.class文件转换为更为紧凑集中的.cap文件。在卡内,Javacard虚拟机解释器对这个CAP文件进一步解析。

    根据最新的sun公司的Javacard规范,一个CAP包含12个组件,它们分别是:

    在Applet调用外包的解析过程中,主要涉及到Applet自身包的常量池组件(ConstantPool.cap)和导入组件(Import.cap)和该Applet所调用外包的导出组件(Export.cap)、类组件(Class.cap)和方法组件(Method.cap)。

    那具体又是怎样通过这些组件在API类库中找到源文件调用的类、方法和域的呢?

    第一步,

      解释器从常量池组件(COMPONENT_ConstantPool)出发,在常量池组件中获取该方法所在包的索引、类的token值和方法的token值。

    第二步,

      根据刚才获得的方法所在包的索引,在Applet所在包的导入组件(COMPONENT_Import)获取包号。根据包号,解释器就可以跳转到该方法所在的类所属的包。

    第三步,

      这个时候解释器已经跳转到外部的包。根据第一步获得的方法所在类的token值,在导入包的导出组件(COMPONENT_Export)中提取该方法所在的类在类组件(COMPONENT_Class)的偏移量。

    第四步,

      根据上一步获得的方法所在的类在类组件(COMPONENT_Class)中的偏移量,在类组件中找到这个类的类信息。并根据第一步获得的方法的token值,在类组件中获取实例化方法在方法组件(COMPONENT_Method)中的偏移量。

    第五步,

      根据上一步获取的实例化方法在方法组件(COMPONENT_Method)中的偏移量找到具体的方法。至此,解释器就获得了外包实例化方法的地址,紧接着将继续执行该方法的字节码,进而完成一次对外包实例化方法的调用。

    上面的步骤通过图表来表示如下:

  • 相关阅读:
    阿里云高级技术专家周晶:基于融合与协同的边缘云原生体系实践
    Spring Boot Serverless 实战系列“架构篇” 首发 | 光速入门函数计算
    基于 EMR OLAP 的开源实时数仓解决方案之 ClickHouse 事务实现
    【ClickHouse 技术系列】 在 ClickHouse 中处理实时更新
    LeetCode_Two Sum
    LeetCode_ Remove Element
    LeetCode_Same Tree
    LeetCode_Symmetric Tree
    LeetCode_Path Sum
    LeetCode_Merge Sorted Array
  • 原文地址:https://www.cnblogs.com/cuglkb/p/5711622.html
Copyright © 2020-2023  润新知