mmap物理上连续的内存

时间:2011-11-28 18:41:54

标签: c linux memory shared-memory v4l2

我可能在这里有一些误解,所以请耐心等待。

我写了一个从相机中捕捉图像的程序。正如我在V4L2 documentation中找到的那样,我正在mmap与相机和我的应用程序共享内存。这非常有效。现在我的处理器(它是TI的DM3730)也有一个DSP。我想使用DSP,但它需要物理连续内存。 TI提供分配内存的驱动程序。我的问题是,现在我失去了很多时间将mmap的内存复制到物理连续的内存中。有没有办法告诉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); 
...

我怎样才能立即将帧插入物理连续内存?

2 个答案:

答案 0 :(得分:3)

如果你不能将Memory_alloc()的结果作为第一个参数传递给mmap()(例如,如果它也使用mmap(),这将使得无法再次映射到该内存),可能应该使用given example - IO_METHOD_USERPTR变体中的另一种流式I / O方法。它使用与IO_METHOD_MMAP相同的ioctl来捕获帧,并应提供类似的效率。

答案 1 :(得分:2)

您需要相机驱动程序的驱动程序支持。 mmap从它映射的任何驱动程序获取它映射的物理页面 - 在这种情况下是相机。你不能告诉mmap使用一些预先分配的页面,因为必须告诉底层驱动程序使用这些预先分配的页面。