Изменения

Простой FTL для флешек

2209 байтов добавлено, 22:40, 21 мая 2013
м
Нет описания правки
* Виртуальные адреса кластеров отображаются на физические, кластер может находиться в любом месте флешки.
* Данные отображения каждого кластера содержат его виртуальный адрес, номер версии, магическое число (magic) и контрольную сумму, что вместе составляет 16 байт. При перезаписи кластера старая версия не удаляется — просто записывается новая с увеличенным на 1 номером версии.
* Карты отображения перемешиваются с данными. Информация об отображении 1 кластера занимает 16 байт, следовательно, в 1 сектор (512 байт) входит информация о об N=32 кластерах. Совокупность 32 кластеров с данными и 1 индексного сектора называется сегментом.
* Вся флешка состоит из сегментов. То есть, на ней чередуются последовательности по 128 кб данных и 512 байт «индекса». Следовательно, индекс занимает 1/256 всей памяти, что составляет 4 Мб на 1 Гб.
=== Монтирование ===
При монтировании с диска читается весь индекс, то есть каждый 257-ой сектор, и все карты (физический кластер -> виртуальный кластер; виртуальный кластер -> {физический кластер, версия}) сохраняются в оперативной памяти. Произвольное чтение с флеш-памяти, будь то FTL’нутая USB-флешка или голый MTD (Memory Type Device), быстрое, следовательно, монтирование тоже происходит быстро. Минус в том, что индекс нужно держать в оперативной памяти, а занимает он примерно 3 мб на каждый 1 гб памятиданных, а это что составляет уже 192 мб на 64-гигабайтную флешку, что - довольно много. То есть, применение ограничивается размером потребляемой оперативной памяти — всё как в SSD.
Для больших устройств можно увеличить размер кластера, скажем, до 64 кб — тогда индекс будет занимать в 16 раз меньше — всего 12 мб на 64 гб флешку. При этом, однако, потребуется ФС с таким же размером блока, а в Linux, кроме VFAT, подобных, по сути, нет — есть только ext4 с bigalloc’ом, который до сих пор глючит. Хотя, в принципе, для флешек FAT вполне подходит.
=== Запись ===
Центральная идея всего SFTL - превращение случайной записи в последовательную. Условно говоря, драйвер должен использовать флешку как кольцевой буфер, всё время записывая новые версии кластеров в следующий свободный сегмент. При записи новой версии кластер, содержащий предыдущую, помечается как свободный. Со временем это, очевидно, приводит к фрагментации свободного пространства, и в какой-то момент при записи может оказаться, что сегментов, свободных целиком, уже нет, хотя свободного места при этом вполне хватает.
Тупейший вариант решения: не обращая внимания на фрагментацию, всегда писать в первый доступный кластер. Производительность записи при этом будет падать приблизительно на количество пропущенных (занятых) кластеров.
Более сложный вариант решения: зарезервировать N-1 сегментов и следить, чтобы кроме зарезервированных всегда был как минимум один свободный сегмент. Резерв нужен для того, чтобы даже в худшем случае дефрагментация удалась. Худший случай - это сборка свободного сегмента из N сегментов, в каждом из которых свободен только 1 кластер. Чтобы вместить данные из этих N сегментов, очевидно, нужен N-1 свободный сегмент. В идеале запись должна происходит в связное свободное место. == Дополнительная функциональностьидея: сжатие ==