Введение
Файловая система
Yaffs (Yet Another Flash File System) — файловая система, разработанная и написанная Чарльзом Мэннингом для компании Aleph One. Yaffs1 была первой версией этой файловой системы и предназначалась для тогдашних NAND-чипов с размером страницы 512 байт (+ 16 байт резервной (OOB; Out Of Band) области). Работа началась в 2002 году, и первый релиз состоялся позднее в том же году. Первоначальную разработку спонсировали Toby Churchill Ltd и Brightstar Engineering. Эти более старые чипы обычно допускают 2 или 3 цикла записи на страницу. YAFFS использует это преимущество: "грязные" страницы помечаются записью в определенный байт резервной области. Новые NAND-флеш-чипы имеют страницы большего размера — сначала 2K страницы (+ 64 байта OOB), затем 4K — и более строгие требования к записи. Каждая страница в блоке стирания (128 килобайт) должна быть записана последовательно, и каждая страница может быть записана только один раз. Разработка системы хранения, обеспечивающей принцип "запись один раз" ("write once property"), имеет ряд преимуществ. YAFFS2 была разработана для поддержки этих новых чипов. Она базировалась на исходном коде YAFFS1, при этом основным отличием было то, что внутренние структуры не были жестко привязаны к размеру 512 байт, и номер последовательности блока помещался на каждую записанную страницу. Таким образом, старые страницы можно логически перезаписывать, не нарушая принцип "запись один раз". Релиз состоялся в конце 2003 года. YAFFS — это надежная файловая система с журнальной структурой, для которой целостность данных является приоритетом. Вторичная цель YAFFS — высокая производительность. Как правило, YAFFS превосходит большинство альтернативных решений. Она также разработана с учетом переносимости и используется в Linux, WinCE, pSOS, RTEMS, eCos, ThreadX и различных специализированных ОС. Вариант 'YAFFS/Direct' применяется в ситуациях, когда операционная система отсутствует, используются встраиваемые ОС или загрузчики: он имеет то же ядро файловой системы, но более простой интерфейс как с кодом верхнего, так и нижнего уровня, а также с аппаратным обеспечением NAND flash. Код YAFFS лицензируется как под GPL, так и по коммерческим лицензиям, доступным в Aleph One. Yaffs блокируется на уровне раздела, позволяя одновременно выполнять запись только одному потоку.
ЯФФС1
Для инициализации файловой системы YAFFS не требуется специальной процедуры, кроме простого стирания флэш-памяти. При обнаружении неисправного блока YAFFS использует схему, аналогичную применяемой в смарт-носителях, отмечая пятый байт резервной области блока. Блоки, помеченные таким образом, с этого момента остаются невыделенными. Для записи данных файла YAFFS сначала записывает целую страницу (называемую чанком в терминологии YAFFS), содержащую метаданные файла, такие как временные метки, имя и путь. Каждому новому файлу присваивается уникальный идентификатор объекта; каждый чанк данных в файле содержит этот уникальный идентификатор объекта в резервной области. YAFFS поддерживает древовидную структуру в оперативной памяти, отражающую физическое расположение этих чанков. Когда чанк становится недействительным (файл удален или его части перезаписаны), YAFFS помечает определенный байт в резервной области чанка как "грязный". Когда весь блок (32 страницы) помечен как "грязный", YAFFS может стереть блок и освободить место. Когда свободное место в файловой системе ограничено, YAFFS объединяет группу хороших страниц в новый блок. Затем YAFFS возвращает место, занимаемое "грязными" страницами в каждом из исходных блоков. При монтировании NAND-устройства YAFFS должна просканировать резервную область каждого блока, чтобы проверить наличие действительных данных. На основе этой информации восстанавливается древовидная структура данных, хранящаяся в оперативной памяти.
ЯФФС2
YAFFS2 по концепции схож с YAFFS1 и использует значительную часть того же кода; кодовая база YAFFS2 поддерживает форматы данных YAFFS1 благодаря обратной совместимости. Основное отличие заключается в том, что YAFFS2 приходится прибегать к сложным манипуляциям, чтобы соответствовать требованию "запись один раз" для современной NAND-флеш-памяти. YAFFS2 присваивает каждому вновь записанному блоку последовательный номер, который монотонно возрастает. Последовательность чанков может быть определена по номеру последовательности блока и смещению чанка внутри блока. Таким образом, когда YAFFS2 сканирует флеш-память и обнаруживает несколько чанков с одинаковыми ObjectIDs и ChunkNumbers, он может выбрать, какой из них использовать, выбирая чанк с наибольшим последовательным номером. Для повышения эффективности YAFFS2 также вводит понятие сокращенных заголовков (shrink headers). Например, при изменении размера файла на меньший, YAFFS1 помечает все затронутые чанки как "грязные". YAFFS2 не может этого делать из-за правила "запись один раз". Вместо этого YAFFS2 записывает "shrink header", который указывает, что определенное количество страниц до этой точки являются недействительными. Это позволяет YAFFS2 восстановить конечное состояние файловой системы при перезагрузке системы. YAFFS2 использует более абстрактное определение NAND-флеш-памяти, что позволяет использовать его с более широким спектром флеш-модулей с различной геометрией, правилами обработки дефектных блоков и т.д. Позже в YAFFS2 была добавлена поддержка контрольных точек (checkpointing), которая обходит обычное сканирование при монтировании, обеспечивая очень быстрое время монтирования. Производительность может варьироваться, но сообщалось о времени монтирования в 3 секунды для 2 ГБ.