Une simple calque de traduction flash qui rejoue une trace contenant des adresses de bloc et une opération de lecture / écriture.
5188 READ
5208 READ
6164 READ
5236 READ
5276 READ
1024 WRITE
16 WRITE
16384 WRITE
Si l'opération n'est pas spécifiée (lecture / écriture), la valeur par défaut est l'opération d'écriture.
primary_logical_block recovery_logical_block degree_of_loss
Exemple - Pour EXT4, le bloc principal pourrait être un inode écrit sur le disque. Le bloc secondaire serait le journal qui est écrit à partir duquel le bloc primaire est récupéré en cas de défaillance.
Il existe trois types de couches FTL qui peuvent être simulées:
Niveau de page FTL
Un niveau de page FTL cartose une page logique directement sur une page physique. Si un écrasement sur un numéro de page logique se produit, l'ancienne page physique est marquée invalide. Une nouvelle page physique est fournie au numéro de page logique. LTOPMAP est mis à jour pour refléter la page mise à jour. BlockStat of Old and New Block est mis à jour pour refléter le nouveau nombre de pages invalides.
Niveau de blocs FTL
Le bloc logique entier est mappé à un bloc physique. Si un écrasement d'un numéro de page logique se produit, l'ensemble du bloc est invalidé, toutes les entrées du bloc plus ancien sont copiées dans un nouveau bloc. La carte contient uniquement la cartographie logique à des blocs physiques.
Niveau hybride FTL
Stockez LBN aux valeurs PBN, mais sur un écrasement d'un numéro de page logique, le nouveau bloc physique est recherché dans la prochaine entrée gratuite du même emplacement de bloc. Le mappage logique au numéro de bloc physique est stocké dans chaque blocage. L'invalidation de l'ensemble du bloc est effectuée lorsqu'il n'y a plus d'espace pour écrire des blocs supplémentaires sur le bloc.
getNextPhysicalPage()map(lbn, pbn)getFreeBlock()getTargetBlock()GC(X)Le code suit une politique de collecte des ordures gourmandes .
La collecte des ordures est effectuée par défaut après que GC_Count% des blocs physiques ait été utilisés dans le système de fichiers. La collecte des ordures consiste à choisir le bloc contenant le plus grand nombre de pages non valides, en sélectionnant un bloc de destination / bloc de pool gratuit, en transférant des pages valides du bloc source vers le bloc de destination. Les pages physiques du bloc source peuvent désormais être réutilisées pendant la cartographie.
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.
Un bloc de fusion est un bloc qui n'est pas complètement vide, mais qui a de l'espace pour garder toutes les entrées du bloc sale. Dans le cas où un bloc vide n'est pas trouvé, nous choisissons un bloc de fusion, invalidons tous ses entires, puis réécrivons les valeurs dans le bloc, ainsi que toutes les entrées du bloc sale .
./ftl.py 1 8 512 128 traces/page_GC and traces/block_GC
Cela devrait créer un appareil de 6 blocs, 8 pages et exécuter une trace qui aurait finalement 11 à 17 blocs dans le numéro de bloc 0.
./ftl.py 2 4 512 128 traces/block_GC
./ftl.py 1 8 512 128 traces/block_map