我正在尝试编写一个内核驱动程序来管理物理上连续和可DMA化内存的一些内存块(我正在使用kmalloc()
,因为这些只是DMA流)。要将某些功能引入用户空间,此内存将mmap()
使用其自己的mmap()
实现。我一直在使用 Linux设备驱动程序以及在Google中显示的不良示例作为我的主要信息来源。
我的mmap()
(现在称它为my_mmap()
)需要在内核中注册。它似乎是使用struct file_operations
执行此操作的唯一有效方法,但这需要为其创建字符设备和物理位置。我不想那样做。我只想为用户空间应用程序创建一个虚拟地址来访问内存缓冲区,而不是创建任何文件来映射内存缓冲区。这可能吗?
我确实发现帧缓冲区也有一个具有mmap()
实现的等效结构,但这太过分了。这和它增加了更多未知数。
据我了解,只要我对失去的灵活性感到满意,my_mmap()
可以完成繁重的工作并使用remap_pfn_range()
。否则,我必须实现本地nopages()
并使用struct vm_operations_struct
注册它。这是对的吗?
答案 0 :(得分:6)
mmap()
操作是来自用户空间的请求,用于将某些源映射到其虚拟地址空间。用户空间程序识别它感兴趣的源的方式是提供文件描述符(实际上只是内核已知资源的句柄)。
这意味着您必须使您的设备可以表示为文件描述符,以便用户空间程序可以告诉内核它对它感兴趣(并且内核知道调用您的mmap()
实现) - 注册一个字符设备是这种方式的典型方式。请注意,帧缓冲设备也可以通过字符设备访问。
如果对您的设备没有意义,则不必实施read()
和write()
等其他字符设备操作。字符设备只是用户空间程序打开设备的内核管理句柄的一种方式。