#键值 #键值存储 #闪存 # #内存 #循环 #文件

无std tickv

TicKV (小型循环键值) 是一个小的文件系统,允许键值对存储在闪存中

1个稳定版本

1.0.0 2022年5月22日

#138数据库实现


用于 product-os-store

MIT/Apache

115KB
2K SLoC

TicKV

TicKV (小型循环键值) 是一个小的文件系统,允许键值对存储在闪存中。

TicKV是为了让Tock OS内核能够在闪存中持久存储应用数据而编写的。虽然它被设计为通用的,但其他Rust应用也可以使用它。

TicKV基于与Yaffs1相似的概念。

TicKV的目标

TicKV设计时考虑了以下主要目标(按顺序)

  • 完全使用no_std Rust实现
  • 具有电源损失恢复能力
  • 保持数据完整性并检测媒体错误
  • 磨损平衡
  • 低内存使用
  • 低存储开销
  • 不使用外部crate(不包括单元测试)

TicKV还基于以下假设

  • 大多数操作将是检索键
  • 一些操作将是存储键
  • 很少会删除键
  • 很少需要修改键值

系统保证

成功写入或擦除是持久提交的。

设计不支持并发,因此它对所有读取、写入和删除操作施加了总顺序。因此,单个操作是原子的。需要更高级别原子性的应用程序(例如,读/修改/删除/写入,多次写入)需要在这些操作之上构建。

TicKV对低级闪存故障、电源损失或系统崩溃不稳健。然而,失败只会影响单个键:无法写入或删除键K将最多只损坏K。读取的值将不会有任何影响。

在底层闪存操作成功的前提下,TicKV 提供原子性。如果底层闪存出现错误,系统在操作过程中崩溃,或者操作过程中断电,一个操作可能会部分提交。

如果写入失败,只写入到闪存中整个键的长度,则整个键的长度将用于存储。

TicKV 确保持久性,一旦事务完成并被提交到闪存,它将保持在那里。TicKV 还采取措施将磨损均衡应用于闪存存储。

使用 TicKV

请参阅生成的 Rust 文档以获取如何在项目中使用此功能的详细信息。

TicKV 的工作原理

与常规文件系统(FS)不同,TicKV 只设计用于在闪存中存储键/值(KV)对。它不支持写入实际文件、目录或其他复杂对象。尽管可以在其上添加传统的文件系统层以添加此类功能。

TicKV 允许写入新的键/值对(通过追加它们)和删除旧的键/值对。

TicKV 有两种重要类型:区域和对象。

TicKV 区域是可以单次命令擦除的最小闪存内存区域。

TicKV 从闪存保存和恢复对象。TicKV 对象包含用户想要存储的值以及额外的头部数据。对象是 TicKV 内部的,用户不需要详细了解它们即可使用。

有关技术实现的更多详细信息,请参阅 SPEC.md 文件。

冲突

TicKV 将防止添加具有键冲突的新键/值对。冲突将报告给用户,错误码为 ErrorCode::KeyAlreadyExists

断电保护

TicKV 确保在断电的情况下,所有提交的数据保持提交状态。这是 ACID 语义的一部分持久性保证。在断电的情况下可能丢失的唯一数据是尚未写入闪存的数据。

如果在调用 append_key()invalidate_key() 之前发生断电,那么该操作可能没有完成,并且该数据已丢失。

安全性

TicKV 使用 CRC-32 校验和来检查数据完整性。TicKV 没有任何防止恶意操纵或隐私的措施。可以访问闪存的攻击者可以更改值而不会被检测到。具有闪存访问权限的攻击者还可以读取所有信息。任何隐私、安全或身份验证措施都需要在 TicKV 上层构建。

硬件要求

TicKV 要求闪存介质允许在擦除操作之间至少两次写入一个单词。

版本

TicKV 在向闪存存储添加对象时存储版本。

TicKV 当前版本为 1。

  • 版本 1
    • 首次发布

无运行时依赖项