【发布时间】:2018-07-24 16:56:28
【问题描述】:
我有一个自定义设备驱动程序,它实现mmap 操作以将共享 RAM 缓冲区(操作系统外部)映射到用户空间。缓冲区通过传递mem=32M 作为操作系统的引导参数来保留,剩余的 512MB 可用作缓冲区。我想从映射内存执行零复制操作,如果vm_flags 包括VM_PFNMAP 和VM_IO,这是不可能的。
我的驱动程序当前通过调用vm_iomap_memory(vma, start, size) 来执行映射,而后者又调用io_remap_pfn_range 和remap_pfn_range,它使用VM_PFNMAP 和VM_IO 设置了vma。这可以将内存映射到用户空间,但是由于设置了VM_PFNMAP 标志或缺少结构页面,零拷贝套接字操作在get_user_pages 失败。 remap_pfn_range 的 cmets 显示这是预期行为,因为 pfn 映射的内存不应被视为“正常”。但是,就我而言,它只是一块保留的 RAM,所以我不明白为什么不应将其视为正常。我已经设置了缓存失效/刷新来手动管理内存。
我尝试在映射期间和映射后取消设置vm_area_struct 上的VM_PFNMAP 和VM_IO 标志,但get_user_pages 仍然失败。我还查看了 dma 库,但看起来它们依赖于在幕后调用 remap_pfn_range。
我的问题是如何将物理内存映射为普通的、非 pfn、结构页支持的用户空间地址?还是我应该以其他方式看待它?谢谢!
【问题讨论】:
标签: linux linux-device-driver embedded-linux mmap