一、概述
JFFS2是Linux內核中的一種快閃記憶體文件系統,全稱為”Journaling Flash File System version 2″,是對前代的JFFS文件系統的改良升級版本。jffs2根據Flash的特性,保證不論Flash的物理狀態如何,系統都能夠持續發揮比較穩定的性能。
與傳統的文件系統不同,JFFS2在Flash中保存了一個日誌,以便恢復操作。
二、文件系統格式
在Flash中,JFFS2有一個物理上的相對布局。每個節點(不管是文件還是目錄)都有一個頭信息,對於文件節點,數據緊隨其後,對於目錄節點,一個或多個安裝節點伴隨頭信息之後。
struct jffs2_raw_inode { __be32 magic; __be32 version; __be32 ino; __be32 totlen; __be32 hdr_crc; __be32 data_crc; __be16 fraglen; __u8 type; __u8 pad1; __u32 padding; }; struct jffs2_raw_dirent { __be32 pino; __be32 vhash; __be32 ino; __be16 nsize; __u8 type; __u8 padding[1]; };
三、文件系統的數據結構
JFFS2文件系統通過節點和Inode來對文件進行管理。根據Linux文件系統的設計思想,整個目錄結構都被表示為樹形結構,因此JFFS2文件系統使用一組樹來表示目錄結構。
一個節點只能是文件或者目錄之一,文件的實際數據緊跟在節點頭之後。在節點頭中有一個8位元組的”CheckSum”,用於保證數據的完整性。
文件系統初始化後,會通過掛載點讀入根節點,然後根據各個節點的信息,構建出完整的目錄和文件。
四、節點管理
節點管理是JFFS2中一個非常重要的問題,不同的場合需要不同的策略來管理節點。下面我們逐一闡述。
1. 日輪替換
當Flash空間不足的時候,我們需要選擇一些節點進行清理。在這種情況下,我們會採用日輪替換的方式:
1. 選擇一些非頂部的節點,並且停止在這些節點插入
2. 將這些節點寫入哪個區域來執行擦除
3. 重新啟動函數操作
2. GC擦除
當Flash裡面有大量刪除的數據時,我們需要採用GC擦除的方式來回收空間:
1. 掃描整個Flash並且記錄所有的節點
2. 把所有的數據複製到一個新的Flash中
3. 更新一些頭部可以避免重新掃描
4. 最後擦除Flash
五、性能測試和分析
為了測試JFFS2文件系統的性能,我們搭建了如下測試環境:
- 處理器:Intel Core i7 3770K
- 內存:8GB DDR3 1333MHZ的雙通道模式
- 磁碟介面:SATA 6 Gb/秒120GB
- 操作系統:Ubuntu 18.04 LTS 64位
我們在該環境上進行了讀寫和擦除的性能測試,測試結果如下:
JFFS2 Write, Size: 4096, Time: 118000 us JFFS2 Read, Size: 4096, Time: 5000 us JFFS2 Erase, Block: 0, Time: 20000 us
六、小結
在本文中,我們對JFFS2文件系統進行了詳細地解析,探討了其格式、數據結構和節點管理等方面。通過性能測試和分析,我們發現JFFS2在快閃記憶體文件系統中具有不俗的表現。希望本文對讀者對快閃記憶體文件系統有所幫助。
原創文章,作者:KDJS,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/132188.html