Экземпляр объекта карты Java в переходной памяти - PullRequest
0 голосов
/ 05 декабря 2018

Я работаю над апплетом Java Card (для Java Card 2.2.1), которому требуются некоторые временные объекты для обработки команд APDU.У меня есть вопросы о правильном управлении памятью.Я потратил много времени на изучение проблем, но нигде не нашел ни разъяснений, ни хороших примеров кодов в некоторых API Java-карт.У меня есть 2 основных вопроса:

  1. Как я могу создать массив временных объектов (я имею в виду пользовательские объекты в оперативной памяти, а не в EEPROM).Я прочитал о makeTransientObjectArray, но он возвращает только массив типа объекта.Я знаю, как создать, например, транзитный байтовый массив, используя makeTransientByteArray, но моя проблема в переходном массиве экземпляров объекта.Или может быть каким-либо образом на языке Java для преобразования байтового массива в экземпляры без сериализации?

  2. Мне нужен этот временный массив объектов только во время процесса входящей команды APDU и не нужно выделять мне выделенную память.Где лучше всего выделить эту временную память (внутри install, select, process, ... функций)?

Отредактировано для более подробных объяснений:

  1. Как я уже прочитал из документации, любой экземпляр объекта хранится в EEPROM.Предположим, что я знаю максимальное количество объектов, которые мне понадобятся в моем алгоритме процесса (скажем, 100).Я генерирую 100 экземпляров MyClass внутри метода установки.Каждый экземпляр MyClass содержит 3 поля: field1 - короткий, field2 - байт и field3 - короткий тип.Все эти 100 экземпляров будут заполнены вводом команды APDU.Если для каждой команды я заполняю объекты в EEPROM, это не очень хорошая практика, потому что они являются временными данными.Также EEPROM имеет максимальное число циклов записи.Подход может состоять в том, что для каждого экземпляра я выделяю 5 байтов для каждого объекта, используя makeTransientByteArray и makeTransientShortArray.Но, как я прочитал из документации, он распределяет память по кластерам (из 32 байтов - не уверен по размеру), что неэффективно.Так что же мне делать в этом сценарии?

  2. Я имею в виду, что делать с временной памятью.Если выделить временную память внутри функции установки, она не будет доступна для других апплетов.Если апплет является единственным апплетом на Карте, рекомендуется распределить всю переходную память в функции install.Я хочу знать общий эффективный метод для всех условий (одно устройство апплета или устройство с несколькими апплетами).Также я не уверен, если временная память, выделенная внутри install, будет доступна внутри функции процесса, когда карта вставлена ​​в кардридер.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

К сожалению, то, что вы пытаетесь сделать, невозможно в классической спецификации Java Card.Экземпляры объектов всегда хранятся в EEPROM, как вы уже заметили.Поэтому вам нужно обойти эту проблему.

Java - это язык высокого уровня, где объекты всегда хранятся в одном конкретном фрагменте памяти.Теперь они изменили этот тип памяти на постоянную память для Java Card.Однако для этого потребуется полная переработка языка, чтобы объекты могли быть построены в том или ином типе памяти.В настоящее время JCF может, конечно, рассмотреть возможность использования аннотаций для этого - это все равно будет чрезвычайно сложно, но возможно выполнимо.

Точно так же невозможно, чтобы объекты работали только через один метод процесса, даже не типы массивов.Для реализации этого вам понадобится либо дополнительная куча, либо сборщик мусора в реальном времени.Достаточно сложно управлять одной кучей и стеком, растущим навстречу друг другу, и GC в реальном времени - это не то, что присутствует в современных классических реализациях.Здесь мы работаем с чрезвычайно ограниченной средой.

Таким образом, в основном вы должны обойти ограничения платформы.


Одна хорошая стратегия для использования - это создать кешобъекты, которые содержат временную память или ссылаются на существующую память , например, память в буфере APDU .Объекты будут созданы во время установки или персонализации.Эти объекты затем могут быть извлечены при необходимости, использованы и возвращены в кэш.Чтобы дать вам представление, взгляните на метод Java ByteBuffer.wrap(), который позволяет выполнять операции с буфером над частью существующего массива.Теперь рассмотрим повторно используемый объект этого типа.

Другое логическое решение - вообще не использовать ОО-программирование.Привет, ОО - все хорошо, но мы говорим о чипах с оперативной памятью от 8 до 10 КиБ здесь максимум .Будут ограничения.То, что можно сделать с объектами, как правило, можно сделать и с помощью только методов (на самом деле, вы можете доказать, что это так, поскольку Java без объектов, несомненно, завершена по Тьюрингу, но это мало утешает, если вы застряли в своем дизайне).


Примечания к вашему тексту:

  • Нет, вы не можете приводить байтовые массивы к экземплярам объекта.Это будет соответствовать всем принципам Java и OO в целом.Все, включая инкапсуляцию данных, будет нарушено, если это будет возможно.Конечно, вы можете десериализовать себя и поместить результат в объект из кеша (см. Стратегии выше).
  • Обычно память должна выделяться только во время установки или персонализации или, возможно, один раз после выдачи с использованием отложенной реализации..
  • Вам не нужно 100 живых объектов.У вас есть только несколько объектов, которые должны быть «живыми» одновременно.Используйте эту информацию!
  • Распределение памяти зависит от реализации платформы.Есть определенно платформы с меньшими размерами кластеров;платформы обычно пытаются и выравнивают данные в памяти, поэтому это также зависит от конструкции системы / чипа.
  • Память, созданная с использованием CLEAR_ON_DESELECT, может быть доступна другим апплетам,Если они выбраны, то эта RAM больше не нужна.Интеллектуальная реализация будет держать эту память поверх кучи (все еще сложно, но эй).Как указано, это становится доступным после выбора экземпляра.Метод process будет вызываться только после апплета (даже для обработки самого исходного SELECT APDU).
0 голосов
/ 06 декабря 2018

Как создать массив временных объектов (я имею в виду пользовательские объекты в оперативной памяти, а не в EEPROM).

Спецификация JavaCard предоставляет метод makeTransientObjectArray(short, byte) для создания массива временных объектов.Это выделит память в ОЗУ, а затем вы сможете сохранить ссылку на ваши объекты в этой памяти.

Object[] aob = JCSystem.makeTransientObjectArray(lengthOfArray, CLEAR_ON_..event);
aob[0] = ((YourClass)new YourClass(param));
aob[1] = ((YourClass)new YourClass(param));
..

Однако вы все еще не можете полностью достичь того, что пытаетесь, потому что объекты были созданы в YourClass может по-прежнему потреблять память из не переходной памяти (EEPROM) или переходной (RAM) в зависимости от их размещения в конструкторе YourClass.Только ссылка на объекты YourClass - это то, что вы храните во временном пространстве ( aob ).

Мне нужен этот временный массив объектов только во время процесса входящей команды APDU и не нужно выделять мне выделенную память.Где лучше всего выделить эту временную память (внутри install, select, process, ... functions)?

Все ресурсы лучше всего распределять методом install().

...