4

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

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

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

据我了解,只要我对失去的灵活性感到满意,my_mmap()就可以进行繁重的工作和使用。remap_pfn_range()否则我将不得不实现一个本地nopages()并使用struct vm_operations_struct. 这个对吗?

4

1 回答 1

6

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

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

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

于 2012-06-26T06:01:07.053 回答