项目名称:面向 NVM + SSD 的混合存储文件系统设计与实现。
本项目致力于构建一个基于 Linux 内核模块的文件系统,内核版本是 5.4。
此项目最初是作为本人的本科毕设题目,但由于扩展性较强,可进一步维护和研究。目前本科毕设的相关工作已完成,后续可在此基础上进一步扩展。
目前本文件系统的数据布局如下:
NVM Space:
+==================+==================+
| SuperBlock | Inode Zone |
| (Block 0) | (Block 1) |
|------------------|------------------|
| [NvmixSuperBlock]| [NvmixInode[32]] |
| 4 KiB Metadata | 4 KiB Inodes |
+==================+==================+
SSD Space:
+==================+==================+====
| Data Block 0 | Data Block 1 | ...
| (Block 0) | (Block 1) |
|------------------|------------------|----
| [File/Directory] | [File/Directory] | ...
| 4 KiB Data | 4 KiB Data |
+==================+==================+====
目前本文件系统设计的非常简单,NVM 空间和 SSD 磁盘块都以 4 KiB 为单位。按理来讲 NVM 完全可以当作内存使用,因此应该自己实现一个内存分配的机制。但是由于目前的设计非常简单,且当前元数据的放置方式尚无问题,我也懒得写内存分配机制,故后续再行考虑。
NVM 空间上第一个块是超级块区,第二个块是 inode 区。SSD 空间中的数据块从块号 0 开始编号。这是文件系统经典的三段式布局,只不过本文件系统中,将元数据和文件数据分开存储。
super_block 区存放整个文件系统必要的信息,包括校验魔数、inode 是否分配的位图状态以及文件系统版本等信息。整个结构体小于 4 KiB,一个块够用。
inode 区存放 NvmixInode 数组,用于管理本文件系统的所有 inode 元数据。目前限制了文件系统总 inode 的数量为 32,一个块 4 KiB 够用。
data 区以 4 KiB 为单位,目前每个文件或目录仅使用一个数据块,数据块下标即作为 file->mapping 索引,故目前对文件的最大大小限制为 4 KiB。文件类型的数据块以字节流形式存储实际内容。目录类型的数据块存储 NvmixDentry 数组,记录该目录下所有的目录项的信息。同理做了最大目录项个数的限制,4 KiB 的大小完全够用。
- 不考虑 NVM,完成基于 DRAM + SSD 的传统文件系统的基本框架的搭建,留出数据结构和接口。初版只完成最简单的设计。
- 基本完成框架中预留接口的实现,已实现功能包括文件的创建、删除和修改,目录的创建和删除等。
- 按照 Doxygen 的风格补全注释。
- 使用持久性内存模拟 NVM 空间,将其映射到内核虚拟地址空间,并拿到虚拟起始地址用于管理,完成架构性的调研和思考。
- 在上一步的基础上,在 NVM 上存储元数据,并修改文件系统涉及到超级块和 inode 区元数据的细节逻辑,使其正常工作。
- 已完成 README 文档数据布局和具体设计的部分。
- 为直观地反映读取 NVM 相比读取 SSD 带来的性能提升,在 fill_super 函数中加入了纳秒级别的定时器。
无,已全部完成。
- 完善 README 文档构建流程和测试流程的部分。
(待补)
(待补)