linux-kernel – 实现mmap()的内核驱动程序是否必须创建一个字符
我正在尝试编写一个内核驱动程序来管理物理上连续和可DMA的内存的一些内存块(我使用的是kmalloc(),因为它们只是DMA流).为了将一些功能引入用户空间,这个内存将使用自己的mmap()实现进行mmap()编辑.我一直在使用
Linux设备驱动程序以及在Google中显示的不良示例作为我的主要信息来源.
我的mmap()(现在称之为my_mmap())需要在内核中注册.它似乎是使用struct file_operations执行此操作的唯一有效方法,但这需要为其创建字符设备和物理位置.我不想那样做.我只想为用户空间应用程序创建一个虚拟地址来访问内存缓冲区,而不是创建任何文件来映射内存缓冲区.这可能吗? 我确实发现帧缓冲区也有一个与mmap()实现相同的结构,但这太过分了.这和它增加了更多的未知数. 据我所知,my_mmap()可以完成繁重的工作并使用remap_pfn_range(),只要我对丢失的灵活性感到满意.否则,我将不得不实现本地nopages()并使用struct vm_operations_struct注册它.它是否正确? 解决方法
mmap()操作是来自用户空间的请求,用于将某些源映射到其虚拟地址空间.用户空间程序识别它感兴趣的源的方式是提供文件描述符(实际上只是内核已知资源的句柄).
这意味着您必须使您的设备可以表示为文件描述符,以便用户空间程序可以告诉内核它对它感兴趣(并且内核知道调用您的mmap()实现) – 注册字符设备是典型的方式要做到这一点.请注意,帧缓冲设备也可以通过字符设备访问. 如果对您的设备没有意义,则不必实现其他字符设备操作,如read()和write().字符设备只是用户空间程序打开设备的内核管理句柄的一种方式. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |