Некоторые вопросы по DMA alloc coherent

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

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

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

1 ответов


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

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

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

Я бы рекомендовал консультации DMA-API.txt более подробно о некоторых из этих вещей.