Get_user_pages_fast () для DMA?

У меня есть драйвер Linux, который выполняет передачу DMA на / с устройства. Для отправки данных на устройство (для предотвращения операций копирования) драйвер отображает буфер пользовательского пространства и использует его для DMA напрямую через get_user_pages_fast(). Затем пользовательские страницы добавляются в список с разбросом и используются для прямого доступа к памяти.

Это работает довольно хорошо, но одна проблема заключается в том, что это заставляет буфер пользовательского пространства иметь различные требования к выравниванию строки кэша ЦП. Моя система возвращает 128, когда вы вызываете dma_get_cache_alignment(), что означает, что в пользовательском пространстве я должен убедиться, что начальный адрес выровнен с этим значением. Кроме того, я должен проверить, что размер буфера кратен 128.

Я вижу два варианта решения этой проблемы:

  1. Смирись с этим. То есть в пользовательском пространстве убедитесь, что буфер правильно выровнен. Это звучит разумно, но я столкнулся с некоторыми проблемами, поскольку мое устройство необходимо интегрировать в более крупный проект, и я не могу контролировать передаваемые мне буферы. В результате мне нужно выделить правильно выровненный буфер в пользовательском пространстве, чтобы он располагался между драйвером и приложением и использовал этот буфер в случае, если буфер вызывающего абонента не выровнен. Это добавляет операцию копирования и не конец света, но полученный код довольно беспорядочный.
  2. Переработайте драйвер, чтобы он использовал буфер пространства ядра. То есть измените код так, чтобы драйвер использовал copy_from_user() для перемещения данных в правильно выровненный буфер пространства ядра. Меня не слишком беспокоит производительность здесь, так что это вариант, но он потребует значительной доработки.

Что мне не хватает? Я надеюсь, что может быть какой-то волшебный флаг или что-то, что я упустил, чтобы полностью удалить требование выравнивания.

«1. Разберись с этим» - вот наш подход. Это было относительно просто, потому что для доступа к устройству в любом случае использовался специальный API. В Windows буфер dma выделяется с помощью VirtualAlloc, в Linux - с помощью valloc.

Gunther 01.12.2020 09:11
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
343
0

Другие вопросы по теме