Быстрый буфер памяти mmaped для DMA
В настоящее время я разрабатываю драйвер Linux для DMA. Драйвер выделяет область памяти, используя dma_alloc_coherent
, который я сопоставляю с пользовательским пространством, используя _dma_mmap_id = (int*) mmap(NULL, buffer_size, PROT_READ | PROT_WRITE, MAP_SHARED, _dma_device_id, 0);
, В пользовательском пространстве я пишу и читаю в эту область и запускаю передачи DMA.
Однако я заметил, что запись в область mmaped очень медленная (~100 МБ / с). Соответственно, я ищу подходы, чтобы ускорить это.
Я пытался выделить некогерентную память (используя kmalloc
а также dma_alloc_noncoherent
) в целях тестирования (только для того, чтобы увидеть, ускоряет ли это доступ к памяти), но в этих случаях объем памяти, который я не могу выделить, очень ограничен (например, 4 МБ для kmalloc
), что меньше, чем объем памяти, который я собираюсь передать в одном доступе DMA.
Поэтому я не уверен, какие возможные альтернативы могут привести к более высокой производительности.
- Есть ли возможность скопировать данные в этот регион быстрее, чем
memcpy
? - Можно ли выделить большие области кэшированной памяти? С помощью
dma_alloc_coherent
Я могу выделить до 64 МБ - почему это намного больше, чем объем памяти, который может быть выделен с помощьюkmalloc
? - Каковы альтернативные подходы?
В настоящее время перенос данных в область mmaped является узким местом в моем приложении.
С наилучшими пожеланиями, Апо
1 ответ
Какую архитектуру вы используете? Если вы используете AMRv7, то dma_alloc_coherent выделяет некэшированную память, и это в конечном итоге снижает производительность.