Продолжая нашу последнюю часть, нам нужно оценить валидность нашего простого и наивного слоя флеш-перевода. Давайте сразу же рассмотрим несколько простых тестов. Есть несколько базовых тестов, связанных с NandSim, NandHal, HostComm и SimFramework, которые мы можем увидеть из репозитория кода. Но мы остановимся немного на тестах SimpleFtl.

И снова репозиторий: SsdSim-Part12

Как видите, мы проверяем перевод, проводим некоторые базовые тесты записи-чтения-проверки (даже для невыровненного случая) и даже некоторый бенчмаркинг (который не очень полезен на текущей платформе моделирования). Что не так, так это то, что все тесты пройдены. Это определенно НЕ сбывшаяся мечта, поскольку я предвещал, насколько наивен этот простой слой флеш-перевода. Так что не так?

Давайте подробнее рассмотрим несколько тестов, а именно BasicRepeatedWriteReadVerify и BasicDescendingWriteReadVerifyAll. Судя по названию, BasicRepeatedWriteReadVerify просто выполняет запись по одним и тем же логическим адресам (или LBA) более одного раза. Поскольку наш простой уровень трансляции флэш-памяти выполняет прямую трансляцию, это означает, что соответствующее пространство NAND также записывается повторно. Вы могли вспомнить, что флеш-память NAND требует, чтобы блок был стерт перед повторной записью. Нигде в SimpleFTL мы не обрабатываем это стирание, прежде чем разрешить хосту продолжить запись. Так почему же наш тест не проваливается? Мы не моделировали это правило NAND.

Давайте рассмотрим, как мы можем добавить к моделированию, чтобы вызвать проблемы, когда NAND записывается более одного раза без надлежащего стирания. Вот несколько вариантов

  • Отслеживайте счетчик записи для каждой страницы и возвращайте ошибку при записи более 1 и сбрасывайте при стирании.
  • Отслеживайте счетчик записи для каждой страницы и возвращайте ошибку при чтении страниц, у которых счетчик записи больше 1; очистить при стирании.

По моему опыту, я редко вижу сбой при записи NAND, но много ошибок при чтении. Двумя наиболее частыми ошибками чтения являются исправимые и неисправимые ошибки ECC. Мы можем рассказать об этом более подробно позже. А пока мы выбираем второй вариант и моделируем повторяющиеся сбои записи с неисправимыми ошибками ECC (или сокращенно UECC) при чтении.

Кроме того, мы также смоделируем принудительное применение запрета уменьшения количества операций записи в блоке (т. Е. Разрешить только записи, которые идут на больший адрес страницы в блоке по сравнению с последней записанной страницей). Это касается BasicDescendingWriteReadVerifyAll, который записывает в каждый LBA, от более высоких значений LBA до более низких значений LBA.

Код с применением правил NAND: SsdSim-Part13

Теперь мы видим провал вышеупомянутых тестов. Устранение этих сбоев открывает целый ряд интересных дискуссий о разработке прошивки SSD, в которых мы будем участвовать на нашем пути.

Статьи по Теме