littlefs源码分析1-设计思考

news2024/10/24 17:34:48

1.littlefs设计目的

littlefs 最初是作为一个实验而构建的,目的是在微控制器的环境中了解文件系统设计。目的是:构建一个在不使用无限制内存的情况下对电源丢失和闪存磨损具有弹性的文件系统。
这对嵌入式文件系统littlefs提出了三个主要要求:

  1. 断电恢复能力——在这些系统上,电力可能随时中断。如果断电损坏了任何持久数据结构,可能会导致设备无法恢复。嵌入式文件系统必须设计成能够在任何写入操作期间从断电情况中恢复。
  2. 磨损均衡 - 写入闪存具有破坏性。如果文件系统反复写入同一区块,最终该区块将磨损。不考虑磨损的文件系统很容易耗尽用于存储频繁更新的元数据的区块,并导致设备过早损坏。
  3. 有限的 RAM/ROM——如果上述要求还不够,这些系统的内存量也非常有限。这使得许多现有的文件系统设计无法实现,因为这些设计可能依赖相对大量的 RAM 来临时存储文件系统元数据。
    因此,这也是我们此次分析的目的,也就是它是用什么方式和代码实现来完成上述的特性。我们聚焦如下:
  4. 磨损均衡:
    • 目的: 均衡闪存中每个块的擦写次数,以延长存储介质的使用寿命。
    • 关键特性:
      • 跟踪每个块的擦写次数。
      • 动态分配新的块来替换频繁使用的块。
      • 保证数据迁移时的一致性。
  5. 掉电安全:
    • 目的: 在突然断电的情况下,确保文件系统的数据一致性。
    • 关键特性:
      • 日志结构设计,确保所有更改都是原子提交。
      • 写时复制(Copy-on-Write, CoW)技术,避免部分更新。
      • 元数据和用户数据分离,减少损坏范围。
      • 自动恢复机制,在启动时检查并回滚未完成的事务。
  6. 配置问题:
    • 目的:针对不同的硬件和开发环境,给出配置建议。

2.现有设计

目前已经有许多不同的文件系统,它们经常相互共享和借鉴特性。如果我们考虑掉电恢复能力和磨损均衡,我们可以将这些缩小到少数几种设计。

1.块文件系统(FAT和ext2)
首先,我们有非弹性的、基于块的文件系统,例如 FAT 和 ext2。这些是最早的文件系统设计,通常也是最简单的。在这里,存储被划分为块,每个文件存储在一组块中。如果不进行修改,这些文件系统不具有掉电恢复能力,因此更新文件就像重写块一样简单。

由于它们的简单性,这些文件系统通常是最快且最小的。然而,缺乏电源弹性不是很好,并且存储位置和数据的绑定关系消除了文件系统管理磨损的能力。
![[FAT.png]]

2.日志文件系统(JFFS、YAFFS和SPIFFS):
在一个完全不同的方向上,我们有日志文件系统,例如JFFS、YAFFS和SPIFFS,存储位置不与一块数据绑定,相反,整个存储用于一个循环日志,每次对文件系统进行更改时都会追加到该日志中。写入会追加新的更改,而读取需要遍历日志以重建文件。一些日志文件系统会缓存文件以避免读取成本,但这是以 RAM 为代价的。

日志文件系统非常优雅。通过校验和,我们可以轻松检测到电源故障,并通过忽略失败的追加操作回退到先前的状态。如果这还不够好,它们的循环性质意味着日志文件系统可以完美地在存储设备上
均匀分布磨损。
![[log.png]]

3.基于块的文件系统与日志文件系统结合(ext4、NTFS)
常见的文件系统类型还有:日志文件系统是当基于块的文件系统与日志文件系统的结合。ext4和NTFS是很好的例子。在这里,我们采用一个普通的基于块的文件系统,并添加一个有界日志,在每次更改发生之前我们都会在其中记录下来。

这种文件系统兼具两者的优点。性能可以像基于块的文件系统一样快(尽管更新日志确实有一点成本),并且对日志的原子更新允许文件系统在断电的情况下恢复。

但是,日志文件系统有几个问题。它们相当复杂,因为实际上有两个文件系统并行运行,这带来了代码大小的成本。它们也不能防止磨损,因为存储位置和数据之间有很强的关系。
![[block+log.png]]

4.写时复制(COW)文件系统(btrfs和ZFS):
写时复制文件系统与其他基于块的文件系统非常相似,但不是就地更新块,而是通过创建带有更改的副本并将对旧块的任何引用替换为我们的新块来执行所有更新。这会递归地将我们所有的问题向上推,直到我们到达文件系统的根,而文件系统的根通常存储在一个非常小的日志中。

COW 文件系统很有趣。它们提供与基于块的文件系统非常相似的性能,同时能够在不直接将数据更改存储在日志中的情况下实现原子更新。它们甚至将数据的存储位置分离,这为磨损均衡创造了机会。

限制的向上更新运动带来了一些问题。因为对写时复制文
件系统的更新在到达根目录之前不会停止,所以一次更新可能会级联成比原始数据所需的更大的一组写入操作。除此之外,向上的运动将这些写入操作集中到块中,这可能会比文件系统的其他部分更早地磨损。
![[COW.png]]

3.littlefs的借鉴实现

我们查看现有的文件系统,有两种有趣的设计模式脱颖而出,但每种模式都有自己的一系列问题。

  • 日志记录提供了独立的原子性,但运行时性能较差。
  • 写时复制(COW)数据结构性能良好,但将原子性问题向上推。

littlefs的理念:

  • 在小块级别,littlefs 由小型的两个块的日志构建而成,这些日志为文件系统上任何位置的元数据提供原子更新。
  • 在大块级别,littlefs 是一个按需可驱逐的块的写时复制(Copy-on-Write)树。
    它的核心是元数据对,也就是metadata pairs。这些是小的、两个块的日志,允许在文件系统中的任何位置进行原子更新。

为什么是两个块呢?嗯,日志通过将条目附加到存储在磁盘上的循环缓冲区来工作。但是请记住,闪存的写入粒度有限。我们可以将新数据增量式地编程到已擦除的块上,但我们需要一次擦除一整个块。这意味着为了使我们的循环缓冲区正常工作,我们需要不止一个块。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2222574.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】 exit 和 _exit 的区别

在Linux系统中&#xff0c;exit(int status) 和 _exit(int status) 都是用来终止进程的函数&#xff0c;都能通过参数 int status传递一个整型的退出状态码给父进程&#xff0c;但它们之间有一些重要的区别。 1. 头文件不同 exit() 函数定义在 <unistd.h> 中 _exit() 函…

【Python爬虫实战】高效解析和操作XML/HTML的实用指南

&#x1f308;个人主页&#xff1a;https://blog.csdn.net/2401_86688088?typeblog &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、lxml的安装 &#xff08;一&#xff09;使用 pip 安装 &#xff08;二&…

(一)ubuntu下通过c++编译cpu版本paddleocr-2.8.1

编译环境 操作系统&#xff1a;ubuntu 20.04/22.04 OCR版本&#xff1a;paddleocr 2.8.1 Opencv版本&#xff1a;opencv3.4.16/4.10.0 o参照官方文档&#xff1a; PaddleOCR/deploy/cpp_infer/readme_ch.md at release/2.6 PaddlePaddle/PaddleOCR GitHubhttps://github…

Vue3脚手架和指令

什么是Vue&#xff1f; 简单来说&#xff0c;vue就是可以让有写代码很爽的体验。 概念&#xff1a;Vue是一套构建用户界面的渐进式JavaScript框架。 什么是构建用户界面&#xff1f; 基于数据渲染出用户可以看到的界面 什么是渐进式&#xff1f; 渐进式就是循序渐进的学习…

LabVIEW提高开发效率技巧----VI继承与重载

在LabVIEW开发中&#xff0c;继承和重载是面向对象编程&#xff08;OOP&#xff09;中的重要概念。通过合理运用继承与重载&#xff0c;不仅能提高代码的复用性和灵活性&#xff0c;还能减少开发时间和维护成本。下面从多个角度介绍如何在LabVIEW中使用继承和重载&#xff0c;并…

HttpURLConnection构造请求体传文件

HttpURLConnection构造请求体传文件 在Java中&#xff0c;使用HttpURLConnection构造请求体传输文件&#xff0c;你需要做以下几步&#xff1a; 1、创建URL对象指向你想要请求的资源。 2、通过URL打开连接&#xff0c;转换为HttpURLConnection实例。 3、设置请求方法为POST。 …

Java 多线程(五)—— 阻塞队列、wait、notify

wait wait 和 notify 都是 Object 类提供的方法&#xff0c;也就是说 Java 任意对象都可以使用 这两个方法。 首先 wait 会抛出 InterruptedException 这个异常&#xff0c;说明这个方法可以被 interrupt 给唤醒。 然后我们是不能直接使用 wait 方法的&#xff0c;否则还会抛…

Win10系统安装docker操作步骤

Docker下载 docker下载地址&#xff1a;Docker: Accelerated Container Application Development 打开网页后&#xff0c;点击图下所示&#xff0c;下载windows版本的docker 启用Hyper-V 和容器特性 右键左下角windows图标&#xff0c;选择应用和功能 然后在下面的界面中&am…

电脑技巧:Rufus——最佳USB启动盘制作工具指南

目录 一、功能强大&#xff0c;兼容性广泛 二、界面友好&#xff0c;操作简便 三、快速高效&#xff0c;高度可定制 四、安全可靠&#xff0c;社区活跃 在日常的电脑使用中&#xff0c;无论是为了安装操作系统、修复系统故障还是进行其他需要可引导媒体的任务&#xff0c;拥…

初始JavaEE篇——多线程(2):join的用法、线程安全问题

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaEE 目录 模拟实现线程中断 join的用法 线程的状态 NEW&#xff1a; RUNNABLE&#xff1a; TIMED_WAITING&#xff1a; TERMINATED…

ElasticSearch-7.17.10集群升级至ElasticSearch-7.17.24

文章目录 集群概览 主机名系统版本es01CentOS_7.6-aaarch64ElasticSearch-7.17.10es02CentOS_7.6-aaarch64ElasticSearch-7.17.10es03CentOS_7.6-aaarch64ElasticSearch-7.17.10 需求 1. 将三台ES节点从ElasticSearch-7.17.10升级至ElasticSearch-7.17.24&#xff1b; 2. 保证…

1212,查询球队积分

查询球队积分 表: Teams ------------------------- | Column Name | Type | ------------------------- | team_id | int | | team_name | varchar | ------------------------- team_id 是该表具有唯一值的列。 表中的每一行都代表一支独立足球队。表…

HarmonyOS 模块化设计

1.HarmonyOS 模块化设计 模块化设计文档   应用程序包开发与使用文档 1.1. 概述 组件化一直是移动端比较流行的开发方式&#xff0c;有着编译运行快&#xff0c;业务逻辑分明&#xff0c;任务划分清晰等优点&#xff0c;HarmonyOs组件化的使用&#xff0c;有利于模块之间的解…

【WRF数据准备】地形-SRTM的3s高分辨率地形数据集

【WRF数据准备】地形-SRTM的3s高分辨率地形数据集 数据概述数据下载 数据处理合并多个SRTM 数据-GDAL库转为geogrid二进制格式WPS 中的设置 数据对比海洋区域缺省值参考 WRF中地形数据&#xff08;海拔高度&#xff09;分辨率最高为30s&#xff0c;差不多就是900 m&#xff0c;…

CST光子晶体微谐振腔分析和Q值提取

本期介绍基于文献[1]的一种二维光子晶体波导结构&#xff0c;利用路径上加微谐振腔来实现一些特殊的滤波功能。一般是要看谐振频率的变化和Q值变化&#xff0c;因为工艺误差或任何造成结构不规则的因素对这样细小的结构谐振来说影响非常大。下图为文献中提到的硅薄膜结构&#…

使用Jenkins持续集成的一些经验总结!

01、Performance插件兼容性问题 自由风格项目中&#xff0c;有使用 Performance 插件收集构建产物&#xff0c;但是截至到目前最新版本&#xff08;Jenkins v2.298&#xff0c;Performance&#xff1a;v3.19&#xff09;&#xff0c;此插件和Jenkins都存在有兼容性问题&#x…

业余时间试一试利用AI 人工智能赚钱

内容创作与写作&#xff1a; 撰写文章&#xff1a;许多网站、博客和企业都需要大量的优质内容。利用 AI 工具如 ChatGPT 等&#xff0c;获取文章的思路、框架甚至初稿&#xff0c;然后根据自己的知识和经验进行修改、润色和完善。你可以在一些自由撰稿人平台、内容创作平台上承…

autumn是 “秋天”,year是 “年”,那autumn years是什么意思?柯桥商务剑桥英语学习外贸口语

autumn是“秋天”&#xff0c;year是“年”&#xff0c; 那你知道 autumn years 是什么意思&#xff1f; autumn years是什么意思&#xff1f; autumn years 直译为“秋天的15857575376*年”&#xff0c;但这样的理解并不准确&#xff0c;《剑桥辞典》中对这个词组的英文解释…

如何评估检索增强型生成(RAG)应用

RAG&#xff0c;也就是检索增强型生成&#xff0c;是现在大型语言模型&#xff08;LLMs&#xff09;时代里的一个超火的AI框架&#xff0c;比如你知道的ChatGPT。它通过把外面的知识整合进来&#xff0c;让这些模型变得更聪明&#xff0c;能给出更准确、更及时的回答。详见前篇…

[WiFi] Wi-Fi HaLow: IEEE 802.11ah 无线网络协议介绍

参考链接 802.11ah&#xff08;HaLow&#xff09;协议解析1&#xff1a;协议简介 - 知乎 802.11ah&#xff08;HaLow&#xff09;协议解析3&#xff1a;物理层改进 - 知乎 Wi-Fi HaLow: IEEE 802.11ah Wireless Networking Protocol - IoTEDU Wi-Fi CERTIFIED HaLow | Wi-F…