驱动程序 mmap 操作页面 table 创建
Driver mmap operation Page table creation
我想了解驱动程序中的 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;
}
第一个示例是不修改页表的简单实现..但第二个示例会。
那么第二种方法的基本原理是什么。第一个示例也可以正常工作。
第二个示例简单地映射所有请求的页面。
第一个示例不会立即映射任何页面。
当 user-space 应用程序试图访问其中一个页面时,会发生页面错误,然后 mmap_vm_ops
中的页面错误处理程序 (.fault
) 必须实际映射该页面。
如果您估计大多数页面实际上不会被访问,并且实际映射需要太多时间或内存,那么这很有意义。
我想了解驱动程序中的 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;
}
第一个示例是不修改页表的简单实现..但第二个示例会。
那么第二种方法的基本原理是什么。第一个示例也可以正常工作。
第二个示例简单地映射所有请求的页面。
第一个示例不会立即映射任何页面。
当 user-space 应用程序试图访问其中一个页面时,会发生页面错误,然后 mmap_vm_ops
中的页面错误处理程序 (.fault
) 必须实际映射该页面。
如果您估计大多数页面实际上不会被访问,并且实际映射需要太多时间或内存,那么这很有意义。