【问题标题】:How does one determine the page frame number for device memory?如何确定设备内存的页框号?
【发布时间】:2012-07-14 20:51:43
【问题描述】:

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

【问题讨论】:

    标签: linux kernel device


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多