我希望将一些内核内存暴露给用户空间,而不需要额外的系统调用。我选择了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内存并修改它然后它第一次正常工作。任何后续打开和映射的内存都不会修改内核缓冲区。用户land程序显式地执行此mmaped缓冲区的unmap。
答案 0 :(得分:0)
如果您只想将某些内核内存暴露给用户空间,可以使用/ dev / kmem而不是实现自己的内核。您应该在配置内核时启用此设备:
设备驱动程序 - >字符设备 - > / dev / kmem虚拟设备支持。
如果您坚持这样做,您可以阅读/ dev / kmem的代码以获取提示。