Недавно искал материалы по данной теме (придется делать подобное устройство). Ключевые слова для поиска Flash Translation Layer, wear-leveling. Идея вкратце: http://www.cypress.com/design/DK10050
Используются не все доступные блоки, часть находится в резерве.
Существует таблица переадресации, какому логическому блоку соответствует какой физический блок. При чтении - сначала читается данная таблица, затем уже нужный блок. Для каждого физического блока ведется счетчик стираний. Для следующей записи выбирается свободный блок с наименьшим счетчиком.
В свободное время производится стирание ненужных использованных блоков, а также анализ счетчиков использования - данные из наиболее редко стираемых блоков переписываются в наиболее часто стираемые.
В качестве примера можно посмотреть документацию на Cypress CY3686 Development Kit и на файловую систему от SMX:
http://www.smxrtos.com/doc/smxffs.pdf