【问题标题】:Driver mmap operation Page table creation驱动mmap操作页表创建
【发布时间】:2015-07-16 03:37:48
【问题描述】:

我正在尝试了解驱动程序中的 mmap 操作。我知道我们为什么要做 mmap。我对以下两种 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;
}

第一个例子是一个简单的实现,它不修改页表..但第二个做了。

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 好的。是的,我可以在 dmesg 中看到当我调用 mmap() 时调用了页面错误处理程序。首先 my_mmap() -> mmap_open() -> page_fault()。那么在第二种情况下,页面错误将不会被调用,因为它已经被映射了?
    • 以及在mmap期间修改页表是什么意思。
    • 如果用户空间应用程序将尝试访问未映射的 VA,它将获得 SEGFAULT。 page_fault 是对 VA 后面的内存中没有物理页面这一事实的反应,但 vma 应该到位。或者 mmap_vma_ops 中有一个特殊的不同 page_fault 处理程序?请解释一下。
    猜你喜欢
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 2020-02-02
    • 2013-09-26
    • 2013-07-09
    • 2023-02-25
    相关资源
    最近更新 更多