블록 주소와 읽기/쓰기 작업이 포함 된 추적을 재생하는 간단한 플래시 번역 계층.
5188 READ
5208 READ
6164 READ
5236 READ
5276 READ
1024 WRITE
16 WRITE
16384 WRITE
작업이 지정되지 않은 경우 (읽기/쓰기) 기본값은 쓰기 작업입니다.
primary_logical_block recovery_logical_block degree_of_loss
예 - Ext4의 경우 1 차 블록은 디스크에 쓰여진 inode 일 수 있습니다. 보조 블록은 실패시 1 차 블록이 복구 된 저널입니다.
시뮬레이션 할 수있는 세 가지 유형의 FTL 층이 있습니다.
페이지 레벨 FTL
페이지 레벨 FTL은 논리 페이지를 실제 페이지에 직접 맵핑합니다. 논리적 페이지 번호의 덮어 쓰기가 발생하면 이전 물리적 페이지가 유효하지 않습니다. 새로운 물리적 페이지가 논리 페이지 번호로 제공됩니다. LTOPMAP는 업데이트 된 페이지를 반영하도록 업데이트되었습니다. 구식 및 새 블록의 Blockstat는 새로운 잘못된 페이지 수를 반영하도록 업데이트되었습니다.
블록 레벨 FTL
전체 논리 블록이 물리적 블록에 매핑됩니다. 논리 페이지 번호로 덮어 쓰기가 발생하면 전체 블록이 무효화되고 이전 블록의 모든 항목은 새 블록으로 복사됩니다. 맵에는 논리적 인 물리적 블록 매핑 만 포함됩니다.
하이브리드 레벨 FTL
LBN을 PBN 값으로 저장하지만 논리적 페이지 번호로 덮어 쓰기에서 새로운 물리적 블록은 동일한 블록 위치의 다음 무료 항목에서 조회됩니다. 물리적 블록 번호 맵핑은 각 블록 스타트 내에 저장됩니다. 전체 블록의 무효화는 블록에 추가 블록을 작성할 공간이 더 이상 없을 때 수행됩니다.
getNextPhysicalPage()map(lbn, pbn)getFreeBlock()getTargetBlock()GC(X)이 코드는 욕심 많은 쓰레기 수집 정책을 따릅니다.
쓰레기 수집은 파일 시스템에서 물리적 블록의 GC_Count%가 사용 된 후 기본적으로 수행됩니다. 쓰레기 수집에는 가장 유효하지 않은 페이지가 포함 된 블록을 선택하고 대상 블록 / 무료 풀 블록을 선택하고 유효한 페이지를 소스 블록에서 대상 블록으로 전송하는 것입니다. 소스 블록의 실제 페이지는 이제 매핑 중에 재사용 할 수 있습니다.
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.
병합 블록은 완전히 비어 있지 않지만 더러운 블록의 모든 항목을 유지할 수있는 공간이있는 블록입니다. 빈 블록을 찾을 수없는 경우, 우리는 병합 블록을 선택하고, 모든 내용을 무효화 한 다음 더러운 블록 의 모든 항목과 함께 값을 블록으로 다시 작성합니다.
./ftl.py 1 8 512 128 traces/page_GC and traces/block_GC
이렇게하면 6 개의 블록, 8 페이지의 장치가 생성되고 결국 블록 번호 0에 11-17 블록이있는 흔적을 실행해야합니다.
./ftl.py 2 4 512 128 traces/block_GC
./ftl.py 1 8 512 128 traces/block_map