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

C 在内核空间中,如何获得与ext4格式化磁盘上的文件相对应的物理地址,c,linux,memory-management,linux-kernel,paging,C,Linux,Memory Management,Linux Kernel,Paging,如果您在这里: 您可以在ext4\u file\u mmap函数中访问这两个结构: struct file *file, struct vm_area_struct *vma 我正在将此函数的实现更改为dax模式,以便在调用mmap时完全填写文件的页面表(以查看不使用任何pagefaults会给我们带来多少更好的性能) 到目前为止,我已经完成了以下工作(假设我可以访问ext4\u file\u mmap可以访问的两个结构): 现在,困难就在这里。如何获取与此文件关联的物理地址(块?不确定d

如果您在这里:



您可以在
ext4\u file\u mmap
函数中访问这两个结构:

struct file *file, struct vm_area_struct *vma
我正在将此函数的实现更改为
dax
模式,以便在调用
mmap
时完全填写文件的页面表(以查看不使用任何
pagefaults
会给我们带来多少更好的性能)

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

现在,困难就在这里。如何获取与此文件关联的物理地址(块?不确定
dax
是否使用块)

在过去的几天里,我一直在盯着linux的源代码,试图弄明白其中的道理,我已经成功了

非常感谢您的任何帮助、提示或建议! 谢谢


一些更新:当您在
dax
模式下
mmap
文件时,您不会将任何内容提取到内存中。该设备(在本例中为PMEM)是字节可寻址的,并提供DDR延迟,因此可以直接访问(其间没有内存)。某些
pte
s导致访问此PMEM设备而不是内存。

首先,mmap support MAP\u POPULATE标志专门用于避免页面错误。原则上,它可能不适用于dax,但这不太可能


其次,你似乎对当前的事态没有任何衡量标准。仅仅“改变某些东西并检查差异”是一种根本错误的方法。特别是,可能会出现这样的情况:实际的瓶颈将被消除,这是变化的意外结果,最终胜利将被误判。您可以从使用“perf”获取基本数字并生成火焰图()开始。如果在小范围内进行大量i/o操作,则页面错误的影响应该可以忽略不计。

这可能是错误的地方……为什么不直接固定与
mmap
内存对应的虚拟地址呢?它将自动从磁盘(或任何设备)获取页面,并在用户/内核模式下避免任何页面错误。@AnttiHaapala您能告诉我您认为应该从哪里开始吗?此外,我的意思是仅为
mmap
ed的文件填写
pte
,而不是为整个PMEM设备填写,如果这会引起任何误解。此外,为了查看不出现任何页面错误是否会使我们在PMEM中获得更好的性能,如果您要读取文件中的所有内容,这是一种保证。没有页面错误更好,每页有一个页面错误。@peanutlover抱歉,我不是Linux内核专家,只是说如果在那里开始填充页面表会有点难看。。。还有,你有没有试用过
madvise
标志呢?首先,我喜欢你的用户名!它适合你。你给我省了不少麻烦。我同意你的第二点,但在这种情况下,我认为预加载
pte
s不应导致性能错误归因。不过,我会记住你的观点,而且要小心!谢谢你提醒我!
// 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;