驱动程序mmap操作页表创建

时间:2015-05-06 06:39:45

标签: linux-kernel linux-device-driver mmap virtual-memory page-tables

我试图理解驱动程序中的mmap操作。我知道为什么我们在做mmap。我对以下2个mmap实现感到困惑:

int my_mmap(struct file *filp, struct vm_area_struct *vma)
{
    vma->vm_ops = &mmap_vm_ops;
    vma->vm_flags |= VM_RESERVED;
    /* assign the file private data to the vm private data */
    vma->vm_private_data = filp->private_data;
    mmap_open(vma);
    return 0;
}

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;

    vma->vm_ops = &simple_remap_vm_ops;
    simple_vma_open(vma);
    return 0;
}

第一个例子是一个不修改页面表的简单实现。但是第二个例子。

那么第二种方法的基本原理是什么?第一个例子也可以正常工作。

1 个答案:

答案 0 :(得分:2)

第二个示例只是映射所有请求的页面。

第一个示例不会立即映射任何页面。 当用户空间应用程序尝试访问其中一个页面时,会发生页面错误,然后.fault中的页面错误处理程序(mmap_vm_ops)必须实际映射该页面。 如果您估计实际上不会访问大多数页面,并且实际映射需要花费太多时间或内存,那么这是有道理的。