Mmap физически смежная память

У меня могут быть некоторые неправильные представления, так что несите меня.

Я написал программу, которая захватывает изображения с камеры. Я использую память между камерой и моим приложением 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);

После этого я копирую память из несмежной памяти в непрерывную память, когда кадр готов.

...
//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); 
...

Как я могу сразу получить кадры в физическую смежную память?

Ответ 1

Если вы не можете передать результат Memory_alloc() в качестве первого аргумента в свой mmap() (например, если он также использует mmap(), что сделает невозможным сопоставление с этой памятью снова), вы, вероятно, должны использовать другой потокового ввода-вывода из данного примера - IO_METHOD_USERPTR. Он использует тот же ioctl как IO_METHOD_MMAP для захвата кадров и должен обеспечивать аналогичную эффективность.

Ответ 2

Вам понадобится поддержка драйверов от драйвера камеры. mmap получает физические страницы, которые он отображает, из любого отображаемого драйвера - камеры в этом случае. Вы не можете указать mmap использовать некоторые предварительно выделенные страницы, потому что базовому драйверу нужно будет использовать эти предварительно выделенные страницы.