Littlefs的掉电安全设计

这篇具有很好参考价值的文章主要介绍了Littlefs的掉电安全设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1概述

Littlefs是arm公司设计的文件系统,其核心设计主要是掉电安全,在掉电安全的基础上,littlefs对资源开销、读写性能也进行了部分优化。本篇文章,主要讲述littlefs的掉电安全实现,并且不涉及到具体的代码逻辑,其他优化的讲解在其他文章中说明。

2掉电安全

2.1元数据类型

littlefs的数据类型有两种:真实的数据以及元数据,其中真实的数据是用户真正需要读写的数据,它的载体是文件,并且每个文件都会选择一个或者多个物理block来存储真实的数据,两个不同文件的数据不会同时存储到同一个物理block。元数据包括了目录的信息,以及部分用户不可见的信息(如创建,删除等日志信息),它的载体是目录,并且每个目录都会选择一个或者多个物理block来存储对当前目录的任意操作日志和管理数据,两个不同目录的元数据不会同时存储到同一个物理block。

元数据的格式为:

littlefs,数据结构,开发语言,c语言

元数据分为三个部分的内容,tag标识数据类型,说明本次操作的是目录,还是文件,是创建操作,还是删除擦嘴,data是具体的内容,如果是目录,则data的内容是目录所在的block编号,如果是文件,则data的内容为文件的首地址所在的block编号以及文件的大小。

描述文件信息的元数据为:

littlefs,数据结构,开发语言,c语言

Littlefs简化了文件的元数据信息,只需要文件的首地址块和文件大小,至于文件会占用哪些块,这个是文件自己通过ctz链表链接起来管理的。

描述目录信息的元数据为:

littlefs,数据结构,开发语言,c语言

同样,littlefs也简化了目录的元数据信息,创建一个目录后,父目录只需要知道目录所占据的首个块是哪个,至于目录会占用哪些块,这个是目录通过dir链表链接起来管理的。

2.2 场景分析

一个简单的拓扑结构为(三个目录,一个文件):

littlefs,数据结构,开发语言,c语言

如图所示的场景,一个目录对应了一个物理块,元数据块A对应的是目录A,目录A是目录C和目录B的父目录,文件A对应了两个块,常规数据块A和常规数据块B,常规数据块A中存在管理信息指向常规数据块B。

下面通过三个场景,来分析littlefs的掉电安全特性。

2.2.1写文件

写文件的过程为:

littlefs,数据结构,开发语言,c语言

                             (1)待写入

littlefs,数据结构,开发语言,c语言

                             (2)写常规数据

littlefs,数据结构,开发语言,c语言

                             (3)写元数据

主要分为两个阶段:写实际数据、写元数据,我们在这里模拟一下异常掉电的情况:

(1)写实际数据的时候掉电

写实际数据会先申请一个新的块,把对应的数据先更新到这个块上,并更新索引信息,指向下一个块。此时,掉电了,由于元数据没有更新,这个新的块不会被文件系统检索到,新写入的数据会丢失,但是旧数据和文件系统都是稳定的。

(2)写元数据的时候掉电

元数据通过CRC保护起来了,每提交一次修改,都会用crc进行校验,校验不通过的元数据,被认为是无用的数据。同一个文件的元数据随着写入次数的增加会有多份,但是只有最新写入的数据是有效的,在文件系统检索的时候,会剔除掉重复的元数据。此时,掉电了,新的元数据由于crc校验不过,所以,旧的元数据会生效,新写入的数据会丢失,但是旧数据和文件系统都是稳定的。

2.2.2删除文件

按照常规的理解,删除目录的过程,和写数据的过程类似,只需要提交对应的元数据到文件所在目录块即可,但是littlefs设计了一套dir list,将所有的目录所在的块串联成一个单链表,用于快速的遍历整个文件系统,所以,真实的拓扑结构为:

littlefs,数据结构,开发语言,c语言

在删除目录的时候,需要在父目录提交删除的管理信息,还需要在dir list的上游目录提交list修改的信息,共涉及到往两个目录块提交管理信息。具体的过程为:

littlefs,数据结构,开发语言,c语言

                             (1)删目录

littlefs,数据结构,开发语言,c语言

                             (2)修改dir list

模拟一下异常掉电的过程:

(1)父目录提交删除的管理信息时掉电

由于crc校验不通过,认为本次提交是无效的。

(2)父目录提交删除的管理信息后,往dir list的上游目录提交list修改的信息时掉电

在往父目录提交删除的管理信息时,提交了一个特殊的tag,叫movestate tag,标识着开始删除文件了,在往dir list的上游目录提交list修改的信息,也会提交一次movestate tag,标识着删除文件结束了。当文件系统mount的时候,会检查是否存在movestate异或不为0的情况,如果不为0,说明发生了开始,但是没有结束的操作,文件系统则可以继续没有完成的操作,往dir list的上游目录继续提交list修改的信息。所以,父目录提交删除的管理信息后,往dir list的上游目录提交list修改的信息时掉电,由于movestate异或不为0,文件系统重新mount后会继续删除操作。

2.2.3移动文件

移动文件需要在源目录块提交删除的管理信息,在目的目录块提交创建的管理信息,也涉及到了往两个目录块提交管理信息。具体的过程为:

littlefs,数据结构,开发语言,c语言

                         (1)待移动

littlefs,数据结构,开发语言,c语言

                         (2)删除

littlefs,数据结构,开发语言,c语言

                         (3)创建

移动目录的过程,和移动文件的过程是一致的,不会引起dir list的变动。

模拟一下异常掉电的过程:

(1)源目录块提交删除的管理信息时掉电

由于crc校验不通过,认为本次提交是无效的。

(2)源目录提交删除的管理信息后,在目的目录块提交创建的管理信息时掉电

在往源目录提交删除的管理信息时,提交了一个特殊的tag,叫movestate tag,标识着开始移动文件了,在往目的目录块提交创建的管理信息,也会提交一次movestate tag,标识着移动文件结束了。当文件系统mount的时候,会检查是否存在movestate异或不为0的情况,如果不为0,说明发生了开始,但是没有结束的操作,文件系统则可以继续没有完成的操作,往目的目录块提交创建的管理信息。所以,源目录提交删除的管理信息后,在目的目录块提交创建的管理信息时掉电,由于movestate异或不为0,文件系统重新mount后会继续移动操作。文章来源地址https://www.toymoban.com/news/detail-835828.html

到了这里,关于Littlefs的掉电安全设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构与算法的安全与隐私:保护数据和信息的关键

    数据结构和算法在计算机科学中起着至关重要的作用。它们为我们提供了一种高效地处理和存储数据的方法,使得我们能够更好地理解和解决复杂的问题。然而,随着数据的增长和技术的进步,保护数据和信息的安全和隐私变得越来越重要。因此,本文将探讨数据结构和算法

    2024年02月19日
    浏览(34)
  • 数据结构与算法设计分析—— 数据结构及常用算法

    1、顺序表与链表 线性表是 线性结构 ,是包含n个数据元素的有限序列,通过顺序存储的线性表称为 顺序表 ,它是将线性表中所有元素按照其逻辑顺序,依次存储到指定存储位置开始的一块连续的存储空间里;而通过链式存储的 链表 中,每个结点不仅包含该元素的信息,还

    2024年02月07日
    浏览(43)
  • 【数据结构】设计环形队列

    环形队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 环形队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元

    2024年02月09日
    浏览(84)
  • 数据结构课程设计

    编制一个能演示执行集合的交、并和差运算的程序。 要求: 集合元素用小写英文字母,执行各种操作应以对话方式执行。 算法要点:利用单链表表示集合;理解好三种运算的含义 分析 : 输入:输入应该具有判断是否为小写字母的功能,如果不是小写字母,应该舍去,同时

    2024年02月02日
    浏览(36)
  • JAVA数据结构篇--13线程安全的Set 集合

    前言:java 中用于存放不重复元素的set 集合,其中无序的HashSet,以及有序的LinkedHashSet和TreeSet 都是非线程安全的,那么多线程环境下,我们要存放不重复的元素,需要使用哪种集合进行数据存取; 1 使用: 2 过程: 2.1 放入获取元素: Collections.synchronizedSet:通过使用synchron

    2024年02月16日
    浏览(31)
  • 设计社交网络的数据结构

    Use Cases User 搜索某人然后看到被搜索人的最短路径 Service 有高可用 约束和假设 状态假设 Traffic 不是平均分布的 一些被搜索者是更加受欢迎的,某些被搜索者只会被搜索一次 图数据不适用与单个机器 图的分布是轻量级的 一亿个 User 每个 User 平均有 50 个朋友 十亿个搜索每个

    2024年01月20日
    浏览(34)
  • 数据密集型应用系统设计--3.1 数据库核心:数据结构

    3.1 数据库核心:数据结构 数据库只需做两件事情:向它插入数据肘,它就保存数据:之后查询时,它应该返回那些数据。 本章我们主要从数据库的角度再来探讨同样的问题,即如何存储输入的数据,井在收到查询请求时,怎样重新找到数据. 了解存储引擎的底层机制。 存储

    2024年01月24日
    浏览(36)
  • 一、课程设计目的与任务《数据结构》课程设计是为训练学生的数据组织能力和提高程序设计能力而设置的增强实践能力的课程。目的:学习数据结构课程,旨在使学生学会分析研究数据对象的特性,学会数据的组织方法,以

    一、课程设计目的与任务 《数据结构》课程设计是为训练学生的数据组织能力和提高程序设计能力而设置的增强实践能力的课程。目的:学习数据结构课程,旨在使学生学会分析研究数据对象的特性,学会数据的组织方法,以便选择合适的数据的逻辑结构和存储结构以及相应

    2024年02月21日
    浏览(43)
  • 【数据结构实训】哈希表设计

    [问题描述] 针对某个集体中人名设计一个哈希表,使得平均查找长度不超过2,并完成相应的建表和查表程序。 [基本要求] 假设人名为中国人姓名的汉语拼音形式。待填入哈希表的人名共有30个,取平均查找长度的上限为2。哈希函数用除留余数法构造,用线性探测再散列法或

    2024年02月11日
    浏览(32)
  • 数据结构OJ:设计循环队列

    本题为LeetCode上的经典题目,题目要求我们设计一种循环队列,满足FIFO原则且队尾被连接在队首之后。 题目中介绍循环队列的好处是可以重复利用空间,所以我们很容易想到在初始化时即开辟指定大小的空间,之后便不需要再开辟空间,只需后续销毁即可。 首先我们要选择

    2024年04月17日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包