User Tools

Site Tools


palmmemory

Память в PalmOS используется совсем не так как в десктопах. Это создает некую путаницу при использовании программ, при попытках запустить их с карточки итд.

Память в пальме можно разделить по способу использования и по методам доступа

  • Динамическая память, куча (heap, dynamic memory). Этот вид памяти самый незаметный. Он используется для непосредственной работы с данными из запущенных программ, она аналогична оперативной памяти на десктопах. Раньше памяти этого вида было совсем мало (250Кб), сейчас размер такой память доходит до 12Мб. Первыми размер кучи ощутили владельцы Sony NX: из 16Мб памяти в куче было 4Мб, из-за этого под программы оставалось чуть больше 11Мб. Работа с такой памятью из программы производится достаточно стандартным API: выделить блок, освободить блок, зафиксировать блок на месте…
  • Память баз (data storage). В этой памяти хранятся базы. Эта память напоминает внешний диск, но все файлы в нем должны быть в специфическом пальмовом формате, разделенные на отдельные записи. Доступ к базам производится через функции DataManager, но доступ к записям базы аналогичен доступу к блоку в куче. Единственное отличие - запись в эти блоки производится через особую функцию, поскольку этот участок памяти может быть защищен от записи напрямую.
  • Внешняя память (Virtual File System, VFS). Эта память представляет из внешний диск в десктопном смысле этого слова, с каталогами и произвольными файлами. API доступа к такому диску напоминает классические stdio API.

Первые два вида памяти обязаны лежать в ОЗУ и быть непосредственно адресуемы процессором. Такая архитектура (а только эти два вида памяти и были доступны до появления пальмов с карточками) породила очень специфические исполняемые файлы. Что такое исполняемый файл с точки зрения PalmOS?

  • Во-первых это обычная база ресурсов. База ресурсов отличается от просто базы тем, что у каждой записи есть 4-х буквенный код типа и индекс.
  • У исполняемой базы есть специфические ресурсы, которые используются для ее запуска
  • При запуске приложения PalmOS фиксирует в памяти ресурс типа 'code' номер 1 и передает на него управление. Поскольку ресурс уже находится в памяти, то это почти что все, что нужно PalmOS для запуска программы. Такой запуск называется зауск на месте (XIP, Execution In Place)
  • Кроме обычного запуска, PalmOS может передавать управление ресурсу по многим причинам: после перезагрузки, после перестановки часов, после хотсинка, при поиске, при срабатывании аларма…
  • Таким образом, исполняемый файл PalmOS - это не пассивно лежащий блок памяти, а активная база, которая реагирует на множество событий.
  • Для того чтобы быть активным в PalmOS, необязательно быть программой. Примером тому могут быть хаки , DA и библиотеки. Очевидно, что для того, чтобы хак вызывался при каждом вызове перехваченного им системного вызова, он должен находится в основной памяти.

Внешняя память может располагаться где угодно - на внешней карточке, или (как у UX-50) в оперативной памяти. Но поскольку VFS не имеет ни малейшего представления о том, где располагается конкретный диск, то все данные с него будут копироваться в память баз для запуска оттуда. С другой стороны от внешней памяти в основной памяти может быть плюс - на такой диск можно копировать обычные файлы, которые невозможно скинуть в память баз.

Таким образом, существующие принципы приложений в PalmOS привели к тому что:

  • Программы могут запускаться только из памяти баз.
  • Для запуска программы с внешней карты ее нужно скопировать в память баз
  • Программы, которым нужно реагировать на внешние события, посылаемые PalmOS нужно располагаться только в памяти баз, иначе они не получат оповещений. Ярлыки (PowerRun, TealAlias) частично спасают ситуацию, но не всегда.

Интересным вариантом работы с программами являются запаковщики. Эти программы пакуют исполняемый ресурс 'code' 1 и подменяют его на свой код-заглушку. При запуске заглушка распаковывает действительный код и исполняет его. При таком запуске исчезает принцип XIP, поскольку код программы оказывается скопированным в кучу или памят баз, но зато экономится место для остальных баз.

Как происходит запуск програм с карточки?

  • Самый простой способ - это копирование программы вместе со вспомогательными базами. Так поступает PalmOS, так поступает PowerRun, TealAlias, ZLauncher и LauncherX.
  • В PalmOS 4.x существовал другой способ, так называемые RAM expanders: эти программы эмулируют наличие баз из указанного каталога в памяти баз. Но эти базы доступны только на чтение и работают только под 4 осью. При этом способе нет длительного копирования всего в память баз, копируется только необходимый минимум. Так работают PiDirect 2, AutoCard, MsMount.

А как все это реализовано в PocketPC? Там отсутствует память баз, но всегда существует диск внешней памяти в ОЗУ (storage). Тем самым

  • Не существует принципиальных различий между запуском из storage и с внешней карты
  • Программа почти _всегда_ копируется в кучу, даже если запускается из storage
  • Единственные программы, которые могут исполняться с места - это программы в ПЗУ. Эти программы располагаются специальным образом, готовые к запуску, так что не происходит копирования исполняемого кода в кучу. Но на пользовательские программы это не распространяется.
palmmemory.txt · Last modified: 2003/10/17 15:02 by 127.0.0.1