Запись данных в драйвер Linux, с дополнительным параметром - PullRequest
1 голос
/ 27 июля 2011

Я не очень знаком с разработкой драйверов, но мне нужно выполнить простую адаптацию драйверов, и я не уверен в том, что делать дальше.Я не ищу подробных объяснений (которые я могу проверить в книге), но больше о том, какие «лучшие практики» показывают мне отправную точку моего сбора знаний.

Проблема заключается в следующем:

Изначально у нас был очень простой драйвер char, выполняющий эту операцию:

User       "write"         driver copies
Space ==== packets  =====> the data
Code       to open fd      from user space
           of the driver   and passes it to 
                           a hw controller

Простая адаптация заключается в том, что теперь контроллеру hw требуется дополнительный числовой тег для идентификациитип пакета.Обычно этот тег должен указываться вместе с каждым записанным пакетом.

Что более разумно сделать?

  • создать отдельный вызов ioctl для предоставления этого тега, а затем выполнить "написать «вызов реальных данных пакета (а затем использовать« ioctl »и« запись »в пространстве пользователя).
  • создать вызов ioctl для одновременной передачи тега и данных пакета (а затем использовать этот« ioctl »).«вызов в пользовательском пространстве»
  • создание дополнительной структуры (совместно используемой пользовательским пространством и драйвером), содержащей тег и указатель на буфер, а затем «запись» этой структуры в пользовательское пространство (таким образом, копирование дваждыиз пространства пользователя: один для структуры и второй для пакетных данных).
  • ...?

Любая подсказка / комментарий / предложение приветствуются.

1 Ответ

1 голос
/ 27 июля 2011

Первый и третий параметры практически одинаковы по производительности (два вызова в ядро ​​и обратно), но использование write более красиво, чем ioctl.

Второй вариант позволяет вам переключать контекст в ядро ​​и обратно,но уродливо.

Я бы определил структуру с первым байтом типа пакета и оставил бы буфер с пакетными данными, но вместо этого напишу пользователь writev (), а не write (), чтобы отправить его в ядро.

Мало того, что он спасает вас от дополнительного переключения контекста, он фактически позволяет вам отправлять несколько пакетов (и их типов) за один вызов ядра, если он доступен.

Некоторые скажут, что нет никакой разницымежду моим предложением и вашим вторым.Возможно, они правы: -)

...