vm_area_struct 中的 unsigned long vm_pgoff

San*_*Pai 5 c linux-device-driver

我正在阅读 Linux 设备驱动程序的内存管理章节,并且遇到了vm_area_struct。该结构有一个偏移字段,即 unsigned long 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;
Run Code Online (Sandbox Code Playgroud)

我无法理解相同的内容,对此的任何帮助都会很棒。

Vol*_*And 1

在函数的源代码(文件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)
Run Code Online (Sandbox Code Playgroud)

我发现表达式offset >> PAGE_SHIFT(右移)用作 的pgoff参数do_mmap_pgoff,因此很明显,要“恢复”原始offset值,我们需要使用相同的左移PAGE_SHIFT(就像函数lowmem_page_address那样)。

  • 我清楚地重读了一遍,vm_pgoff 字段指示页数的偏移量,当右移 PAGE_SHIFT 位时,与将 2 ^ PAGE_SHIFT 乘以页数相同,从而给出偏移字节总数。然后进一步使用在计算中。 (2认同)