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)
我无法理解相同的内容,对此的任何帮助都会很棒。
在函数的源代码(文件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那样)。