littlefs系列:metadata pairs

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。

https://blog.csdn.net/nstcl/article/details/108051141

猜你喜欢

转载自blog.csdn.net/tjcwt2011/article/details/113102562