linux-kernel - 驱动mmap操作页表创建

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

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

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;
}

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

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

最佳答案

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

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

关于linux-kernel - 驱动mmap操作页表创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30069306/

相关文章:

c - 疯狂: not understood

linux - 什么时候需要重建 initrd(Linux 初始 ramdisk)?

linux - 需要快速中断处理程序

Linux 内核 3.13 : How to list gendisk's?

linux - 在 Linux 中打开 GPIO 有线 LED

linux - madvise(___, ___, MADV_DONTNEED) 是否指示操作系统延迟写入磁盘?

c - Linux驱动模块编译问题

linux - 在内核空间中执行用户空间代码

debugging - 了解内核oops错误代码

c++ - 为什么在使用 mmap() 处理 JPG 文件时会出现内存错误?