在内核space中,如何获取ext4格式磁盘上文件对应的物理地址
In the kernel space, how does one get the physical addresses corresponding to a file on ext4-formatted disk
如果你在这里:
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
导致访问此 PMEM 设备而不是内存。
首先,mmap 支持 MAP_POPULATE 标志,专门用于避免页面错误。原则上它可能不适用于 dax,但这不太可能。
其次,您似乎没有对当前事态进行任何衡量。仅 "changing something and checking the difference" 是一种根本错误的方法。特别是实际的瓶颈可能会作为更改的意外结果而被消除,并且胜利最终会被错误归因。您可以从使用 'perf' 开始获取基本数字并生成火焰图 (http://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html)。如果你在一个小范围内做很多i/o,页面错误的影响应该可以忽略不计。
如果你在这里:
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
导致访问此 PMEM 设备而不是内存。
首先,mmap 支持 MAP_POPULATE 标志,专门用于避免页面错误。原则上它可能不适用于 dax,但这不太可能。
其次,您似乎没有对当前事态进行任何衡量。仅 "changing something and checking the difference" 是一种根本错误的方法。特别是实际的瓶颈可能会作为更改的意外结果而被消除,并且胜利最终会被错误归因。您可以从使用 'perf' 开始获取基本数字并生成火焰图 (http://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html)。如果你在一个小范围内做很多i/o,页面错误的影响应该可以忽略不计。