Простой слой перевода вспышки, который повторяет трассировку, содержащую блочные адреса и операцию чтения/записи.
5188 READ
5208 READ
6164 READ
5236 READ
5276 READ
1024 WRITE
16 WRITE
16384 WRITE
Если операция не указана (чтение/запись), то по умолчанию операция записи.
primary_logical_block recovery_logical_block degree_of_loss
Пример - для ext4 основным блоком может быть iNode, который записан на диске. Вторичный блок будет журналом, который записан, в котором первичный блок восстанавливается в случае сбоя.
Есть три типа слоев FTL, которые можно смоделировать:
Уровень страницы FTL
Уровень страницы FTL отображает логическую страницу непосредственно на физическую страницу. Если происходит перезапись по логическому номеру страницы, более старая физическая страница отмечена недействительной. Новая физическая страница предоставляется на номере логической страницы. LTOPMAP обновляется, чтобы отразить обновленную страницу. Blockstat старого и нового блока обновляется, чтобы отразить новое недопустимое количество страниц.
Блок Уровень FTL
Весь логический блок отображается с физическим блоком. Если происходит перезапись логического номера страницы, весь блок недействителен, все записи в более старом блоке копируются в новый блок. Карта содержит только логическое в физическое картирование блоков.
Гибридный уровень FTL
Храните значения LBN для PBN, но на перезаписи по логическому номеру страницы новый физический блок смотрит в следующем бесплатном входе того же места блока. Сопоставление логического в физическом номере блока хранится в каждом блоке. Недействительность всего блока выполняется, когда нет места, чтобы написать какие -либо дополнительные блоки на блоке.
getNextPhysicalPage()map(lbn, pbn)getFreeBlock()getTargetBlock()GC(X)Код следует за жадной политикой сбора мусора.
Сбор мусора выполняется по умолчанию после того, как в файловой системе использовалась GC_COUNT% физических блоков. Сбор мусора включает в себя выбор блока, содержащий наибольшее количество недействительных страниц, выбор блока назначения / бесплатный блок бассейна, передавая действительные страницы из исходного блока в блок назначения. Физические страницы в исходном блоке теперь можно повторно использовать во время картирования.
Invoke GC
Choose Victim block (blk.gc_count < curr_gc_count)
if not found; exit
Choose empty block (blk.gc_count < curr_gc_count)
if not found; check for Merge Block (explained below)
Move valid from Victim -> Empty
Mark Empty -> Valid
Mark Victim -> Empty
Update GC count of both blocks to curr_gc_count.
Continue.
Блок слияния - это блок, который не является полностью пустым, но имеет место, чтобы держать все записи грязного блока. В случае, если пустой блок не найден, мы выбираем блок слияния, аннулируют все его Entires, а затем переписываем значения обратно в блок вместе со всеми записями грязного блока .
./ftl.py 1 8 512 128 traces/page_GC and traces/block_GC
Это должно создать устройство из 6 блоков, 8 страниц и запустить след, в котором в конечном итоге будет 11-17 блоков в номере блока 0.
./ftl.py 2 4 512 128 traces/block_GC
./ftl.py 1 8 512 128 traces/block_map