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二號確實不修改頁面。

那麼第二種方法的基本原理是什麼?第一個例子也適用。

回答

2

第二個例子簡單地映射了所有請求的頁面。

第一個示例不會立即映射任何頁面。 當用戶空間應用程序嘗試訪問其中一個頁面時,會發生頁面錯誤,然後mmap_vm_ops中的頁面錯誤處理程序(.fault)必須實際映射該頁面。 如果您估計大部分頁面不會真正被訪問,並且實際映射花費太多時間或內存,這是有道理的。

+0

好的。是的,我可以在dmesg中看到當我調用mmap()時調用頁面錯誤處理程序。首先my_mmap() - > mmap_open() - > page_fault()。 那麼在第二種情況下,頁面錯誤將不會被調用,因爲它已被映射? – RootPhoenix

+0

當你在mmap期間修改頁表時,這意味着什麼。 – RootPhoenix

+0

如果用戶空間應用程序嘗試訪問未映射的VA,它將得到SEGFAULT。 page_fault是對VA後面的內存中沒有物理頁面的事實的反應,但是vma應該已經到位。或者從mmap_vma_ops中有一個特殊的不同的page_fault處理程序?請解釋。 –