【发布时间】:2012-01-08 04:42:28
【问题描述】:
我在这里可能有一些误解,请耐心等待。
我编写了一个从相机捕捉图像的程序。正如我在V4L2 documentation 中找到的那样,我正在与mmap 共享相机和我的应用程序之间的内存。这很好用。现在我的处理器(它是 TI 的 DM3730)也有一个 DSP。我想使用 DSP,但它需要 物理 连续内存。 TI 提供驱动程序来分配内存。我的问题是,现在我浪费了很多时间将映射的内存复制到物理连续内存中。有没有办法告诉 mmap 它不应该自己分配内存,而是告诉 mmap 使用我分配的内存。
为了让您了解我在做什么(当然缺少很多代码,但我非常接近 V4L2 文档。我希望这足以理解我的问题):
//reserve physical contiguous memory
dsp_buffer = Memory_alloc(buffer_length, &myParams);
...
//reserve memory for buffer, but not contiguous
buffers[n_buffers].start =
mmap (NULL , /* start anywhere */
buf.length,
PROT_READ | PROT_WRITE , /* required */
MAP_SHARED , /* recommended */
fd, buf.m.offset);
之后,只要一帧准备就绪,我就会将内存从非连续内存复制到连续内存中。
...
//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);
...
如何立即将帧放入物理连续内存中?
【问题讨论】:
-
我不知道这个特定的CPU,它有大页面支持吗?如果是这样,您应该尝试
mmap大页面。大页面保证在物理上是连续的(首先,在一个大页面内,第二,大页面池本身)。 -
@Damon:我不确定,让我回复你。还需要注意的是,我被困在 2.6.32 内核上。
-
大页面池不是连续的——至少在 x86 架构上不是。常规页面和大页面的分配算法完全相同,从 PAGE_SIZE 以及类似的宏和变量中分配所需的大小。
-
没关系。我误读了上面的内容并抓住了我的傻帽。
标签: c linux memory shared-memory v4l2