在linux中分配物理内存缓冲区

时间:2014-09-17 16:54:46

标签: memory-management linux-kernel

我有一个SoC,其上有DSP和ARM内核,我想创建一个共享内存部分,我的用户空间软件和DSP软件都可以访问。在Linux中分配这样的缓冲区的最佳方法是什么?这是一个小背景,现在我所拥有的是一个内核模块,我在其中使用kmalloc()来获取内核缓冲区,然后我使用来自__pa()的{​​{1}}宏来获取物理我的内核缓冲区的地址。我将此地址保存为sysfs条目,以便我的用户空间代码可以获取此缓冲区的物理地址。然后,我可以将此地址写入DSP,以便它知道共享内存位置在哪里,我也可以asm/page.h mmap或我自己的内核模块,以便我可以从用户空间访问此缓冲区(我可以也使用读/写fileops)。

出于某种原因,我觉得这是落伍的,但我找不到做我想做的最好的方法。

是否可以只为/dev/mem mmap一段内存而只读取和写入此部分?我的感觉是,这不会从内核“锁定”这部分内存,因此内核仍然可以在我不知情的情况下读/写这个内存。是这样的吗?在阅读LDD3的内存管理章节后,我看到mmap创建了一个新的映射VMA。这会锁定这个内存区域,以便其他进程不会分配这部分内存吗?

感谢任何和所有帮助

2 个答案:

答案 0 :(得分:2)

根据您使用的DMA类型,您需要使用dma_alloc_coherent()分配缓冲区,或使用标准分配和dma_map_*函数。 (不能使用__pa();物理地址不一定与DMA总线地址相同。)

要将缓冲区映射到用户空间,请将dma_mmap_coherent()用于相干缓冲区,或手动映射内存页以用于流缓冲区。

答案 1 :(得分:0)

对于我的类似要求,我在ram的末尾保留了大约16 MB的内存,并在内核和用户空间中使用它。假设您有128 MB RAM,您可以在引导加载程序中将BOOTMEM参数设置为112 MB。我假设你正在使用uboot。这将在ram结束时保留16 MB。现在在内核和用户空间中,您可以映射此区域并将其用作共享内存。