我想在没有任何额外系统调用开销的情况下向用户空间公开一些内核内存。我为此选择了 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;
}
问题是当用户空间程序打开这个设备时,映射内存并修改它,然后它第一次工作正常。任何后续的内存打开和映射都不会修改内核缓冲区。用户登陆程序显式地取消映射这个映射的缓冲区。