如果你在这里:
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延迟,因此可以直接访问它(中间没有存储器)。某些pte
s导致访问此PMEM设备而不是内存。
首先,mmap专门支持MAP_POPULATE标志以避免页面错误。原则上它可能不适用于dax,但这不太可能。
其次,似乎你没有对当前事态进行任何测量。只是“改变一些东西并检查差异”是一种根本错误的方法。特别是,实际的瓶颈可能会因为变更的意外后果而被删除,并且胜利将最终被误导。您可以先使用'perf'来获取基本数字并生成火焰图(http://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html)。如果在很小的范围内进行大量的i / o,则页面错误应该具有可忽略的影响。