2012-10-12 78 views
1

我想將一些內核內存暴露給用戶空間,而不需要額外的系統調用。我選擇了mmap路由來做這件事。以下是來自驅動程序的示例代碼。mmap系統調用在取消映射後不會刪除映射

int mmp_mmap(struct file *filp, struct vm_area_struct *vma) 
{ 

    struct page *page = NULL; 
    struct mmp * mpdev=NULL; 
    unsigned long pfn; 
    mpdev=filp->private_data; 
    vma->vm_flags |= VM_RESERVED|VM_IO; 
    /* 
    * Get the page corresponding to the buffer address 
    */ 
    page=virt_to_page(mpdev->buf); 
    pfn=page_to_pfn(page); 
    /* 
    * Now create a entry corresponding to this pfn in the page table. 
    */ 
    if (remap_pfn_range(vma,vma->vm_start,pfn,vma->vm_end- 
         vma->vm_start,vma->vm_page_prot)) { 
     printk(KERN_ERR "remap_pfn_range failed\n"); 
     return -EAGAIN; 
    } 
    return 0; 
} 

問題是,當用戶空間程序打開這個設備,mmaps的內存和修改它,然後它工作正常的第一次。內存的任何後續打開和映射都不會修改內核緩衝區。用戶登陸程序顯式地對這個啞形緩衝區進行解映射。

回答

0

如果你只是想將一些內核內存暴露給用戶空間,你可以使用/ dev/kmem而不是實現你自己的內存。您應該在配置內核時啓用此設備:

設備驅動程序 - >字符設備 - >/dev/kmem虛擬設備支持。

如果你堅持要做到這一點,你可以閱讀/ dev/kmem的代碼作爲提示。