我有一个SoC,其上有DSP和ARM内核,我想创建一个共享内存部分,我的用户空间软件和DSP软件都可以访问。在Linux中分配这样的缓冲区的最佳方法是什么?这是一个小背景,现在我所拥有的是一个内核模块,我在其中使用kmalloc()
来获取内核缓冲区,然后我使用来自__pa()
的{{1}}宏来获取物理我的内核缓冲区的地址。我将此地址保存为sysfs条目,以便我的用户空间代码可以获取此缓冲区的物理地址。然后,我可以将此地址写入DSP,以便它知道共享内存位置在哪里,我也可以asm/page.h
mmap
或我自己的内核模块,以便我可以从用户空间访问此缓冲区(我可以也使用读/写fileops)。
出于某种原因,我觉得这是落伍的,但我找不到做我想做的最好的方法。
是否可以只为/dev/mem
mmap
一段内存而只读取和写入此部分?我的感觉是,这不会从内核“锁定”这部分内存,因此内核仍然可以在我不知情的情况下读/写这个内存。是这样的吗?在阅读LDD3的内存管理章节后,我看到mmap创建了一个新的映射VMA。这会锁定这个内存区域,以便其他进程不会分配这部分内存吗?
感谢任何和所有帮助
答案 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。现在在内核和用户空间中,您可以映射此区域并将其用作共享内存。