博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
littlefs系列:metadata pairs
阅读量:4223 次
发布时间:2019-05-26

本文共 991 字,大约阅读时间需要 3 分钟。

metadata pairs是littlefs的基石。metadata pairs是两个可以原子更新的block log。

为什么要使用两个block呢?

原因如下:1,log的工作原理是所有的entry否存储在一个环形buffer中。由于flash的擦写特性,需要用两个block来互相备份。2,也可以使用更多的block,但是需要额外的数据结构来跟踪所有的block,代价较高。

1 metadata pairs中如何确定哪个metadata block是最新的呢?

使用revision count

 

 

 

从上图中可以看出,block1对应的metadata是最新的。

 

2 metadata pair的更新

metadata pair要求更新时时原子操作。即要求metadata pair的更新操作具备冗余性和错误检测。

错误检测通过32-bit的crc实现。而冗余性则稍微复杂一点:

1) 当前的block有足够的剩余空间,则直接写入

 

注意:在littlefs中的metadata中,不是每个entry都有一个crc,littlefs会对存储在同一个block上的多个entry打包提供一个crc。

 

在上图中entry B和A'共享一个checksum。

2)当前的block没有足够的空间,启动entry compaction。在entry compaction时,对于每个entry查看是否有更新的entry,每次都是把所有最新的entry写入到新的block中,这也说明了为什么metadata pair使用两个block的好处。在entry compaction中,新的metadata block的revision count会增加,同时也会对多个entry打包写入。

 

3)metadata block完全写满且没有待回收的garbage entry。把原始的metadata pair分成两个metadata pairs,占用4个block。每个metadata pairs中包含一般的entry,通过指针链接

 

在上图中可以看出,原本的metadata pair分成了两组metadata pairs。为了提高metadata pair的更新效率,littlefs在实现时,只要metadata pair使用了超过50%的容量就会分成两个metadata pairs。

转载地址:http://cuemi.baihongyu.com/

你可能感兴趣的文章
Java中的ReentrantLock和synchronized两种锁定机制的对比
查看>>
视频会议及流媒体十大开源项目
查看>>
adb 用法大全
查看>>
经常用到的Android UI、开源项目及库
查看>>
第一次有人把5G讲的这么简单明了!
查看>>
RTSP/RTMP/HTTP/ QUIC/UDT/SRT
查看>>
Android Rxjava:这是一篇 清晰 & 易懂的Rxjava 入门教程
查看>>
Android自定义View的三种实现方式
查看>>
Coroutine,你究竟干了什么?
查看>>
代码宏的一点小知识
查看>>
Coroutine,你究竟干了什么?(小续)
查看>>
Sweet Snippet系列 之 随机选择
查看>>
Sweet Snippet 系列之 Lua表排序
查看>>
名人•牛人•我们这些普通人
查看>>
小话游戏脚本(一)
查看>>
数学笔记(二)之平面表示
查看>>
HGE系列之零 使用细究
查看>>
爬坑笔记
查看>>
再谈谈列表元素的删除
查看>>
小聊聊NGUI中Panel的Clip功能(之二)
查看>>