Wear Leveling
Die Zellen eines NAND-Flashes altern mit jedem Schreibvorgang und kommen der 'weichen' Grenze ihrer maximalen Schreibzyklen immer näher. Bereits nach 5 Minuten mit Schreibzyklen (100000x 3ms) kontinuerlich auf eine Page und diese hat ihr spezifiziertes Lebensende erreicht. Damit die maximale Lebensdauer des gesamten Speichers erreicht wird, müssen alle Blöcke gleichmäßig benutzt werden. Der nachfolgende Artikel gibt eine grobe Einführung in mögliche Wege um dies zu erreichen.

Einführung
So einfach ist die gleichmäßige Abnutzung des gesamten NAND-Flashes nicht. Es müssen Zähler mitgeführt werden, die angeben wie oft der jeweilige Block bereits beschrieben wurde. Eine Verwaltung auf Page-Ebene ist wenig sinnvoll, da die notwendigen Verwaltungsinformationen kaum in den Spare-Bereich der Page passen (dort liegt bereits ein ECC).

Klassifizierung
Die Daten die auf einem NAND-Flash gespeichert werden haben eine vielfältige Charakteristik, die es lohnt zu berücksichtigen.
  • statische Daten:
    Statische Daten werden nur einmal geschrieben und werden dann bei Bedarf immer wieder gelesen. z.B. Fotosammlung, Bibliotheken, ausführbare Dateien.
    Eine Page wird 'heiß' bezeichnet wenn auf diese häufig Schreibzugriffe erfolgen. Dies hat eine schnellere Alterung zur Folge. Dynamische Daten werden häufig geschrieben und nur wenig gelesen.
  • komprimierte Daten:
    Bestimmte Daten wie beispielsweise Fotos, Videos sind haufig stark komprimiert. Andernseits sind reine Text-Dateien nur gering komprimiert. Dort kann es sich lohnen eine beispielsweise 4KByte große Datei zu komprimieren und in eine 2KByte große Page zu bekommen.
  • Temporäre Daten:
    Diese Daten werden in den NAND-Flash abgelegt und nach kurzer Zeit wieder gelöscht. Um unnötige Schreibzyklen zu vermeiden, werden diese Seiten nie wirklich in den Flash gechrieben sondern nur in einem Cache gehalten.
  • Streaming-Daten:
    An das Ende der Daten werden in regelmäßigen Abstanden weitere Daten angefügt oder ersetzt. z.B. Log-Dateien
    Da die Datenmenge meist unterhalb der Pagegröße liegt, lohnt es sich, die Daten erst dann aus dem Cache in den NAND-Flash zu schreiben, wenn eine Page zusammengekommen ist.
  • Meta-Daten:
    Diese Daten werden von Wear-Leveling und BlockManagement selbst erzeugt (Tabellen, Listen, Mapping, Zähler, Bit-Maps). Die benötigten Blöcke/Pages stehen nicht als Speicherplatz zur Verfügung. Über die Laufzeit hinweg liegen diese Daten komplett im Cache und müssen erst vor dem Abschalten des Systems geschrieben werden. Beim Einschalten werden diese Daten wieder in den Cache gelesen.

dynamisches Wear Leveling
Beim dynamischen Wear Leveling werden nur die freien Blöcke für das Wear Leveling benutzt. In der nachfolgenden Abbildung wird nur eine einzige temporäre Datei immer wieder verändert. Der Flash-Controller läd die betroffenen Pages in den Cache verändert sie und schreibt sie an freie Stellen zurück. Der Garbage-Collector räumt von Zeit zu Zeit die veralteten (ungültigen) Blöcke auf, sodass immer wieder leere Pages zur Verfügung stehen.


Blöcke in denen Daten liegen, die nur selten geschrieben werden, nutzen sich aber nur wenig ab. Der Garbage Collector erzeugt eben nur aus ungültigen Blöcken die benötigten freien Blöcke. Wenn nun aber die Blöcke nur selten ungültig werden, weil sie kaum verändert werden, nehmen diese Blöcke praktisch nicht am dynamischen Wear Leveling teil. Dagegen erreicht der restliche Speicher rasch seine maximalen Schreibzyklen.
Würde man einen Speicher der nur das dynamische Wear Leveling kann fast voll schreiben, so stünden nur einige wenige Blöcke für das Wear Leveling zur Verfügung.


Diese Blöcke würden sehr schnell ihr Lebensende erreichen. Daher ist es sinnvoll einige 'versteckte' Spareblöcke zu haben, die nicht dem Dateisystem zur Verfügung gestellt werden.

statisches Wear Leveling
Um die Nachteile des dynamische Wear Leveling zu umgehen, werden ab und zu Blöcke gesucht, die erst wenig überschrieben wurden. Deren Inhalt wird dann in einen schon stark gealterten Block umkopiert.


Von nun an kann der noch 'junge' freie Block am dynamischen WearLeveling teilnehmen.

Fragen
Die Algorithmen für NAND-Flash Speicher sind sehr komplex. Es kommen eine Reihe von Fragen auf:
  • Wie viele Spareblöcken sollen für das dynamische WL reserviert werden?
  • Wie viele Reserveblöcke sollen für das Bad Block Management reserviert werden?
  • Wann arbeitet der Garbage Collector? In Idle-Zeiten? Erst wenn keine freien Blöcke mehr zur Verfügung stehen?
  • Ab welcher Grenze sollen teilweise ungültige Blöcke zusammengefasst werden?
  • Welche Pages werden im Cache gehalten?
  • Wann wird eine Page zurückgeschrieben?
  • Wann wird ein Block für das statische WL umkopiert?
  • Wie wird vorgegangen, wenn eine Page nicht mehr vom ECC korigiert werden kann? Ersetzen und defekte Page zurückliefern oder ersetzen und eine leere Page zurückliefern oder...?
  • Wann wird ein defekter Block/Page durch einen Reserve-Block/Page ersetzt? Sofort wenn auch nur ein Bit-Fehler auftritt oder erst wenn die maximale Anzahl an korrigierbaren Fehlern erreicht ist?
  • Wie sind die Verwaltungsinformationen aufgebaut und wo werden diese abgespeichert? Wie oft werden diese geschrieben und vielviel Speicher muss dafür reserviert werden?
  • Wie wird der Speicher nach einem Spannungsabfall wieder restauriert?
Die effiziente Konfiguration eines Algorithmus ist keine triviale Aufgabe. Dort spielen Erfahrungswerte und technisches Know-How eine wichtige Rolle. Daher sind viele Algorithmen gut gehütete Geheimnisse.