Новые устройства от Pa1mOne предложили новую концепцию использования памяти. Популярные статьи на новостных сайтах породили целую мифологию вокруг новых устройств. Настоящая статья пытается объяснить как TT5 и Treo 650 в действительности используют память.
Напомню организацию памяти на остальных устройствах с PalmOS.
Вся память находится в адресном пространстве и делится на две области: динамическая куча и хранилище. В хранилище хранятся базы. Базы состоят из отдельных записей, каждая из которых хранится в отдельном блоке памяти. Динамическая куча используется для рабоих данных запущенной программы. Программы тоже хранятся как базы. Принцип организации программы позволяет не копировать исполняемый код в динамическую кучу, а исполнять его из записи в базе. Такое исполнение называется XIP, eXecution in place, стоит учесть что у термина есть и другое значение.
Для программиста работа с записью и временным блоком памяти совершенно аналогична, это позволяет считывать данные непосредственно из записи.
Такая организация очень экономна и позволяет использовать минимум памяти. Так, модель Clie NX-60 имеет 4Mb динамической кучи и 12Mb для хранилища.
Эта память отличается от флеш-памяти на MMC / SD / CF / MS карточке, которая выглядит для устройства как диск с файловой системой FAT. Память на карточке несколько “чужеродна” для PalmOS, в частности программы на карте не могут выставлять алармы и вызывать свои кондуиты при хотсинке. Исполнить программу с карты невозможно, ее нужно предварительно скопировать в хранилище и только после этого запустить.
Даже сейчас оперативная память дорога и требует сравнительно много энергии. Современные технологии предлагают дешевую альтернативу в виде NAND флеш-памяти. Эта память аналогична используемым в картах памяти, но в отличии от них встаивается напрямую в устройство и может использовать более быструю шину для обмена данными. NAND-память сохраняет свое состояние после отключения питания и стоит значительно дешевле.
У NAND-памяти есть ряд существенных ограничений. Первое ограничение - это то, что она не может напрямую использоваться процессором. Таким образом программа, записанная во флеш не может в принципе исполняться на месте ( это второй смысл термина XIP - память, которая адресуется процессором для исполнения), данные из флеша не могут быть извлечены напрямую, и должен существовать буфер, в который будут копироваться данные и исполняемый код.
Второе ограничение - невозможность изменения одного байта. Области могут быть перезаписаны блоками по 512 байт. (На самом деле все запутаннее - можно изменять битики с 1 на 0, но не больше 10 раз на блок. Маловероятно, что изменения данных будут именно такими).
В новых моделях есть оба вида памяти - и динамическая (DRAM) и NAND-флеш.
NAND-флеш делится на
Оперативная память резделяется на
То что раньше называлось ROM, в котором хранилась PalmOS и встроенные программы, теперь хранится во флеше. Образ ROM распаковывается из флеша при ресетах и копируется в свою область в памяти. Именно это и обуславливает долгое время загрузки новых устройств.
Хранилище баз теперь хранится во флеше. Но поскольку к нему нельзя доступиться то запрашиваемые записи баз копируется в кэш и предоставляются программам для чтения и модификации. При закрытии базы и при выключении устройства модифицированные записи записываются обратно во флеш.
Файловое пространство представляет из себя обычный RAM-диск и не отличается от SD-карты по способу работы.
Стоит проследить запуск программы из файлового пространства. Сначала программа копируется в хранилище (то есть копируется в кэш и оттуда в область хранилища, удаляясь из кэша). Из хранилища она копируется обратно в кэш и запускается. После запуска программа удаляется и из кэша и из хранилища. Надеюсь, что PalmOne догадалась соптимизировать этот процесс.
Организация хранилища в NAND-флеше называется NVFS (Non-volatile File System).
“Олдовые” пользователи пальм помнят, что во времена PalmOS 4 существовали RAM Expanders, такие как AutoCard, PiDirect и MsMount. Эти программы эмулировали псевдо-файлы, содержимое которых находилось на карточке. NVFS является хаком над PalmOS, который точно так же эмулирует отсутствующие в оперативной памяти файлы.
Рассмотрим работу классической программы MemoPad. Перечислим операции с базами, выполняемые при работе
Учтите, что новые программы хранят данные в своем формате и одновременно поддерживают базы в старом формате. То есть на каждое обновление новой записи добавляется обновление старой.
Вспомним классические пальмы. При нажатии на кнопку питания происходило следующее:
Отключение питания приводило к потере данных из памяти, в том числе и из хранилища и вызывало hard reset.
Новые устройства декларируют сохранность данных. Как показали опыты, TT5 в выключенном состоянии дольше держит заряд. Но это вовсе не означает, что устройству не нужно подпитывать DRAM. Почему?
Потому что программы могут запускаться только из оперативной памяти. А что там у нас лежало перед выключением? Можем ли мы это стереть?
Таким образом динамическая память требует подпитки даже на TT5 для сохранения рабочего состояния устройства. С другой стороны потеря питания приводит нас не к hard reset, а к обычному reset с сохранением всех данных в хранилище.
В каком формате содержатся данные в хранилище? Хранилище - это еще один VFS диск с файловой системой FAT. В каталоге /PALM_DM хранятся базы, каждая в своем файле. В отличии от обычого VFS-диска файл - это не образ .prc файла, это структура, хранящая указатели на отдельные ресурсы и ресурсы, выровненные на 512-байтовую границу.
Такая структура была выбрана для эффективной работы с ресурсами. При использовании стандартного “плоского” prc файла для увеличения ресурса в середине пришлось бы сдвигать все последующие записи в файле.
Технические специалисты задают вопрос - а почему так “неграмотно” организовано хранение данных? почему не использовали существующие файловые системы для флеша: JFFS или YAFFS? На мой взгляд это обусловлено следующими факторами.
Представим себе, что разработчики упаковали несколько записей в один блок. Чем это чревато?
Скорее всего PalmOne частично реализует хранение нескольких записей в одном блоке, но только для редкоизменяющихся баз. Разработчик должен будет явно указывать режим сохранения новых записей.