如何确定设备内存的页面帧号?

从LDD3 / Ch。 15 /节“使用remap_pfn_range”和“一个简单的实现”,pfn等同于vm_pgoff字段。 我很困惑。 这怎么可能呢?

请注意,vm_pgoff被描述为:

文件中区域的偏移量,以页面为单位。 当文件或设备被映射时,这是映射在该区域中的第一页的文件位置。

因此,如果映射的第一页也对应于文件的第一页(我认为这很常见),那么vm_pgoff就是0.正确吗? 如果是这样,这似乎不是remap_pfn_range()的pfn参数的正确值。 我在这里错过了什么? 什么是正确的价值? 为便于参考,我正在从下面的LDD3中复制相关的代码(页码426)

static int simple_remap_mmap(struct file *filp, struct vm_area_struct *vma) { if (remap_pfn_range(vma, vma->vm_start, vm->vm_pgoff, vma->vm_end - vma->vm_start, vma->vm_page_prot)) return -EAGAIN; ... } 

Solutions Collecting From Web of "如何确定设备内存的页面帧号?"

您提供的具体示例是实现一个字符设备文件,允许映射物理内存,非常类似于/ dev / mem。 通过指定文件的偏移量来指定物理内存地址。 因此,在页面大小中进行偏移和除法的计算可以找到PFN。

对于一个“真正的”设备驱动程序,通常设备的存储器映射寄存器或RAM的物理地址是从设备规范硬编码的,并用它来导出PFN(除以页面大小)。