【问题标题】:How to determine the Page Frame Number for device memory? [duplicate]如何确定设备内存的页框号? [复制]
【发布时间】:2012-07-13 18:11:54
【问题描述】:

如何确定设备内存的页框号?来自 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 linux-kernel linux-device-driver


【解决方案1】:

venk,我只是一个新手。 我很好奇你的问题,我也读过你在Linux设备驱动中指出的部分。

我应该推荐另一本书,Professional Linux kernel architecture。 那里描述了有关 mmap 的一些细节。

在上面的书中,似乎在调用函数 simple_remap_mmap() 作为示例之前对 vm->vm_pgoff 进行了一些转换,这在 Linux 内核源代码中不存在。

所以,即使 vm_pgoff 为 0,在对其进行一些转换后,该成员变量 vm_pgoff 中也可能存在正确的值。

以下代码存在于 Linux 内核源代码 3.3.5 中

#ifdef CONFIG_DEVKMEM

static int mmap_kmem(struct file *file, struct vm_area_struct *vma)
{

    unsigned long pfn;

    /* Turn a kernel-virtual address into a physical page frame */

    pfn = __pa((u64)vma->vm_pgoff << PAGE_SHIFT) >> PAGE_SHIFT;   <----- Here

    /*
     * RED-PEN: on some architectures there is more mapped memory than
     * available in mem_map which pfn_valid checks for. Perhaps should add a
     * new macro here.
     *
     * RED-PEN: vmalloc is not supported right now.
     */
    if (!pfn_valid(pfn))
        return -EIO;

    vma->vm_pgoff = pfn;
    return mmap_mem(file, vma);
}
#endif

【讨论】:

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