实现 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()操作是来自用户空间的请求,用于将某个源映射到其虚拟地址空间。 userspace 程序识别它感兴趣的源的方式是通过提供文件描述符(实际上只是内核已知资源的句柄)。

这意味着你必须使你的设备可表示为文件描述符,以便用户空间程序可以告诉内核它对它感兴趣(并且内核知道调用你的mmap()实现) - 注册字符设备是典型的方法。 请注意,帧缓冲区设备也通过字符设备访问。

如果对设备没有意义,则不必实现其他字符设备操作,例如read()write()。 字符设备只是用户空间程序打开设备的内核管理句柄的一种方式。

最新更新