# Flash-Speicher-Controller

Der Flash-Speicher-Controller ist ein Bestandteil eines digitalen Speichermediums (zum Beispiel SD-Karte, CompactFlash, USB-Massenspeicher und Solid State Disks (SSD)), der die Kommunikation zwischen Flash-Speicher und Computer sowie bestimmte weitere Vorgänge steuert. Der Controller verwaltet, wo und wie die Daten in die physikalischen Speicherzellen abgelegt werden und hat einen wichtigen Einfluss auf die Leistung und die Lebensdauer des Flash-Speichers. Des Weiteren ist der Flash-Speicher-Controller auch für das Wear-Leveling, die Fehlerkorrektur (ECC) und das Mapping (Flash Translation Layer) verantwortlich.

## Lesen, schreiben, löschen

Flash-Speicher bestehen aus Datenblöcken und -seiten. Blöcke werden aus mehreren Seiten gebildet und eine Seite wird aus mehreren Speicherzellen gebildet. Die Flash-Speicher lassen sich nur blockweise löschen und seitenweise beschreiben. Die Dateisysteme benutzen bestimmte Zugriffsmuster, um von einem Speicher zu lesen bzw. auf ihn zu schreiben. Die kleinste Einheit für einen Lesezugriff ist in der Regel ein Sektor mit 512 Bytes.
Da sich jedoch nur einzelne Seiten beschreiben lassen, muss diese Seite physisch leer sein. Sollte das nicht der Fall sein, muss der Inhalt der Seite zuerst gelöscht werden, was nur möglich ist, wenn man den ganzen Block löscht und somit alle auf dem Block vorhandenen Seiten.

## Write Amplification (Schreibfaktor)

Üblicherweise müssen physikalisch mehr Daten auf den Flash-Speicher geschrieben als vom Computer bzw. Dateisystem gesendet werden. Write Amplification gibt Auskünfte über die Effektivität, mit der Daten vom Host auf den Flash-Speicher geschrieben werden. Um das besser einschätzen zu können, gibt es einen Write Amplification Factor (WAF), der die Informationsmenge angibt, die zusammen mit einer bestimmten Menge von Anwenderdaten zusätzlich in einen Flash-Speicher geschrieben werden muss.
${\text{ WAF}}={\dfrac {\text{Flash Write (in Bytes)}}{\text{Host Write (in Bytes)}}}$.
Bsp.: Bei einem WAF von 4, mit zufälligen Schreibvorgängen von 4 KByte, werden tatsächlich 16 KByte in den Flash-Speicher geschrieben.
Das bedeutet, dass die physikalische Menge, die tatsächlich auf den Flash-Speicher geschrieben wird, die logische Menge übertrifft. Dies begründet sich zum einen in der Anforderung nach blockweisem Löschen und seitenweisem Beschreiben, zum anderen darin, dass Mapping und andere Algorithmen zusätzlich Informationen und Protokollierungsdaten auf den Flash-Speicher schreiben.
Den WAF zu berechnen, hängt von vielen verschiedenen Faktoren (zum Beispiel von dem Datenzugriffs-/-schreibmuster, der Mapping-Granularität oder der Flash-Technologie (SLC/MLC/TLC)) ab. Dadurch kann man jedoch die Effizienz erhöhen und gleichzeitig die Schreib- und Löschzyklen verringern. So lässt sich die Lebensdauer eines Flash-Speichers erheblich verlängern. NAND-Flash-Speicher nutzen sich über Schreib- und Löschzyklen physikalisch ab, wodurch sich Daten ab einer bestimmten Nutzungsdauer nicht mehr zuverlässig speichern lassen.

## Fehlerkorrekturverfahren (ECC)

Da manche Speicherzellen auf Grund von Abnutzung, Produktionsvarianzen und anderer physikalischer Effekte einen falschen Zustand haben können und daher beim Zurücklesen vereinzelt fehlerhafte Bits ausliefern (Raw Bit Error Rate), beinhaltet der Flash-Speicher-Controller üblicherweise auch eine Fehlerkorrektureinheit. Hierbei gibt es große Unterschiede bezüglich der eingesetzten Algorithmen sowie der Korrekturstärke und Qualität. Manche Algorithmen liefern mit einer gewissen Wahrscheinlichkeit falsche Bitwerte aus, während andere ab einer bestimmten Menge an Fehlern sie gar nicht mehr korrigieren können und stattdessen das Resultat „unkorrigierbar“ zurückliefern. Die Stärke der Korrekturfähigkeit eines Controllers wird in Bit bzw. Kbyte angegeben.

## Wear-leveling

Das Wear-Leveling ist eine der wichtigsten Aufgaben, die der Flash-Speicher-Controller übernimmt. Durch diese Funktion wird dafür gesorgt, dass die Speicherzellen auf dem Flash-Speicher gleichmäßig abgenutzt werden, um die Lebensdauer des Flash-Speicher-Systems insgesamt zu steigern. Dazu werden die Daten, die sich auf dem Flash-Speicher befinden, permanent und gleichmäßig umgelagert. Man unterscheidet zwischen dynamischem und statischem Wear Leveling. Das dynamische Wear Leveling selektiert aus der Menge der aktuell freien Blöcke für einen neuen Schreibzugriff den bisher am wenigsten benutzten Block. Eine Gefahr des dynamischen Wear Levelings ist, dass bei einem stark ausgelasteten Flash-Speicher-System die Zellen der verbleibenden freien Blöcke schnell abgenutzt werden. Statisches Wear Leveling bezieht Blöcke mit ein, welche statische Daten beinhalten und lagert diese im Bedarfsfall in andere Blöcke um. Um eine möglichst hohe Lebensdauer zu erreichen, werden in SSDs meistens beide Methoden angewendet,.

## Flash Translation Layer (FTL) und Mapping

Der Flash Translation Layer übernimmt die Umwandlung (mapping) von logischen in physikalische Adressen. Das bedeutet, dass die logischen Zugriffe von der Host-Seite in physikalische Zugriffe auf der Flash-Speicher-Seite übersetzt werden. Je nach erforderlicher Anwendung gibt es verschiedene Mapping-Ansätze.
* Das block-based mapping (blockbasiertes Mapping) wandelt logische Blöcke in physikalische Blöcke um. Die Seiten bzw. Sektoren innerhalb der Blöcke werden eins zu eins von Host auf Flash abgebildet.
* Beim page-based mapping (seitenbasierten Mapping) werden logische Seiten auf physikalische Seiten abgebildet, wobei die Blocknummern einen Teil der Seitenadresse bilden. Eine logische Seite kann also auf jeder beliebigen Seite innerhalb eines beliebigen Blocks abgelegt werden.
* Der dritte Mapping Ansatz ist das sub-page-based mapping. Dabei werden logische Einheiten, die kleiner als eine Seite sind, gebildet und dann auf physikalische Einheiten abgebildet. Die Problematik bei diesem Verfahren liegt darin, dass die kleinste Schreibeinheit eine Seite ist, weshalb der Controller diese Einheiten in eine Seite zusammenfasst.

## Garbage Collection

Die Garbage Collection („Müllsammlung“) hat die Aufgabe, freie Blöcke zu generieren. Dazu ist es notwendig, noch nicht vollständig leere Blöcke auf dem Flash-Speicher zu überprüfen und gegebenenfalls durch Konsolidieren der validen Daten frei zu machen, damit sie gelöscht und anschließend wieder beschrieben werden können. Dieser Vorgang ist wichtig für die Leistung des Flash Speichers, da man bei einem Löschvorgang im Dateisystem oder vom Host nur Dateien für ungültig erklärt, sie jedoch nicht physikalisch löscht. Die eigentlichen Daten bleiben in der Speicherzelle erhalten. Die Garbage Collection räumt sozusagen auf. Dieser Vorgang läuft zumeist im Hintergrund ab, um Auswirkungen auf die Speichergeschwindigkeit gering zu halten.