Una capa simple de traducción flash que reproduce una traza que contiene direcciones de bloque y operación de lectura/escritura.
5188 READ
5208 READ
6164 READ
5236 READ
5276 READ
1024 WRITE
16 WRITE
16384 WRITE
Si no se especifica la operación (leer/escribir), entonces el valor predeterminado es la operación de escritura.
primary_logical_block recovery_logical_block degree_of_loss
Ejemplo: para Ext4, el bloque primario podría ser un inodo escrito en el disco. El bloque secundario sería la revista a la que se escribe desde la cual se recupera el bloqueo primario en caso de una falla.
Hay tres tipos de capas FTL que se pueden simular:
Nivel de página FTL
Un nivel de página FTL asigna una página lógica directamente a una página física. Si se produce una sobrescritura en un número de página lógico, la página física más antigua no está válida. Se proporciona una nueva página física al número de página lógico. LTOPMAP se actualiza para reflejar la página actualizada. BLOCKSTAT de Old and New Block se actualiza para reflejar un nuevo recuento de páginas no válido.
Nivel de bloque FTL
El bloque lógico completo se asigna a un bloque físico. Si se produce una sobrescritura de un número de página lógico, todo el bloque está invalidado, todas las entradas en el bloque anterior se copian a un nuevo bloque. El mapa solo contiene mapeo de bloques lógico a físico.
Nivel híbrido FTL
Almacene LBN a los valores de PBN, pero en una sobrescritura a un número de página lógico, el nuevo bloque físico se ve en la siguiente entrada gratuita de la misma ubicación de bloque. El mapeo de número de bloque lógico a físico se almacena dentro de cada estadio. La invalidación de todo el bloque se realiza cuando no hay más espacio para escribir ningún bloque adicional en el bloque.
getNextPhysicalPage()map(lbn, pbn)getFreeBlock()getTargetBlock()GC(X)El código sigue una política de recolección de basura codiciosa .
La recolección de basura se realiza de forma predeterminada después de que GC_COUNT% de los bloques físicos se han utilizado en el sistema de archivos. La recolección de basura implica elegir el bloque que contiene la mayor cantidad de páginas no válidas, seleccionar un bloque de destino / bloque de piscina gratuita, transferir páginas válidas desde el bloque de origen al bloque de destino. Las páginas físicas en el bloque de origen ahora se pueden reutilizar durante el mapeo.
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 bloque de fusión es un bloque que no está completamente vacío, pero tiene espacio para mantener todas las entradas del bloque sucio. En caso de que no se encuentre un bloque vacío, elegimos un bloque de fusión, invalidamos todos sus entres y luego reescribimos los valores nuevamente en el bloque, junto con todas las entradas del bloque sucio .
./ftl.py 1 8 512 128 traces/page_GC and traces/block_GC
Esto debería crear un dispositivo de 6 bloques, 8 páginas y ejecutar un rastro que eventualmente tendría 11-17 bloques en el número de bloque 0.
./ftl.py 2 4 512 128 traces/block_GC
./ftl.py 1 8 512 128 traces/block_map