【问题标题】:mmap system call does not remove mappings after unmapmmap 系统调用在取消映射后不会删除映射
【发布时间】:2012-10-12 12:27:58
【问题描述】:

我想将一些内核内存暴露给用户空间,而不需要任何额外的系统调用开销。我为此选择了 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;
}

问题是当用户空间程序打开这个设备时,映射内存并修改它,然后它第一次工作正常。任何后续的内存打开和映射都不会修改内核缓冲区。用户登陆程序显式地取消映射这个映射的缓冲区。

【问题讨论】:

    标签: mmap


    【解决方案1】:

    如果你只是想将一些内核内存暴露给用户空间,你可以使用 /dev/kmem 而不是实现你自己的。您应该在配置内核时启用此设备:

    设备驱动程序 --> 字符设备 -->/dev/kmem 虚拟设备支持。

    如果你坚持这样做,你可以阅读 /dev/kmem 的代码以获得提示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-18
      • 2018-07-08
      • 1970-01-01
      • 1970-01-01
      • 2016-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多