实现mmap()的内核驱动程序是否必须创建字符设备?

时间:2012-06-25 21:33:39

标签: linux-kernel buffer driver mmap dma

我正在尝试编写一个内核驱动程序来管理物理上连续和可DMA化内存的一些内存块(我正在使用kmalloc(),因为这些只是DMA流)。要将某些功能引入用户空间,此内存将mmap()使用其自己的mmap()实现。我一直在使用 Linux设备驱动程序以及在Google中显示的不良示例作为我的主要信息来源。

我的mmap()(现在称它为my_mmap())需要在内核中注册。它似乎是使用struct file_operations执行此操作的唯一有效方法,但这需要为其创建字符设备和物理位置。我不想那样做。我只想为用户空间应用程序创建一个虚拟地址来访问内存缓冲区,而不是创建任何文件来映射内存缓冲区。这可能吗?

我确实发现帧缓冲区也有一个具有mmap()实现的等效结构,但这太过分了。这和它增加了更多未知数。

据我了解,只要我对失去的灵活性感到满意,my_mmap()可以完成繁重的工作并使用remap_pfn_range()。否则,我必须实现本地nopages()并使用struct vm_operations_struct注册它。这是对的吗?

1 个答案:

答案 0 :(得分:6)

mmap()操作是来自用户空间的请求,用于将某些源映射到其虚拟地址空间。用户空间程序识别它感兴趣的源的方式是提供文件描述符(实际上只是内核已知资源的句柄)。

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

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