C 物理连续存储器

C 物理连续存储器,c,linux,memory,shared-memory,v4l2,C,Linux,Memory,Shared Memory,V4l2,我可能有一些误解,所以请容忍我 我写了一个程序,可以从照相机中捕捉图像。我正在使用mmap在相机和应用程序之间共享内存,正如我在。这很有效。现在我的处理器(它是TI的DM3730)也有一个DSP。我想使用DSP,但它需要物理连续内存。TI提供了分配内存的驱动程序。我的问题是,现在我浪费了很多时间将mmap'ed内存复制到物理连续内存中。有没有办法告诉mmap它不应该分配内存本身,而是告诉mmap使用我分配的内存 为了让您了解我正在做的事情(当然有很多代码缺失,但我非常关注V4L2文档。我希望这足

我可能有一些误解,所以请容忍我

我写了一个程序,可以从照相机中捕捉图像。我正在使用
mmap
在相机和应用程序之间共享内存,正如我在。这很有效。现在我的处理器(它是TI的DM3730)也有一个DSP。我想使用DSP,但它需要物理连续内存。TI提供了分配内存的驱动程序。我的问题是,现在我浪费了很多时间将mmap'ed内存复制到物理连续内存中。有没有办法告诉mmap它不应该分配内存本身,而是告诉mmap使用我分配的内存

为了让您了解我正在做的事情(当然有很多代码缺失,但我非常关注V4L2文档。我希望这足以理解我的问题):

之后,每当一个帧准备就绪时,我就将内存从非连续内存复制到连续内存中

...
//wait until frame is ready in memory
r = select (fd + 1, &fds, NULL, NULL, &tv); 
...
//copy the memory over to the physically contiguous memory
memcpy(dsp_buffer,buffers[buf.index].start,size); 
...

如何立即将帧放入物理连续内存中?

如果无法将
memory\u alloc()
的结果作为第一个参数传递给
mmap()
(例如,如果它还使用mmap(),则无法再次映射到该内存),您可能应该使用-
IO\u method\u USERPTR
变体中的另一个流式I/O方法。它使用与IO方法MMAP相同的
ioctl
来捕获帧,并应提供类似的效率。

您需要摄像头驱动程序的支持
mmap
从它映射的任何驱动程序(本例中为相机)获取它映射的物理页面。您不能告诉mmap使用一些预先分配的页面,因为底层驱动程序必须被告知使用这些预先分配的页面。

我不知道这个特定的CPU,它有巨大的页面支持吗?如果是这样,您应该尝试
mmap
大页面。巨大的页面保证在物理上是连续的(第一,在一个巨大的页面内,第二,巨大的页面池本身)。@Damon:我不确定,让我给你回复这个问题。可能还需要注意的是,我仍然停留在2.6.32内核上,庞大的页面池是不连续的,至少在x86架构上是不连续的。常规页面和大型页面的分配算法工作原理完全相同,从页面大小和类似的宏和变量中分配所需的大小。没关系。我误读了上面的内容,抓住了我的傻瓜帽子。如果已经在dsp_缓冲区映射了一些东西,这将失败。您不能使用mmap来别名页面。什么是内存分配()?dsp_缓冲区是否在页面边界上对齐?@praetorian droid:Memory_alloc()是对内核模块的调用,由Texas Instruments提供,用于分配物理上连续的内存。我不知道它是如何实现的。“除了内存转换问题外,值得注意的是,DSP处理内存中连续对齐的缓冲区和数据,而ARM由于其MMU而能够处理碎片缓冲区。因此,在内存中传递连续对齐的缓冲区和参数信息非常重要。DMAI API Buffer_create()或编解码器引擎API Memory_alloc()[和Memory_contigalloc()]可用于为来自CMEM模块的函数参数分配连续内存缓冲区。“如果
Memory_alloc()
使用mmap(这将使无法再次映射到该内存),您可能应该使用给定示例中的IO_METHOD_USERPTR变体。好的,这意味着我必须从相机驱动程序中分配内存?(pdf)似乎就是我要找的。。。
...
//wait until frame is ready in memory
r = select (fd + 1, &fds, NULL, NULL, &tv); 
...
//copy the memory over to the physically contiguous memory
memcpy(dsp_buffer,buffers[buf.index].start,size); 
...