4
我想了解驅動程序中的mmap操作。我知道我們爲什麼在做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;
}
第一個例子是一個簡單的實現tables..but二號確實不修改頁面。
那麼第二種方法的基本原理是什麼?第一個例子也適用。
好的。是的,我可以在dmesg中看到當我調用mmap()時調用頁面錯誤處理程序。首先my_mmap() - > mmap_open() - > page_fault()。 那麼在第二種情況下,頁面錯誤將不會被調用,因爲它已被映射? – RootPhoenix
當你在mmap期間修改頁表時,這意味着什麼。 – RootPhoenix
如果用戶空間應用程序嘗試訪問未映射的VA,它將得到SEGFAULT。 page_fault是對VA後面的內存中沒有物理頁面的事實的反應,但是vma應該已經到位。或者從mmap_vma_ops中有一個特殊的不同的page_fault處理程序?請解釋。 –