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