我正在尝试将我在内核驱动程序中分配的DMA相干内存映射到用户空间。在那里,我使用mmap()
,在内核驱动程序中,我使用dma_alloc_coherent()
,然后使用remap_pfn_range()
重新映射页面。
将DMA内存映射到用户空间的目的是最大程度地减少ioctl对内核的访问。主机必须执行大量的DMA相干内存访问,我想直接在用户空间中访问它,而不是通过使用无数ioctl()
操作来浪费时间。
mmap()
返回 EPERM (1)-不允许操作。
我发现了这篇文章:mmap: Operation not permitted
答案:
听起来内核已经使用CONFIG_STRICT_DEVMEM进行了编译 已启用。这是一项安全功能,可防止用户空间访问 (可能是敏感的)1MB(IIRC)以上的物理内存。你可能是 能够通过sysctl dev.mem.restricted禁用它。
那是我发现的唯一有用的信息。但是,我看到2个问题:
1)我仅为测试目的分配了4k。根据上面的陈述,只有大于1MB的物理内存才是问题。我仍然无法进行映射(无论如何,对于最终的驱动程序,我将需要更多的dma内存,但是重新编译内核不能解决我的问题),这导致我出现2)
2)此外,重新编译内核不是一种选择,因为驱动程序应该在不以特定方式调整内核的情况下工作。
对此有什么想法吗?感谢您的帮助。
我正在使用 Ubuntu 16.04.1 ,内核: 4.10.0-40-通用
编辑:已解决
我犯了一个复制粘贴错误,导致ret = -1。因此,内核驱动程序中调用remap_pfn_range的.mmap函数返回-1而不是0。这导致用户空间中的mmap()失败