gpt4 book ai didi

transient 内存中的 Java Card 对象实例

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:19:53 25 4
gpt4 key购买 nike

我正在开发一个 Java Card 小程序(用于 Java Card 2.2.1),它需要一些临时对象来处理 APDU 命令。我对正确的内存管理有疑问。我花了很多时间研究这些问题,但我没有在某些 java 卡 API 上找到任何说明或好的示例代码。我有两个主要问题:

  1. 如何创建临时对象数组(我指的是 RAM 中的自定义对象,而不是 EEPROM 中的自定义对象)。我读过有关 makeTransientObjectArray 的内容,但它只返回对象类型的数组。例如,我知道如何使用 makeTransientByteArray 创建 transient 字节数组,但我的问题是关于对象实例的 transient 数组。或者可以用 java 语言将字节数组转换为实例而不进行序列化?

  2. 我只在传入 APDU 命令的过程中需要这个临时对象数组,不需要保留为我分配的内存。分配此临时内存的最佳位置在哪里(在 installselectprocess 等函数内)?

Edited for more explanations:

  1. 正如我已经从文档中了解到的,任何对象实例都存储在 EEPROM 中。假设我知道我的过程算法中需要的最大对象数(比如 100)。我在 install 方法中生成了 100 个 MyClass 实例。 MyClass 的每个实例包含 3 个字段:field1 是一个短类型,field2 是一个字节,field3 是一个短类型。所有这 100 个实例将通过 APDU 命令的输入来填充。如果对于每个命令,我都在 EEPROM 上填充对象,这不是一个好的做法,因为它们是临时数据。 EEPROM 也有最大写入次数。一种方法可能是,对于每个实例,我使用 makeTransientByteArraymakeTransientShortArray 为每个对象分配 5 个字节。但是正如我从文档中读到的那样,它按集群分配内存(32 字节 - 不确定大小),这是无效的。那么在这种情况下我必须做什么?

  2. 我的意思是如何处理瞬时内存。如果在安装函数中分配临时内存,其他小程序将无法使用。如果 applet 是卡上唯一的一个 applet,最好在 install 函数中分配所有临时内存。我想知道适用于所有条件(单个小程序设备或多小程序设备)的通用有效方法。我也不确定,如果在 install 中分配了瞬时内存,则只要将卡插入读卡器,进程函数中就可以使用。

最佳答案

不幸的是,您尝试做的事情在 Java Card 的经典规范中是不可能的。对象实例总是存储在 EEPROM 中,正如您自己已经注意到的那样。所以你必须解决这个问题。

Java 是一种相对高级的语言,其中对象总是存储在一 block 特定的内存中。现在他们已经将这种类型的内存更改为 Java Card 的持久内存。然而,这将需要对语言进行彻底的重新设计,以允许在一种或另一种类型的内存中构造对象。如今,JCF 当然可以考虑为此使用注释 - 这仍然非常棘手,但可能是可行的。

同样,也不可能让对象仅通过一种处理方法存在,即使是数组类型也是如此。要实现这一点,您必须拥有附加堆或实时垃圾收集器。管理一个堆和堆栈向彼此增长已经够难了,实时 GC 也不是当前经典实现中存在的东西。我们在这里的环境非常受限。

所以基本上你必须解决平台的限制。


一个好的策略是创建包含瞬时内存或引用现有内存的对象缓存,例如 APDU 缓冲区中的内存。这些对象将在安装或个性化期间创建。然后可以在必要时检索、使用这些对象并将其返回到缓存。为了给您一个想法,请查看 Java 的 ByteBuffer.wrap() 方法,该方法允许您对现有数组的一部分执行缓冲区操作。现在考虑该类型的可重用对象。

另一个合乎逻辑的解决方案是根本不使用 OO 编程。嘿,OO 非常好而且花花公子,但我们在这里谈论的是 RAM 为 8 到 10 KiB 的芯片最大值。会有限制。可以用对象完成的事情通常也可以只用方法来完成(实际上,您可以证明情况确实如此,因为没有对象的 Java 无疑是图灵完备的,但如果您坚持自己的设计,那将无济于事) .


关于您的文字的注释:

  • 不,您不能将字节数组转换为对象实例。一般而言,这将适用于 Java 和 OO 的所有原则。如果可能的话,包括数据封装在内的一切都会被破坏。您当然可以反序列化自己并将结果放入缓存之外的对象中(参见上面的策略)。
  • 内存通常只应在安装或个性化期间分配,或者很可能在发布后使​​用延迟实例化分配一次。
  • 您不需要 100 个 Activity 对象。您只有几个对象需要在某个特定时间“活着”。利用这些信息!
  • 内存分配特定于平台实现。肯定有“集群”规模较小的平台;平台通常会尝试在内存中对齐数据,因此这也取决于系统/芯片的设计。
  • 使用 CLEAR_ON_DESELECT 创建的内存可能可供其他小程序使用。如果他们被选中,那么这个 RAM 就不再需要了。一个聪明的实现会将内存保持在堆的顶部(仍然很棘手,但是嘿)。正如所指出的,这在选择实例后变得可用。 process 方法只会在 小程序被选中后调用(即使是处理初始的 SELECT APDU 本身)。

关于 transient 内存中的 Java Card 对象实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53638931/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com