Быстрый буфер памяти 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 выделяет некэшированную память, и это в конечном итоге снижает производительность.

Другие вопросы по тегам