Память в 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 может передавать управление ресурсу по многим причинам: после перезагрузки, после перестановки часов, после хотсинка, при поиске, при срабатывании аларма…
- Таким образом, исполняемый файл PalmOS - это не пассивно лежащий блок памяти, а активная база, которая реагирует на множество событий.
- Для того чтобы быть активным в PalmOS, необязательно быть программой. Примером тому могут быть хаки , DA и библиотеки. Очевидно, что для того, чтобы хак вызывался при каждом вызове перехваченного им системного вызова, он должен находится в основной памяти.
Внешняя память может располагаться где угодно - на внешней карточке, или (как у UX-50) в оперативной памяти. Но поскольку VFS не имеет ни малейшего представления о том, где располагается конкретный диск, то все данные с него будут копироваться в память баз для запуска оттуда. С другой стороны от внешней памяти в основной памяти может быть плюс - на такой диск можно копировать обычные файлы, которые невозможно скинуть в память баз.
Таким образом, существующие принципы приложений в PalmOS привели к тому что:
- Программы могут запускаться только из памяти баз.
- Для запуска программы с внешней карты ее нужно скопировать в память баз
Интересным вариантом работы с программами являются запаковщики. Эти программы пакуют исполняемый ресурс 'code' 1 и подменяют его на свой код-заглушку. При запуске заглушка распаковывает действительный код и исполняет его. При таком запуске исчезает принцип XIP, поскольку код программы оказывается скопированным в кучу или памят баз, но зато экономится место для остальных баз.
Как происходит запуск програм с карточки?
- В PalmOS 4.x существовал другой способ, так называемые RAM expanders: эти программы эмулируют наличие баз из указанного каталога в памяти баз. Но эти базы доступны только на чтение и работают только под 4 осью. При этом способе нет длительного копирования всего в память баз, копируется только необходимый минимум. Так работают PiDirect 2, AutoCard, MsMount.
А как все это реализовано в PocketPC? Там отсутствует память баз, но всегда существует диск внешней памяти в ОЗУ (storage). Тем самым
- Не существует принципиальных различий между запуском из storage и с внешней карты
- Программа почти _всегда_ копируется в кучу, даже если запускается из storage
- Единственные программы, которые могут исполняться с места - это программы в ПЗУ. Эти программы располагаются специальным образом, готовые к запуску, так что не происходит копирования исполняемого кода в кучу. Но на пользовательские программы это не распространяется.