您的位置:

JFFS2文件系统详解

一、概述

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