Некоторые вопросы по dma_alloc_coherent - программирование
Подтвердить что ты не робот

Некоторые вопросы по dma_alloc_coherent

  • Является ли адрес DMA, возвращаемый этим вызовом, таким же, как физический адрес? LDD3 говорит, что адрес DMA должен восприниматься драйвером как непрозрачный. Я хочу, чтобы mmap этот буфер DMA, так что пользовательское пространство может читать/записывать непосредственно на него. Вопрос в том, что PFN мне следует указать для remap_pfn_range (что к моему приятному удивлению теперь (ядро 3.4+) работает для обычной памяти так же, как и для памяти ввода/вывода). Могу ли я просто отправить DMA-адрес в unsigned long и преобразовать его в PFN? Разве это не нарушение того, что LDD3 сказал о непрозрачности?

  • Всегда ли dma_alloc_coherent использует __get_free_pages внутренне? Означает ли это, что регион потенциально всегда перенаселен (поскольку первая функция принимает байты, а вторая функция выделяется в единицах страниц)?

  • Есть ли способ настроить одно потоковое сопоставление для нескольких последовательных страниц, полученных от вызова до __get_free_pages? dma_map_page применяется только к одиночным страницам.

4b9b3361

Ответ 1

  • Нет, возвращаемый адрес - это виртуальный адрес, иначе вы не сможете получить доступ к нему из пространства ядра. Это dma_handle, который представляет физический адрес, но он непрозрачен. Вам нужно использовать virt_to_phys по адресу, который он возвращает, а затем передать это на remap_pfn_range.

  • Я не верю, что он (вероятно, зависит от платформы), но он выделяет страницы. Если вам нужна меньшая память для DMA, вы должны использовать dma_pool_create, а затем выделять регионы оттуда.

  • Вы можете использовать dma_map_single вместо dma_map_page.

Я хотел бы посоветовать DMA-API.txt более подробно об этом.