Eine einfache Flash -Übersetzungsschicht, die eine Trace -enthält, die Blockadressen enthält und den Vorgang/Schreibvorgang enthält.
5188 READ
5208 READ
6164 READ
5236 READ
5276 READ
1024 WRITE
16 WRITE
16384 WRITE
Wenn die Operation nicht angegeben ist (Lese/Schreiben), ist der Standard -Schreibvorgang.
primary_logical_block recovery_logical_block degree_of_loss
Beispiel - Für ext4 könnte der primäre Block ein Inode sein, der auf der Festplatte geschrieben ist. Der Sekundärblock wäre das Journal, in das der primäre Block im Falle eines Fehlers wiederhergestellt wird.
Es gibt drei Arten von FTL -Schichten, die simuliert werden können:
Seitenstufe ftl
Eine Seitenstufe ftl ordnet eine logische Seite direkt auf eine physische Seite ab. Wenn ein Überschreiben auf einer logischen Seitenzahl auftritt, ist die ältere physikalische Seite ungültig gekennzeichnet. Der logischen Seitennummer wird eine neue physische Seite zur Verfügung gestellt. LTOPMAP wird aktualisiert, um die aktualisierte Seite zu reflektieren. Blockstat of Old and New Block wird aktualisiert, um eine neue ungültige Seitenanzahl widerzuspiegeln.
Blockpegel ftl
Ganzer logischer Block wird einem physischen Block zugeordnet. Wenn ein Überschreiben einer logischen Seitenzahl auftritt, wird der gesamte Block ungültig, alle Einträge im älteren Block werden in einen neuen Block kopiert. MAP enthält nur logische bis physische Blockzuordnung.
Hybridspiegel FTL
Speichern Sie die LBN in PBN -Werten, aber auf einem Überschreiben zu einer logischen Seitenzahl wird der neue physische Block im nächsten freien Eintrag desselben Blockorts nachgeschlagen. Die logische bis physische Blocknummer -Zuordnung wird in jedem Blockstat gespeichert. Die Ungültigkeit des gesamten Blocks erfolgt, wenn kein Platz mehr für den Schreiben zusätzlicher Blöcke auf den Block vorhanden ist.
getNextPhysicalPage()map(lbn, pbn)getFreeBlock()getTargetBlock()GC(X)Der Code folgt einer gierigen Müllsammlungspolitik.
Die Müllsammlung erfolgt standardmäßig, nachdem GC_COUNT% der physischen Blöcke im Dateisystem verwendet wurden. Bei der Müllsammlung wird der Block ausgewählt, der die meisten ungültigen Seiten enthält, einen Zielblock / kostenlosen Poolblock auswählen und gültige Seiten vom Quellblock auf den Zielblock übertragen werden. Die physischen Seiten im Quellblock können jetzt während der Zuordnung wiederverwendet werden.
Invoke GC
Choose Victim block (blk.gc_count < curr_gc_count)
if not found; exit
Choose empty block (blk.gc_count < curr_gc_count)
if not found; check for Merge Block (explained below)
Move valid from Victim -> Empty
Mark Empty -> Valid
Mark Victim -> Empty
Update GC count of both blocks to curr_gc_count.
Continue.
Ein Zusammenführungsblock ist ein Block, der nicht vollständig leer ist, aber Platz hat, um alle Einträge des schmutzigen Blocks zu halten. Falls ein leerer Block nicht gefunden wird, wählen wir einen Merge -Block, ungültig und schreiben dann die Werte zusammen mit allen Einträgen des schmutzigen Blocks wieder in den Block.
./ftl.py 1 8 512 128 traces/page_GC and traces/block_GC
Dies sollte ein Gerät mit 6 Blöcken, 8 Seiten erstellen und eine Spur ausführen, die letztendlich 11-17 Blöcke in der Blocknummer 0 haben würde.
./ftl.py 2 4 512 128 traces/block_GC
./ftl.py 1 8 512 128 traces/block_map