一、概述
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在闪存文件系统中具有不俗的表现。希望本文对读者对闪存文件系统有所帮助。