У меня есть драйвер Linux, который выполняет передачу DMA на / с устройства. Для отправки данных на устройство (для предотвращения операций копирования) драйвер отображает буфер пользовательского пространства и использует его для DMA напрямую через get_user_pages_fast()
. Затем пользовательские страницы добавляются в список с разбросом и используются для прямого доступа к памяти.
Это работает довольно хорошо, но одна проблема заключается в том, что это заставляет буфер пользовательского пространства иметь различные требования к выравниванию строки кэша ЦП. Моя система возвращает 128
, когда вы вызываете dma_get_cache_alignment()
, что означает, что в пользовательском пространстве я должен убедиться, что начальный адрес выровнен с этим значением. Кроме того, я должен проверить, что размер буфера кратен 128.
Я вижу два варианта решения этой проблемы:
copy_from_user()
для перемещения данных в правильно выровненный буфер пространства ядра. Меня не слишком беспокоит производительность здесь, так что это вариант, но он потребует значительной доработки.Что мне не хватает? Я надеюсь, что может быть какой-то волшебный флаг или что-то, что я упустил, чтобы полностью удалить требование выравнивания.
«1. Разберись с этим» - вот наш подход. Это было относительно просто, потому что для доступа к устройству в любом случае использовался специальный API. В Windows буфер dma выделяется с помощью VirtualAlloc, в Linux - с помощью valloc.