vm_area_struct 中的无符号长整数 vm_pgoff

unsigned long vm_pgoff in vm_area_struct

我正在阅读 Linux 设备驱动程序的内存管理章节,我遇到了 vm_area_struct。该结构有一个偏移字段,即 无符号长整数 vm_pgoff

我检查了成员的评论 /* Offset (within vm_file) in PAGE_SIZE units, *not* PAGE_CACHE_SIZE */ 。我不太确定它是在 vma 区域内的偏移量还是在内存映射文件中的偏移量。

而且我已经看到驱动程序的 mmap 实现代码具有以下行,通过将成员移动 PAGE_SHIFT 位来重新计算偏移量。

unsigned long off = vma->vm_pgoff << PAGE_SHIFT;

我无法理解相同的内容,对此有任何帮助都将非常有用。

在函数的源代码(文件mm.h)中

 static inline unsigned long do_mmap(struct file *file, unsigned long addr,
unsigned long len, unsigned long prot,
unsigned long flag, unsigned long offset)

我找到了用作do_mmap_pgoffpgoff参数的表达式offset >> PAGE_SHIFT(右移),所以很明显,到"restore"原来的[=14] =] 值我们需要用相同的 PAGE_SHIFT 做左移(因为函数 lowmem_page_address 这样做)。

据书Linux Device Drivers, 3rd edition

unsigned long vm_pgoff;

The offset of the area in the file, in pages. When a file or device is mapped, this is the file position of the first page mapped in this area.

因此,它是 file/device 中以页数衡量的偏移量。因此,vm_area 中的第一页是 file/device 中的第 "vm_pgoff" 页。

文件mm_types.h也是如此。