Некоторые вопросы по 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
применяется только к отдельным страницам.
1 ответов
нет, возвращаемый адрес является виртуальным адресом, иначе вы не сможете получить к нему доступ из пространства ядра. Это dma_handle, который представляет физический адрес, но он непрозрачен. Вам нужно использовать virt_to_phys по адресу, который он возвращает, а затем передать это remap_pfn_range.
Я не верю, что это так (вероятно, это зависит от платформы), но он выделяет страницы. Если вы хотите меньший объем памяти для DMA, вы должны использовать dma_pool_create, а затем выделять регионы оттуда.
вы можете использовать dma_map_single вместо dma_map_page.
Я бы рекомендовал консультации DMA-API.txt более подробно о некоторых из этих вещей.