littlefs原理分析—磨损均衡(六)
littlefs原理分析—磨损均衡(六)
作者:蒋卫峰 李涛 2022-11-22 15:21:55系统 OpenHarmony 本文介绍了littlefs中与磨损均衡相关的策略以及块分配算法。想了解更多关于开源的内容,请访问:
51CTO开源基础软件社区
https://ost.51cto.com
前言
前面已经对littlefs的原理分析了5篇文章,内容包括了:
littlefs整体的存储结构commit机制fetch操作目录操作文件读写操作本文是littlefs原理分析系列最后一篇文章,主要介绍littlefs中与磨损均衡相关的策略,同时也会对其中的块分配算法进行介绍。
littlefs有以下防止磨损相关的措施:
写时坏块的检测和写入恢复。均匀地进行块的分配:由块分配算法实现。定期重分配元数据所在块。1、写时坏块的检测和写入恢复
littlefs中当进行文件、目录元数据等的写入时,最后会调用函数lfs_bd_flush将数据最终写入到磁盘。lfs_bd_flush函数写入完后,会将内存中写入的数据和磁盘上的数据进行比较。如果数据不一致,则可能是坏块。
方法如下:
写入时通过回读磁盘上的数据进行验证,来检测坏块。检测到坏块后,清除坏块,重新分配块,然后重新写入。lfs_bd_flush函数检查数据是否一致部分的分析如下:
// 当将缓存中的数据回写到磁盘时,检测坏块lfs_bd_flush(lfs_t *lfs,| lfs_cache_t *pcache, lfs_cache_t *rcache, bool validate) | ...|| // 调用lfs_bd_cmp比较磁盘上的数据是否与写入的数据相同| // 如果不同则可能遇到了坏块|-> if (validate) {| lfs_bd_cmp(lfs,| NULL, rcache, diff,| pcache->block, pcache->off, pcache->buffer, diff); | }||->...如在文件写入数据时,在函数lfs_file_flush中,检测到坏块时会重新分配块再进行写入操作:
lfs_file_flush(lfs_t *lfs, lfs_file_t *file)|-> ...||-> while (true) {| // 调用lfs_bd_flush写入数据,并比较数据是否写入正确| int err = lfs_bd_flush(lfs, &file->cache, &lfs->rcache, true);| if (err) {| // 检测到坏块则跳转到relocate| if (err == LFS_ERR_CORRUPT) {| goto relocate;| }| return err;| }| break;|| relocate:| // 重新分配块并再次进行写入操作| LFS_DEBUG("Bad block at 0x%"PRIx32, file->block);| err = lfs_file_relocate(lfs, file);| if (err) {| return err;| }| }2、块分配
(1)lookahead buffer
littlefs中使用一个lookahead buffer来管理和分配块。lookahead buffer是一个固定大小的bitmap,记录一片区域内块分配的信息。
lookahead buffer图例如下,其中假设总共有64个块,lookahead buffer的大小为8,lookahead buffer对应块中现分配了文件A、D和目录B、C的块:
lookahead buffer相关数据结构如下:
struct lfs_free {lfs_block_t off; // lookahead所有block整体的偏移lfs_block_t size;// lookahead中块的总数lfs_block_t i; // 在lookahead_size中的索引,表示当前位于第几个blocklfs_block_t ack; // 所有剩余空闲block个数uint32_t *buffer;// lookahead的bitmap块管理缓存区} free;(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_alloc(lfs_t *lfs, lfs_block_t *block)| ...|| // 当lookahead buffer中没有空闲块时,需进行扫描|| // 1. 推移lookahead buffer|-> lfs->free.off = (lfs->free.off + lfs->free.size)|% lfs->cfg->block_count;| lfs->free.size = lfs_min(8*lfs->cfg->lookahead_size, lfs->free.ack);| lfs->free.i = 0;|| // 2. 将lookahead buffer清0|-> memset(lfs->free.buffer, 0, lfs->cfg->lookahead_size);|| // 3. 遍历文件系统进行扫描和查找|-> lfs_fs_rawtraverse(lfs, lfs_alloc_lookahead, lfs, true);||->...其中,lfs_fs_rawtraverse函数会从超级块开始遍历整个文件系统,对整个文件系统中所有已经分配的块调用回调函数lfs_alloc_lookahead。lfs_alloc_lookahead函数分析如下:
// lfs_fs_rawtraverse函数传入到lfs_alloc_lookahead函数的参数// 分别为lfs结构体指针p,和块号blocklfs_alloc_lookahead(void *p, lfs_block_t block)|-> lfs_t *lfs = (lfs_t*)p;|| // 获取块号相对lookahead buffer的偏移|-> lfs_block_t off = ((block - lfs->free.off)| + lfs->cfg->block_count) % lfs->cfg->block_count;|| // 若该块处于lookahead buffer所管理的范围内,| // 则设置bitmap对应位,表示该块已分配|-> if (off < lfs->free.size) {| lfs->free.buffer[off / 32] |= 1U << (off % 32);| }| return 0;(3)块分配算法
块分配算法的过程总结:首先尝试从lookahead buffer中找到下一个空闲块,若没有则将lookahead buffer位置推移一个lookahead_size,执行上一小节中的扫描和查找文件系统过程,再尝试从lookahead buffer中找到下一个空闲块,以此循环进行。
以下为几次分配和扫描的示例:
boot... lookahead:fs blocks: fffff9fffffffffeffffffffffff0000scanning... lookahead: fffff9fffs blocks: fffff9fffffffffeffffffffffff0000alloc = 21lookahead: fffffdfffs blocks: fffffdfffffffffeffffffffffff0000alloc = 22lookahead: fffffffffs blocks: fffffffffffffffeffffffffffff0000scanning... lookahead: fffffffefs blocks: fffffffffffffffeffffffffffff0000alloc = 63lookahead: fffffffffs blocks: ffffffffffffffffffffffffffff0000scanning... lookahead: fffffffffs blocks: ffffffffffffffffffffffffffff0000scanning... lookahead: fffffffffs blocks: ffffffffffffffffffffffffffff0000scanning... lookahead: ffff0000fs blocks: ffffffffffffffffffffffffffff0000alloc = 112 lookahead: ffff8000fs blocks: ffffffffffffffffffffffffffff8000(4)均匀分配方法
介绍了块分配算法后,现在回过来介绍块分配算法中与磨损均衡相关的策略。
littlefs中使用了一个简单的策略来实现均匀地分配:
使用lookahead buffer线性地分配块,这样在一次运行中块分配是循环磁盘均匀进行的。每次挂载文件系统时,将lookahead buffer推移一个随机的偏移量,这样在多次运行过程中,只要这个随机偏移量是均匀的,那么整体的分配也是均匀的。相关函数分析:
lfs_mount(lfs_t *lfs, const struct lfs_config *cfg)|-> lfs_rawmount(lfs_t *lfs, const struct lfs_config *cfg)|-> ...|| // 1. 计算随机数|-> lfs_dir_fetchmatch(...)|-> ...|| // 使用crc计算随机数|-> lfs->seed = lfs_crc(lfs->seed, &crc, sizeof(crc));||-> ...|| // 2. 随机对lookahead buffer进行偏移|-> lfs->free.off = lfs->seed % lfs->cfg->block_count;3、定期重分配元数据所在块
littlefs中会定期进行元数据对应块的重分配,以防止元数据块的磨损。
每次元数据commit过程中因空间不足,而进行compact或split操作时,revision count也会随着更新。当revision count为block_cycles的整数倍时,会进行元数据对应块的重分配。其中,block_cycles为用户配置的值。
相关函数分析:
lfs_dir_compact(lfs_t *lfs,| lfs_mdir_t *dir, const struct lfs_mattr *attrs, int attrcount,| lfs_mdir_t *source, uint16_t begin, uint16_t end) |-> ...|| // revision count为block_cycles的整数倍时,进行元数据对应块的重分配|-> if (lfs->cfg->block_cycles > 0 &&| (dir->rev % ((lfs->cfg->block_cycles+1)|1) == 0)) {| ...|| // we're writing too much, time to relocate| tired = true;| goto relocate;| }||-> ...|| relocate:|->...总结
本文介绍了littlefs中与磨损均衡相关的策略以及块分配算法,到这里littlefs文件系统原理分析系列文章已经结束。小编也是希望通过对littlefs文件系统的仔细分析,让相关读者更深入了解OpenHarmony LiteOS-A内核的文件系统的原理,而且littlefs文件系统也不仅仅是在OpenHarmony系统上使用,它也是一个广泛使用的小型文件系统,相信掌握它的原理对嵌入式开发者有着“鼎力相助”的作用。
想了解更多关于开源的内容,请访问:
51CTO开源基础软件社区
https://ost.51cto.com。
责任编辑:jianghua 来源:51CTO开源基础软件社区 littlefs磨损均衡推荐系统
电脑公司Ghost Win8.1 x32 精选纯净版2022年7月(免激活) ISO镜像高速下载
语言:中文版系统大小:2.98GB系统类型:Win8电脑公司Ghost Win8.1x32位纯净版V2022年7月版本集成了自2022流行的各种硬件驱动,首次进入系统即全部硬件已安装完毕。电脑公司Ghost Win8.1x32位纯净版具有更安全、更稳定、更人性化等特点。集成最常用的装机软件,精心挑选的系统维护工具,加上绿茶独有
微软Win11原版22H2下载_Win11GHOST 免 激活密钥 22H2正式版64位免费下载
语言:中文版系统大小:5.13GB系统类型:Win11微软Win11原版22H2下载_Win11GHOST 免 激活密钥 22H2正式版64位免费下载系统在家用办公上跑分表现都是非常优秀,完美的兼容各种硬件和软件,运行环境安全可靠稳定。Win11 64位 Office办公版(免费)优化 1、保留 Edge浏览器。 2、隐藏“操作中心”托盘图标。 3、保留常用组件(微软商店,计算器,图片查看器等)。 5、关闭天气资讯。
Win11 21H2 官方正式版下载_Win11 21H2最新系统免激活下载
语言:中文版系统大小:4.75GB系统类型:Win11Ghost Win11 21H2是微软在系统方面技术积累雄厚深耕多年,Ghost Win11 21H2系统在家用办公上跑分表现都是非常优秀,完美的兼容各种硬件和软件,运行环境安全可靠稳定。Ghost Win11 21H2是微软最新发布的KB5019961补丁升级而来的最新版的21H2系统,以Windows 11 21H2 22000 1219 专业版为基础进行优化,保持原汁原味,系统流畅稳定,保留常用组件
windows11中文版镜像 微软win11正式版简体中文GHOST ISO镜像64位系统下载
语言:中文版系统大小:5.31GB系统类型:Win11windows11中文版镜像 微软win11正式版简体中文GHOST ISO镜像64位系统下载,微软win11发布快大半年了,其中做了很多次补丁和修复一些BUG,比之前的版本有一些功能上的调整,目前已经升级到最新版本的镜像系统,并且优化了自动激活,永久使用。windows11中文版镜像国内镜像下载地址微软windows11正式版镜像 介绍:1、对函数算法进行了一定程度的简化和优化
微软windows11正式版GHOST ISO镜像 win11下载 国内最新版渠道下载
语言:中文版系统大小:5.31GB系统类型:Win11微软windows11正式版GHOST ISO镜像 win11下载 国内最新版渠道下载,微软2022年正式推出了win11系统,很多人迫不及待的要体验,本站提供了最新版的微软Windows11正式版系统下载,微软windows11正式版镜像 是一款功能超级强大的装机系统,是微软方面全新推出的装机系统,这款系统可以通过pe直接的完成安装,对此系统感兴趣,想要使用的用户们就快来下载
微软windows11系统下载 微软原版 Ghost win11 X64 正式版ISO镜像文件
语言:中文版系统大小:0MB系统类型:Win11微软Ghost win11 正式版镜像文件是一款由微软方面推出的优秀全新装机系统,这款系统的新功能非常多,用户们能够在这里体验到最富有人性化的设计等,且全新的柔软界面,看起来非常的舒服~微软Ghost win11 正式版镜像文件介绍:1、与各种硬件设备兼容。 更好地完成用户安装并有效地使用。2、稳定使用蓝屏,系统不再兼容,更能享受无缝的系统服务。3、为
雨林木风Windows11专业版 Ghost Win11官方正式版 (22H2) 系统下载
语言:中文版系统大小:4.75GB系统类型:雨林木风Windows11专业版 Ghost Win11官方正式版 (22H2) 系统下载在系统方面技术积累雄厚深耕多年,打造了国内重装系统行业的雨林木风品牌,其系统口碑得到许多人认可,积累了广大的用户群体,雨林木风是一款稳定流畅的系统,一直以来都以用户为中心,是由雨林木风团队推出的Windows11国内镜像版,基于国内用户的习惯,做了系统性能的优化,采用了新的系统
雨林木风win7旗舰版系统下载 win7 32位旗舰版 GHOST 免激活镜像ISO
语言:中文版系统大小:5.91GB系统类型:Win7雨林木风win7旗舰版系统下载 win7 32位旗舰版 GHOST 免激活镜像ISO在系统方面技术积累雄厚深耕多年,加固了系统安全策略,雨林木风win7旗舰版系统在家用办公上跑分表现都是非常优秀,完美的兼容各种硬件和软件,运行环境安全可靠稳定。win7 32位旗舰装机版 v2019 05能够帮助用户们进行系统的一键安装、快速装机等,系统中的内容全面,能够为广大用户
相关文章
- 怎么使用迅捷视频转换器将QLV格式视频制成GIF动图
- win7 探索者2006
- 电脑屏幕亮度怎么调节 电脑屏幕亮度调节方法
- 电脑怎么设置U盘为第一启动项?
- Win10系统更改了hosts文件后不能保存
- 浅谈G行基于主机安全能力框架的安全运营实践
- 宏碁笔记本Win8系统如何开启无线网卡
- 笔记本怎么重装系统小白系统重装教程
- win7系统下安装iebook的具体步骤
- WinXP系统下XLSX文件怎样打开?
- 华硕笔记本怎么分区 华硕笔记本分区方法
- 微信键盘 Windows 版 Beta 0.9.0 发布:支持 Win7 及以上系统 - IT之家
- win7如何用光盘装系统
- 微软 Win11 22H2“Moment 3”配置更新:新增中文实时字幕 时钟可显示秒数 - IT之家
- win10 64位专业版最新系统推荐
- 怎样处理Win8硬盘参数出错的问题
- win10迅速打开,本文教您win10设置迅速打开办法
- cod19使命召唤19画面卡顿/卡在正在登入demonware解决办法
热门系统
- 1华硕笔记本&台式机专用系统 GhostWin7 32位正式旗舰版2018年8月(32位)ISO镜像下载
- 2深度技术 Windows 10 x86 企业版 电脑城装机版2018年10月(32位) ISO镜像免费下载
- 3雨林木风 Ghost Win7 SP1 装机版 2020年4月(32位) 提供下载
- 4电脑公司 装机专用系统Windows10 x86喜迎国庆 企业版2020年10月(32位) ISO镜像快速下载
- 5深度技术 Windows 10 x86 企业版 六一节 电脑城装机版 版本1903 2022年6月(32位) ISO镜像免费下载
- 6深度技术 Windows 10 x64 企业版 电脑城装机版2021年1月(64位) 高速下载
- 7新萝卜家园电脑城专用系统 Windows10 x64 企业版2019年10月(64位) ISO镜像免费下载
- 8新萝卜家园 GhostWin7 SP1 最新电脑城极速装机版2018年8月(32位)ISO镜像下载
- 9电脑公司Ghost Win8.1 x32 精选纯净版2022年5月(免激活) ISO镜像高速下载
- 10新萝卜家园Ghost Win8.1 X32 最新纯净版2018年05(自动激活) ISO镜像免费下载
热门文章
常用系统
- 1Win10 22H2正式版百度云下载_Win10 22H2(19045.2130)百度网盘下载
- 2新萝卜家园Ghost Win8.1 X64位 纯净版2021年10月(自动激活) ISO镜像高费下载
- 3雨林木风 GHOST WIN7 SP1 X64 经典珍藏版 V2018.05(64位) 下载
- 4电脑公司 GHOST XP SP3 快速装机版 V2015.01 下载
- 5Win10极限精简300MB系统下载_300MB大小Win10精简版下载V2021
- 6风林火山 Ghost Win10 专业正式版下载_风林火山 Ghost Win10 镜像正式版下载
- 7风林火山Win7系统iso镜像下载_风林火山 Win7 32位旗舰版系统下载
- 8深度技术Ghost Win8.1 x32位 特别纯净版2021年3月(免激活) ISO镜像高速下载
- 9Win11游戏专用系统下载_游戏专用Ghost Win11 64位免费激活版iso镜像下载
- 10Win11办公版系统下载_Win11 22h2 办公优化版系统2023.02下载