【问题标题】:mmap physically contiguous memorymmap 物理连续内存
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 如果已经在 dsp_buffer 映射了某些东西,这将失败。您不能使用 mmap 给页面别名。
  • 什么是 Memory_alloc()? dsp_buffer 是否在页面边界上对齐?
  • @praetorian droid:Memory_alloc() 是对德州仪器 (TI) 提供的内核模块的调用,用于分配物理上连续的内存。不知道是怎么实现的。
  • "除了内存转换问题,值得注意的是 DSP 处理内存中连续对齐的缓冲区和数据,而 ARM 由于其 MMU 具有处理碎片缓冲区的能力。因此它是传递在内存中连续对齐的缓冲区和参数信息很重要。DMAI API Buffer_create() 或 Codec Engine API Memory_alloc() [和 Memory_contigalloc()] 可用于为来自 CMEM 模块的函数参数分配连续的内存缓冲区。 Texas Instrument wiki
  • 如果 Memory_alloc() 使用 mmap(这将导致无法再次映射到该内存),您可能应该使用给定示例中的 IO_METHOD_USERPTR 变体。
【解决方案2】:

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

【讨论】:

猜你喜欢
  • 2014-03-28
  • 2019-04-08
  • 2023-04-08
  • 2010-10-24
  • 1970-01-01
  • 2014-05-24
  • 2012-11-28
  • 2015-01-26
  • 2011-05-23
相关资源
最近更新 更多