Mmap DMA相干内存到用户空间

时间:2018-11-05 14:07:26

标签: linux linux-kernel linux-device-driver mmap dma

我正在尝试将我在内核驱动程序中分配的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()失败

0 个答案:

没有答案