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

时间:2012-07-15 07:56:21

标签: linux kernel device

来自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;
...
}

1 个答案:

答案 0 :(得分:5)

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

对于“实际”设备驱动程序,通常会从设备规范中获取设备内存映射寄存器或RAM硬编码的物理地址,并使用它来导出PFN(除以页面大小)。 / p>