Драйвер Linux: ioctl или sysfs?

Я пишу драйвер для управления некоторым нестандартным оборудованием.

Раньше (то есть 15 лет назад) я делал это с ioctls, но теперь я копаюсь в sysfs как на возможную альтернативу.

  • Насколько я понимаю, ioctls не полностью устарели, но предпочтительнее sysfs (?)
  • Мне нужно читать / записывать наборы значений одновременно, то есть через одну запись в sysfs. Я читал, что это не идеально, но при необходимости приемлемо (?)
  • Драйвер должен иметь защиту «mutex», чтобы только одно приложение могло писать в него одновременно. (У меня есть несколько информационных записей, предназначенных только для чтения, которые я бы предпочел сделать доступными для всех в любое время).

Учитывая вышеизложенное, что было бы лучше всего продолжить - ioctl или sysfs?

Если sysfs, то как мне реализовать монопольный доступ?

Если sysfs, то если у драйвера нет fops чтения / записи / ioctl, нужно ли ему открывать / выпускать ?!

(Это «частный» драйвер, поэтому меня это особо не волнует;), но подумал, что если новые способы более применимы, то я мог бы с таким же успехом разобраться с ними!)

Спасибо.


person ColH    schedule 10.11.2016    source источник


Ответы (1)


Постараюсь хотя бы частично ответить на ваш вопрос. Не стесняйтесь комментировать, чтобы попросить меня расширить (или сжать!)

  • Прежде всего, в наши дни ioctls больше не считаются устаревшими, поскольку люди не нашли лучших решений для всех проблем, которые они решают. Тем не менее, ожидается, что люди будут более дисциплинированно определять интерфейсы ioctl и честно выражать то, что они будут читать и писать в кодировке чисел ioctl, если это вообще возможно. ioctls и sysfs имеют разные сильные стороны.
  • sysfs в основном полезен для отображения определенных атрибутов устройств в пользовательском пространстве, в частности для пользователя на консоли или в сценарии оболочки, и позволяет изменять эти атрибуты или конфигурацию устройства. Один файл sysfs обычно сопоставляется с одним атрибутом и обычно доступен для чтения (и / или записи) как простая текстовая строка. Например, он может раскрыть текущее состояние управления питанием устройства (например, «Выкл») и позволить вам написать новое, используя команду оболочки «cat».
  • sysfs действительно не привязан к сеансу открытия / выпуска (и вам не нужно реализовывать их для его использования), поэтому он, вероятно, действительно подходит только для глобальных атрибутов. Не должно быть проблемой, если ожидается, что пользователь будет выполнять только одну операцию на устройстве за раз, но усложняет ее принудительное исполнение (что, вероятно, не идеально для ваших «наборов данных одновременно», если вы не закодируете их все в одна струна). И да, вы хотите защитить любые данные драйвера, к которым вы будете получать доступ из ваших обработчиков sysfs, с помощью мьютексов, возможно, по одному мьютексу на логический набор данных (или один для нескольких логических наборов).
  • ioctl лучше подходит для передачи двоичной информации между пользовательским пространством и драйвером, и для его использования требуется программа на языке C или аналогичная. Пользовательские ioctl хорошо подходят для написания минимального драйвера в ядре и помещения логики в соответствующую программу пользовательского пространства. В отличие от sysfs, ему не нужна дополнительная логика для интерпретации текстовых строк - он может читать и записывать данные прямо из памяти пользовательского процесса, что означает меньше ненужного кода, но также больше возможностей не проверять данные тщательно.
person michaeljt    schedule 21.12.2016
comment
Спасибо за мнение, Майкл. Я думаю, что ваше восприятие компромиссов совпадает с моим чувством, - person ColH; 22.12.2016
comment
Может быть, вы тогда согласитесь с ответом, если он вам покажется разумным? Спасибо. - person michaeljt; 02.01.2017