You need to sign in or sign up before continuing.
提交 a963b94e 编写于 作者: O openharmony_ci 提交者: Gitee

!489 修改M核LittleFS基本概念描述

Merge pull request !489 from 野生毛霉君/master
# 基本概念<a name="ZH-CN_TOPIC_0000001153060453"></a> # 基本概念<a name="ZH-CN_TOPIC_0000001153060453"></a>
LittleFS是一个小型的的Flash文件系统,它结合日志结构(log-structured)文件系统和COW(copy-on-write)文件系统的思想,以日志结构存储元数据,以COW结构存储数据。这种特殊的存储方式,使LittleFS具有强大的掉电恢复能力(power-loss resilience)。分配COW数据块时LittleFS采用了名为统计损耗均衡的动态损耗均衡算法,使Flash设备的寿命得到有效保障。同时LittleFS针对资源紧缺的小型设备进行设计,具有极其有限的ROM和RAM占用,并且所有RAM的使用都通过一个可配置的固定大小缓冲区进行分配,不会随文件系统的扩大占据更多的系统资源。
- [运行机制](#section10284121317365) 当在一个资源非常紧缺的小型设备上,寻找一个具有掉电恢复能力并支持损耗均衡的Flash文件系统时,LittleFS可能是最好的选择。
- [日志方式](#section13804114513361)
- [Cow机制](#section172771130193610)
- [LittleFS掉电保护](#section42941021173614)
LittleFS主要用在微控制器和Flash上,是一种嵌入式文件系统,具有掉电恢复、擦写均衡、节省ROM/RAM空间等特点。
## 运行机制<a name="section10284121317365"></a>
最经典的掉电保护方法有两种,一种是使用日志,一种是通过COW方式。LittleFS结合了两种方法,并优化了两种方案的缺点,提供了一套掉电保护策略
### 日志方式<a name="section13804114513361"></a>
**图 1** 日志方式示意图<a name="fig8199182955716"></a>
![](figure/日志方式示意图.png "日志方式示意图")
具体步骤为:
1. 写入数据之前,先在日志区存储开始标志,记录要写入的数据位置和大小;
2. 待写入的数据写入日志区;
3. 待写入的数据写入数据区;
4. 写入完成之后,在日志区记录结束标志。
模拟掉电场景:
1. 步骤1完成,步骤2没有完成;重启之后,保持原来的数据,日志无效;
2. 步骤1,2完成了,步骤3没有完成,尝试把步骤2的数据写入到数据区;
3. 步骤1,2,3完成了,步骤4没有完成,同样尝试把步骤2的数据写入到数据区;
### Cow机制<a name="section172771130193610"></a>
**图 2** Cow机制示意图<a name="fig139293469719"></a>
![](figure/Cow机制示意图.png "Cow机制示意图")
具体步骤为:
1. 想更新节点F的数据,先申请一个新的节点,把F的旧数据拷贝过去,然后更新新的数据;
2. 把父节点的指针指向新的节点,去掉旧节点的指针。
模拟掉电场景:
步骤1完成了,步骤2没有完成,则使用旧的数据,新的节点变成孤儿节点。
### LittleFS掉电保护<a name="section42941021173614"></a>
LittleFS结合了日志方式和COW机制两种方式进行掉电保护,并且优化了两种方案。
文件系统有三要素,超级块,inode,以及数据,对应LittleFS来说,它把超级块以及inode通过日志的方式存储,两种采用统一的存储结构,后文称两者为元数据;普通数据则采用cow的方式存储,采用czt逆序链表的方式。
![](figure/zh-cn_image_0000001124307264.png)
**元数据的存储**
元数据(对应root,dir)采用双block的方式存储,互为备份,每个block都有一个revision序号,值越大,表示block的数据越新,每个block默认可以存储最多0xff个文件的数据,如果超过这个值,则需要compact(压缩)。
Compact是干什么呢? 即当数据的大小大于某个值的时候,把数据整合,剔除同一个id的旧的数据,然后写入到备份block里面。如图所示:
**图 3** 元数据存储示意图<a name="fig426811100598"></a>
![](figure/元数据存储示意图.png "元数据存储示意图")
**普通数据的存储**
LittleFS的数据采用链表的方式逆向管理。
![](figure/zh-cn_image_0000001132085260.png)
1. 采用逆向的指针,这样常规的追加数据,不需要额外的开销来重新建立所有的索引;
2. 每个偶数block有多个指针,指向更远的数据,这样可以在检索的时候加快速度。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册