如果你在这里:
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
时,页面表会完全填写该文件(以查看有多好的性能,而不是{} {1}}给我们)。
到目前为止,我已设法完成以下操作(假设我可以访问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;
是否使用块)?
我花了最近几天盯着linux源代码,试图理解这些东西,而且我已经成功了。
非常感谢任何帮助,提示或建议! 谢谢!
一些更新:当您dax
模式mmap
时,您无法将任何内容提取到内存中。该器件(在本例中为PMEM)是字节可寻址的并且提供DDR延迟,因此它可以直接访问(中间没有存储器)。某些dax
导致访问此PMEM设备而不是内存。
答案 0 :(得分:2)
首先,mmap专门支持MAP_POPULATE标志以避免页面错误。原则上它可能不适用于dax,但这不太可能。
其次,您似乎没有对当前事态进行任何测量。只是改变一些事情并检查差异"是一种根本错误的方法。特别是,实际的瓶颈可能会因为变更的意外后果而被删除,并且胜利将最终被误导。您可以先使用' perf'得到基本数字并生成火焰图(http://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html)。如果在很小的范围内进行大量的i / o操作,页面错误应该可以忽略不计。