simpleFTL
1.0.0
一個簡單的閃存翻譯層,該層重新錄製包含塊地址的跟踪並讀取/寫操作。
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,主要塊可能是寫在磁盤上的inode。次要塊將是寫入的期刊,以便在失敗的情況下從中恢復主要塊。
可以模擬三種類型的FTL層:
頁面級FTL
頁面級FTL將邏輯頁面直接映射到物理頁面。如果發生邏輯頁碼上的覆蓋物,則較舊的物理頁面標記為無效。向邏輯頁碼提供了一個新的物理頁面。 LTOPMAP已更新以反映更新的頁面。舊和新塊的塊已更新以反映新的無效頁面計數。
塊級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