【发布时间】:2012-06-25 21:33:39
【问题描述】:
我正在尝试编写一个内核驱动程序来管理一些物理上连续和可 DMA 内存的内存块(我正在使用kmalloc(),因为这些只是 DMA 流)。为了将一些功能拉入用户空间,这个内存将被mmap()ed 和它自己的mmap() 实现。我一直在使用 Linux 设备驱动程序 以及 Google 中出现的不良示例作为我的主要信息来源。
我的mmap()(现在叫它my_mmap())需要在内核中注册。这似乎是使用struct file_operations 执行此操作的唯一有效方法,但这需要为其创建字符设备和物理位置。我不想那样做。我只想为用户空间应用程序创建一个虚拟地址来访问内存缓冲区,而不是创建任何文件来映射内存缓冲区。这可能吗?
我确实发现帧缓冲区也有一个与mmap() 实现等效的结构,但这太过分了。这增加了更多的未知数。
据我了解,my_mmap() 可以完成繁重的工作并使用remap_pfn_range(),只要我对失去的灵活性感到满意。否则我将不得不实现一个本地nopages() 并使用struct vm_operations_struct 注册它。这是正确的吗?
【问题讨论】:
标签: linux-kernel buffer driver mmap dma