mmap物理上连续的内存

Luc*_*cas 10 c linux memory shared-memory v4l2

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

我写了一个从相机中捕捉图像的程序.mmap正如我在V4L2文档中找到的那样,我在相机和我的应用程序之间共享内存.这非常有效.现在我的处理器(它是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);
Run Code Online (Sandbox Code Playgroud)

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

...
//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); 
...
Run Code Online (Sandbox Code Playgroud)

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

pra*_*oid 3

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