1个稳定版本
1.0.0 | 2022年5月22日 |
---|
#138 在 数据库实现 中
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
- 首次发布