#littlefs原理分析#[六]磨损均衡 精华
作者:蒋卫峰 李涛
前言
前面已经对littlefs的原理分析了5篇文章,内容包括了:
-
littlefs整体的存储结构
-
commit机制
-
fetch操作
-
目录操作
-
文件读写操作
本文是littlefs原理分析系列最后一篇文章,主要介绍littlefs中与磨损均衡相关的策略,同时也会对其中的块分配算法进行介绍。
littlefs有以下防止磨损相关的措施:
- 写时坏块的检测和写入恢复
- 均匀地进行块的分配:由块分配算法实现
- 定期重分配元数据所在块
1. 写时坏块的检测和写入恢复
littlefs中当进行文件、目录元数据等的写入时,最后会调用函数lfs_bd_flush将数据最终写入到磁盘。lfs_bd_flush函数写入完后,会将内存中写入的数据和磁盘上的数据进行比较。如果数据不一致,则可能是坏块。
方法如下:
- 写入时通过回读磁盘上的数据进行验证,来检测坏块
- 检测到坏块后,清除坏块,重新分配块,然后重新写入
lfs_bd_flush函数检查数据是否一致部分的分析如下:
如在文件写入数据时,在函数lfs_file_flush中,检测到坏块时会重新分配块再进行写入操作:
2. 块分配
2.1 lookahead buffer
littlefs中使用一个lookahead buffer来管理和分配块。lookahead buffer是一个固定大小的bitmap,记录一片区域内块分配的信息。
lookahead buffer图例如下,其中假设总共有64个块,lookahead buffer的大小为8,lookahead buffer对应块中现分配了文件A、D和目录B、C的块:
lookahead buffer相关数据结构如下:
2.2 查找已分配的块
lookahead buffer只记录了一片区域内块分配的信息,当需要知道其他区域块分配的情况时,就需要进行扫描文件系统来查找已分配的块。如lookahead buffer中已经没有空闲块、需要推移lookahead buffer来查找文件系统中的其他空闲块。
扫描和查找已分配的块的过程如下:
-
将lookahead buffer位置推移一个lookahead_size,并将lookahead buffer清0。
-
从超级块开始遍历文件系统中所有目录和文件,以遍历所有已分配的块。如果块位于lookahead buffer所管理区域,则将lookahead buffer中相应位置为1。
lookahead buffer只用固定大小的bitmap存储已分配块的信息,是littlefs中的一种权衡,这样虽然更耗费时间,但有效节省了RAM空间资源。
代码分析如下:
其中,lfs_fs_rawtraverse函数会从超级块开始遍历整个文件系统,对整个文件系统中所有已经分配的块调用回调函数lfs_alloc_lookahead。lfs_alloc_lookahead函数分析如下:
2.3 块分配算法
块分配算法的过程总结:首先尝试从lookahead buffer中找到下一个空闲块,若没有则将lookahead buffer位置推移一个lookahead_size,执行上一小节中的扫描和查找文件系统过程,再尝试从lookahead buffer中找到下一个空闲块,以此循环进行。
以下为几次分配和扫描的示例:
2.4 均匀分配方法
介绍了块分配算法后,现在回过来介绍块分配算法中与磨损均衡相关的策略。
littlefs中使用了一个简单的策略来实现均匀地分配:
- 使用lookahead buffer线性地分配块,这样在一次运行中块分配是循环磁盘均匀进行的
- 每次挂载文件系统时,将lookahead buffer推移一个随机的偏移量,这样在多次运行过程中,只要这个随机偏移量是均匀的,那么整体的分配也是均匀的
相关函数分析:
3. 定期重分配元数据所在块
littlefs中会定期进行元数据对应块的重分配,以防止元数据块的磨损。
每次元数据commit过程中因空间不足,而进行compact或split操作时,revision count也会随着更新。当revision count为block_cycles的整数倍时,会进行元数据对应块的重分配。其中,block_cycles为用户配置的值。
相关函数分析:
总结
本文介绍了littlefs中与磨损均衡相关的策略以及块分配算法,到这里littlefs文件系统原理分析系列文章已经结束。小编也是希望通过对littlefs文件系统的仔细分析,让相关读者更深入了解OpenHarmony LiteOS-A内核的文件系统的原理,而且littlefs文件系统也不仅仅是在OpenHarmony系统上使用,它也是一个广泛使用的小型文件系统,相信掌握它的原理对嵌入式开发者有着“鼎力相助”的作用。
更多原创内容请关注:深开鸿技术团队
入门到精通、技巧到案例,系统化分享OpenHarmony开发技术,欢迎投稿和订阅,让我们一起携手前行共建生态。
第一排!
写的很好,对于我学习littlefs,有很大的帮助!!博主辛苦!
完结撒花,学到了不少文件知识
坏块的处理学到了
一口气看完6篇,感谢分享
原来写入的数据还会和磁盘上的数据进行比较
感谢对littlefs文件系统的解读
不错不错,很详细