在内核空间中,如何获得与ext4格式磁盘上的文件对应的物理地址

第一次在linux内核这里。 无论如何,我的问题是,如果你在这里:

https://github.com/torvalds/linux/blob/master/fs/ext4/file.c#L360

您可以访问ext4_file_mmap函数中的这两个结构:

 struct file *file, struct vm_area_struct *vma 

我正在改变dax模式的这个函数的实现,以便在你调用mmap的时候,页面表被完全填充(看看没有任何pagefaults给了我们多less好的性能)。

到目前为止,我已经完成了以下工作(假设我可以访问ext4_file_mmap可以访问的两个结构):

 // vm_area_struct defined in /include/linux/mm_types.h : 284 // file defined in /include/linux/fs.h : 848 loff_t file_size = file_inode(file)->i_size; unsigned long start_va = vma->vm_start; 

现在,困难在这里。 如何获得与此文件关联的物理地址(块?不知道dax使用块)?

我花了几天的时间盯着linux的源代码,试图理解一些东西,而男孩我是成功的。

任何帮助,暗示,或build议非常感谢! 谢谢!

一些更新:当您在dax模式下dax文件时,您不会将任何内容提取到内存中。 该设备,在这种情况下PMEM,是字节地址,并给DDR的延迟,所以它直接访问(之间没有记忆)。 某些pte导致访问这个PMEM设备,而不是内存。

首先mmap支持MAP_POPULATE标志,专门用来避免页面错误。 原则上它可能不适用于dax,但这不太可能。

其次,你似乎没有任何衡量目前的状况。 只是“改变一些东西,检查差异”是一个根本错误的做法。 尤其可能的是,实际的瓶颈将被作为改变的非预期后果而被移除,并且胜利最终将被错误分配。 您可以从“perf”开始获取基本数字并生成火焰图( http://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html )。 如果您在很小的范围内执行大量的I / O操作,页面错误应该可以忽略不计。