Напилил
тулзу для тестирования SD-карт.
Что умеет:- Инитить карты при помощи волшебного Force Erase, который в некоторых случаях дает картам вторую молодость. (На всякий случай сообщу, что ни в одном USB картридере этот фокус проделать нельзя, хотя бы потому, что SCSI не умеет таких команд.)
- Показывать инфу по регистрам карты.
- Пароль для лока карт пока захардкодан, в дальнейшем будет доступен для ввода. Если нужно разлочить имеющуюся карту с паролем, его можно поменять в сорцах.
Что еще будет уметь:- Показывать самую подробную инфу про карту, какую только можно из нее вытянуть.
- TBD.
Про Force Erase.Эта процедура выполняется картой, если юзер не знает установленного на карту пароля, и хочет стереть на карте этот пароль (вместе со всей информацией).
В зависимости от контроллера внутри карты, Force Erase не просто чистит LUT-ы и стирает NAND-чипы, но и может производить тестирование бэд-блоков и их заметание под ковер. Часто это приводит к увеличению скорости чтения/записи карты после длительного предварительного использования. Также, помогает раздуплить не очень живую карту, которая решила, что ей пора на покой.
На скриншотах - карта до стирания и после, скорость чтения.
Спойлер: на самом деле, изношенный NAND все равно забывает инфу быстрее, чем неизношенный. И полным стиранием его не восстановить. Однако, см. ниже про "Trim".
Про Sectors Erase.Функция аналогична Force Erase, но для
незалоченных карт. Освобождает блоки для использования в подменном фонде.
Про "Trim".Термин "Trim" стал известен после появления SSD.
Немного теории. Между пользовательскими LBA и "сырыми" блоками NAND-а существует таблица трансляции (LUT). Когда юзер пишет в LBA, допустим, с номером 0, физически запись происходит в первый блок NAND-а, указанный в LUT-e, как свободный. Повторная запись в LBA 0 будет произведена в
совершенно другой блок NAND-а, а предыдущий переместится в подменный фонд и будет ждать своей очереди. Данные от предыдущей записи будут лежать в нем, пока не перезапишутся, когда до него дойдет очередь. Данный метод применяется для уменьшения износа отдельных блоков и называется Wear Levelling. После Force и Sector Erase все стертые LBA помечаются в LUT-е свободными. При чтении из этих LBA возращаются 00 или FF, а физического чтения блоков NAND-а даже не происходит. До первой записи в эти LBA, это важно. Алгоритмы Wear Levelling обычно используют все доступные неиспользуемые блоки LUT, а значит, нагрузка распределяется более равномерно.
На SSD при использовании команды trim LBA освобождаются автоматически после стирания файла. На SD этого не происходит, хотя
могло бы. В картридерах это скорее всего невозможно: я думаю, что в той версии SCSI, что ходит вместе с классом Mass Storage, этой команды нет. (Но это неточно.) В Embedded OS-ях, работающих с SD, это вполне реализуемо драйвером ОС-и, но опять же, я думаю, что не реализовано. (И опять же, это неточно.)
Какая практическая польза от всего вышеописанного: ну, например, повысить износоустойчивость карты в отдельном девайсе. Например, берем карту на 2ГБ, она работает 1 год и дохнет от износа. Берем карту на 16ГБ, пишем на нее
тот же образ 2ГБ, что работал на предыдущей карте, и она работает 8 лет. При одном условии: перед записью образа 2ГБ ей сделали de-allocate всех LBA при помощи Force/Sector Erase. И только в этом случае.
Спойлер: на китайских
поддельных нонеймовых сдшках почти всегда не работает Force/Sector Erase. У всех имеющихся у автора подобных экспонатов MID=00. Пока что это довольно удобный признак их определения. У этих дефектов подменный фонд примерно равен разнице между размером нанда (степень двойки) и размером LBA, и обычно составляет 6-8%. Но пользоваться такими флэшами в народном хозяйстве можно только тем, кому важна только запись на карту, а чтение не важно. Потому что эта подпихня либо косячит с лутом, либо читает изношенные блоки без коррекции (да-да, с плавающими битами).
Что может пойти не так.Некоторые старые карты (у автора имеется такая на 2ГБ) имели ошибку в своем фирмваре, из-за которой Force Erase стирал инфу и разлочивал карту, но забывал стереть регистр пароля. Такая карта после разлочивания работает нормально, но только, пока на нее подают питание. При следующем включении она снова залочивается, ее снова можно стереть и так по кругу. Если попадется такая, надо просто снять пароль утилитой.