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_pgoff
的pgoff
参数的表达式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也是如此。
我正在阅读 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_pgoff
的pgoff
参数的表达式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也是如此。