PMFS内存文件系统的文件块组织方式以及写流程

本文介绍了PMFS内存文件系统的物理块号、逻辑块号、物理地址与虚拟地址的关系,并详细阐述了文件块的组织方式——B512树结构,以及写文件的流程,包括__pmfs_find_data_block、pmfs_file_write_fast和__pmfs_alloc_blocks等关键步骤。此外,文章提及PMFS空间管理的相关内容。

由于最近做关于PMFS文件系统的实验,实现了pmfs写文件的数据一致性,还改了PMFS的空间管理,所以想对自己近两个月所做的工作进行一个总结,以下就简单谈谈自己对于PMFS以及拓展知识的理解,如有不对之处还请指出!或者还想了解更多的可以留言讨论。

介绍

先简单介绍一下,物理块号,逻辑块号,物理地址,逻辑地址以及虚拟地址之间的关系。

这里围绕PMFS文件系统来展开介绍。假设有1T大小的内存,总共有 1T/4KB个物理块,从10G的位置开始,分出128G大小的空间用于挂载PMFS文件系统,那么PMFS文件系统的起始物理地址就为10G,其起始物理块号就为10G/4KB。还有该分区也有一个固定的起始虚拟地址。

而对于PMFS分区来说总共只有128G/4KB个物理块,那么为了管理方便,PMFS文件系统在分配块时,是从0开始计数的。这就是针对PMFS分区的块号,也就是逻辑块号。块号 * 4KB 就能算出每个块的逻辑地址。所以我对逻辑块号以及逻辑地址的理解就是它只是相对于某个区域来说的,比如说,PMFS分区相对于整个内存,一个文件相对于一个内存分区。在某种特定的时候它亦能称为物理块号和物理地址。

PMFS起始虚拟地址 virt_addr 。
文件在申请块的时候,返回的是逻辑块号logical_block_number;
逻辑地址就等于逻辑块号乘以每个块的大小。logical_address = logical_block_number << 12;
而我们在执行读写操作时都必须使用虚拟地址,虚拟地址就等于逻辑地址加上该分区的起始虚拟地址 virtual_address = logical_address + virt_addr ;
这些关系困扰了我很久,也是最近才搞清楚。

文件块组织

PMFS内存文件系统是用B512树来组织文件块的。如下图所示,B512树是一种B+树,是一种多路搜索树,非叶子结点都有512个儿子。只有叶子结点是数据块,其他都是索引块。一棵树最多只有3层,叶子结点实际为一个指针指向物理块号。
在同一个文件中,每棵树最多只有三层,每个block为4KB,那么一棵树最大能存储的文件大小为:
512 * 512 * 512 * 4KB = 512G。
索引结点的存了每个儿子的逻辑地址。通过逻辑地址又找到下一级的物理块,读取其内容,再次找到下一层结点。
在这里插入图片描述
下面我将通过讲写文件代码来将补充上面没说清楚的地方。

Write

write 入口函数:

ssize_t pmfs_xip_file_write(struct file *filp, const char __user *buf,
          size_t len, loff_t *ppos)
{
	struct address_space *mapping = filp->f_mapping;
	struct inode    *inode = mapping->host;
	struct super_block *sb = inode->i_sb;
	pmfs_transaction_t *trans;
	struct pmfs_inode *pi;
	ssize_t     written = 0;
	loff_t pos;
	u64 block;
	bool new_sblk = false, new_eblk = false;
	size_t count, offset, eblk_offset, ret;
	unsigned long start_blk, end_blk, num_blocks, max_logentries;
	bool same_block;

	sb_start_write(inode->i_sb);
	mutex_lock(&inode->i_mutex);

	if (!access_ok(VERIFY_READ, buf, len)) {
		ret = -EFAULT;
		goto out;
	}
	pos = *ppos;
	count = len;

	/* We can write back this queue in page reclaim */
	current->backing_dev_info = mapping->backing_dev_info;

	ret = generic_write_checks(filp, &pos, &count, S_ISBLK(inode->i_mode));//检查写权
<think>好的,我现在需要帮助用户了解NOVA文件系统的相关信息、使用方法以及配置。首先,我得回忆一下之前提供的引用内容,看看有哪些相关的信息可以整合。 根据引用[3],用户提到NOVA文件系统是一种针对非易失性内存(NVM)优化的文件系统,专为减少传统文件系统在NVM上的开销而设计。同时,用户还提到配置NOVA时需要用QEMU模拟NVM环境,并通过VSCODE进行可视化调试。引用[4]则详细介绍了Nova的系统架构和组件,比如API、调度器、过滤器等,但这些更多是关于OpenStack的Nova计算服务,可能与文件系统的NOVA不同,需要注意区分。 首先,我需要确认用户的问题中的“nova 文件系统”是指针对NVM的文件系统,还是OpenStack的计算组件。但根据用户之前的提问和引用[3]的内容,用户明确是在询问文件系统,所以应聚焦于NOVA文件系统,而不是OpenStack的Nova服务。 接下来,我需要整理NOVA文件系统的关键点:设计目标、架构特点、使用场景、配置步骤、调试方法等。引用[3]提供了配置环境的方法,比如使用QEMU模拟NVM,安装VSCODE插件进行调试。需要将这些步骤详细说明,确保用户能按步骤操作。 同时,用户可能需要的使用方法和配置指南,可能包括如何挂载NOVA文件系统、内核模块的编译加载等。由于引用中没有直接提到这些步骤,可能需要根据一般文件系统的配置流程进行补充,但要注意结合NOVA的特性,比如依赖NVM设备。 另外,用户可能需要了解NOVA与其他NVM文件系统(如PMFS、NOVA)的区别,或者性能优势。根据引用[3]提到的NOVA是针对NVM优化的,需要强调其低延迟、日志结构、原子性操作等特点。 生成相关问题方面,可以考虑NOVA的架构细节、性能优化方法、调试技巧、应用场景等,确保覆盖用户可能感兴趣的扩展内容。 最后,要确保回答结构清晰,分点说明,并正确使用LaTeX格式,比如行内公式用$...$,独立公式用$$...$$。同时,引用文献要正确标注,比如引用[3]关于环境配置的部分,引用[4]可能不适用,因为属于OpenStack Nova,需要避免混淆。 总结步骤: 1. 介绍NOVA文件系统的基本信息,包括设计目标和架构特点。 2. 说明使用场景和优势。 3. 详细列出配置步骤,包括环境搭建、QEMU模拟NVM、内核配置、挂载步骤。 4. 提供调试方法,如VSCODE配置。 5. 生成相关问题,引导用户深入探索。</think>### NOVA文件系统介绍与使用指南 #### 一、NOVA文件系统概述 NOVA(Non-Volatile Memory Optimized Virtualization-Aware File System)是针对**非易失性内存(NVM)**设计的文件系统,通过优化日志结构和元数据管理减少传统文件系统在NVM上的性能损耗[^3]。其核心特点包括: 1. **原子性操作**:通过轻量级日志保证崩溃一致性 2. **并行架构**:采用多日志结构支持多线程并发访问 3. **延迟优化**:直接访问NVM介质,减少DRAM缓存依赖 #### 二、核心架构特性 1. **内存映射设计** NOVA将文件数据通过$mmap()$直接映射到用户空间,实现零拷贝访问。 2. **混合日志结构** 元数据采用**inode日志**,数据更新采用**数据日志**,通过$$W_{total} = W_{metadata} + W_{data}$$ 实现操作优化。 #### 三、配置与使用步骤 ##### 1. 环境准备(基于引用[3]) ```bash # 安装QEMU模拟器 yum install qemu-kvm libvirt-daemon-kvm # 创建虚拟NVM设备镜像 qemu-img create -f raw nvm_disk.img 16G ``` ##### 2. 内核配置 ```bash # 编译支持NOVA的内核 make menuconfig # 选择 File systems -> Miscellaneous filesystems -> NOVA file system support ``` ##### 3. 挂载NOVA文件系统 ```bash # 加载内核模块 modprobe nova # 格式化并挂载NVM设备 mkfs.nova /dev/pmem0 mount -t nova /dev/pmem0 /mnt/nova ``` #### 四、可视化调试配置(VSCODE) 1. 安装插件:**Remote-SSH** + **Native Debug** 2. 配置`.vscode/launch.json`: ```json { "name": "Debug NOVA", "type": "gdb", "request": "attach", "target": "vmlinux", "arguments": "-ex 'target remote localhost:1234'" } ``` #### 五、典型应用场景 - 数据库日志存储(如Redis AOF) - 机器学习模型快速加载 - 实时数据分析管道
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值