Uma simples camada de tradução flash que repete um rastreamento contendo endereços de bloco e operação de leitura/gravação.
5188 READ
5208 READ
6164 READ
5236 READ
5276 READ
1024 WRITE
16 WRITE
16384 WRITE
Se a operação não for especificada (leitura/gravação), o padrão será a operação de gravação.
primary_logical_block recovery_logical_block degree_of_loss
Exemplo - Para EXT4, o bloco primário pode ser um inode gravado no disco. O bloco secundário seria o diário que é escrito para o qual o bloco primário é recuperado em caso de falha.
Existem três tipos de camadas de FTL que podem ser simuladas:
Nível de página FTL
Um nível de página FTL mapeia uma página lógica diretamente para uma página física. Se ocorrer uma substituição em um número de página lógica, a página física mais antiga será marcada inválida. Uma nova página física é fornecida ao número da página lógica. O LTOPMAP é atualizado para refletir a página atualizada. O Blockstat de antigo e novo bloco é atualizado para refletir a nova contagem de páginas inválidas.
Nível de bloco FTL
O bloco lógico inteiro é mapeado para um bloco físico. Se ocorrer um número de página lógico, o bloco inteiro será invalidado, todas as entradas no bloco mais antigo serão copiadas para um novo bloco. O mapa contém apenas o mapeamento lógico do bloco físico.
Nível híbrido ftl
Armazene os valores LBN para PBN, mas em um número de página lógica, o novo bloco físico é procurado na próxima entrada gratuita do mesmo local de bloco. O mapeamento lógico do número de blocos físicos é armazenado dentro de cada Blockstat. A invalidação de todo o bloco é feita quando não há mais espaço para escrever blocos adicionais no bloco.
getNextPhysicalPage()map(lbn, pbn)getFreeBlock()getTargetBlock()GC(X)O código segue uma política de coleta de lixo gananciosa .
A coleta de lixo é feita por padrão depois que GC_Count% dos blocos físicos foram usados no sistema de arquivos. A coleta de lixo envolve a escolha do bloco que contém o maior número de páginas inválidas, selecionando um bloco de destino / bloco de pool gratuito, transferindo páginas válidas do bloco de origem para o bloco de destino. As páginas físicas no bloco de origem agora podem ser reutilizadas durante o mapeamento.
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.
Um bloco de mesclagem é um bloco que não está completamente vazio, mas tem espaço para manter todas as entradas do bloco sujo. Caso não seja encontrado um bloco vazio, escolhemos um bloco de mesclagem, invalidamos todos os seus inteiros e, em seguida, reescrevemos os valores de volta ao bloco, juntamente com todas as entradas do bloco sujo .
./ftl.py 1 8 512 128 traces/page_GC and traces/block_GC
Isso deve criar um dispositivo de 6 blocos, 8 páginas e executar um rastreamento que eventualmente teria 11 a 17 blocos no número 0 do bloco.
./ftl.py 2 4 512 128 traces/block_GC
./ftl.py 1 8 512 128 traces/block_map