Skip to content

DavidingPlus/nvmixfs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

nvmixfs

项目名称:面向 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 的大小完全够用。

已完成工作

本科毕设

  1. 不考虑 NVM,完成基于 DRAM + SSD 的传统文件系统的基本框架的搭建,留出数据结构和接口。初版只完成最简单的设计。
  2. 基本完成框架中预留接口的实现,已实现功能包括文件的创建、删除和修改,目录的创建和删除等。
  3. 按照 Doxygen 的风格补全注释。
  4. 使用持久性内存模拟 NVM 空间,将其映射到内核虚拟地址空间,并拿到虚拟起始地址用于管理,完成架构性的调研和思考。
  5. 在上一步的基础上,在 NVM 上存储元数据,并修改文件系统涉及到超级块和 inode 区元数据的细节逻辑,使其正常工作。

后续扩展

  1. 已完成 README 文档数据布局和具体设计的部分。
  2. 为直观地反映读取 NVM 相比读取 SSD 带来的性能提升,在 fill_super 函数中加入了纳秒级别的定时器。

代办工作

本科毕设

无,已全部完成。

后续扩展

  1. 完善 README 文档构建流程和测试流程的部分。

构建流程

(待补)

测试流程

(待补)

参考文档

  1. Linux kernel Lab学习笔记 | 北极落小雪
  2. linux-kernel-labs/linux: Linux kernel source tree
  3. 使用DRAM模拟持久内存(Persistent Memory)_dram da模拟输出-CSDN博客