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

问题描述 投票:2回答:1

如果你在这里:

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给我们)。

到目前为止,我已设法完成以下操作(假设我可以访问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源代码,试图理解东西,而且我已经成功了。

非常感谢任何帮助,提示或建议!谢谢!

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

c linux memory-management linux-kernel paging
1个回答
2
投票

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

其次,似乎你没有对当前事态进行任何测量。只是“改变一些东西并检查差异”是一种根本错误的方法。特别是,实际的瓶颈可能会因为变更的意外后果而被删除,并且胜利将最终被误导。您可以先使用'perf'来获取基本数字并生成火焰图(http://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html)。如果在很小的范围内进行大量的i / o,则页面错误应该具有可忽略的影响。

© www.soinside.com 2019 - 2024. All rights reserved.