1、quick notes
- littlefs是block-based文件系统。flash被划分成多个相同大小的block
- block pointer是32bits,0xFFFFFFFF表示空指针
- 除了逻辑block size(通常是erase block size),littlefs还有program block size和read block size,后面两个block size主要是用于flash 读写时的对齐
- littlefs采用little-endian order
2、Directories/Metadata pairs
metadata pair是littlefs的基石,提供了原子更新的能力。superblock也是存储在metadata pair中。metadata pair存储在两个block中,一个block在另一个block erase的时候提供备份。同一个metadata pair中的两个block并不要求是连续的,可以分散在不同的位置,通过指针链接。
每一个metadata block类似于一个可以追加的log,包含多个commit。commit可以按照顺序追加到metadata block中而不需要erase操作。同时,后续的commit可以取代旧的commit,只有最新的commit才被认为是有效的。

每个metadata block包含一个32-bit的revision count,后面跟着多个commit。每个commit包含一个或多个entry,每个commit的最后是32-bit的CRC。entry不一定是word-aligned。但是每个commit都是program block size对齐的,因此commit与commit之间可能存在padding。
metadata block的主要域:
1)revision count:32bit长。每擦除一次就增加1,如果两个metadata block都包含有效的数据,则使用最新的revision count所在的block。
2)CRC:32bit长。使用0x04c11db7多项式,初始值为0xFFFFFFFF。
3)entry:每个entry以32-bit的tag开始,后面跟着可变长度的数据。
metadata block支持前向和后向的迭代。为了减少重复空间,相邻entry的tag通过XOR连接起来,初始值是0xffffffff。

每个entry中还包含一个valid bit用于指示当前entry和commit有效。
下图是包含4个entry的block。
.---------------------------------------.
.-| revision count | tag ~A | \
| |-------------------+-------------------| |
| | data A | |
| | | |
| |-------------------+-------------------| |
| | tag AxB | data B | <--. |
| |-------------------+ | | |
| | | | +-- 1st commit
| | +-------------------+---------| | |
| | | tag BxC | | <-.| |
| |---------+-------------------+ | || |
| | data C | || |
| | | || |
| |-------------------+-------------------| || |
| | tag CxCRC

本文深入探讨了LittleFS文件系统的工作原理,包括其基于block的结构、metadatapair的原子更新机制、目录和文件元数据的组织方式,以及各种metadatatag的详细解释。了解LittleFS如何高效管理闪存存储。

1万+

被折叠的 条评论
为什么被折叠?



