Как связаться с модулем ядра Linux из пользовательского пространства без мусора /dev с новыми узлами?

Каковы способы связи с модулем ядра из пользовательского пространства? Посредством связи я имею в виду отправку информации и команд между модулем ядра и пользовательским пространством.

В настоящее время я знаю два пути:

  • открыть/закрыть/прочитать/написать/ioctl на опубликованном устройстве node.
  • чтение/запись на экспортированном и подключенном /proc файле.

В частности, может ли кто-нибудь посоветовать лучший способ общения с модулем ядра, который фактически не управляет каким-либо оборудованием, и поэтому не должен засорять /dev узлами-заглушками, которые существуют исключительно для вызовов ioctl? Мне в основном нужно проверить его различные переменные статуса и отправить ему блок данных с тегом типа запроса и посмотреть, удалось ли выполнить запрос.

Ответ 2

Также существует файловая система /sys (sysfs):

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

(из Wikipedia)

Ответ 3

Вы также можете читать/записывать узлы /dev устройства.

IMHO,/dev уже завален материалом и добавляет свои собственные узлы, нет большой проблемы. Не забывайте, что у вас может быть много кодов ioctl для одного устройства node, а параметры ioctl передаются по ссылке, поэтому они могут быть такими большими, как вам нравится.

Ответ 4

Третий - это добавить новый syscall, но два, которые вы написали, являются предпочтительными, я думаю. Я нашел этот документ, который мог бы помочь, но я все еще думаю, что этот параметр недопустим: http://www.csee.umbc.edu/courses/undergraduate/CMSC421/fall02/burt/projects/howto_add_systemcall.html

Другим приемлемым вариантом может быть совместное использование памяти.

Ответ 6

debugfs - еще одна хорошая возможность для API, которые менее стабильны, чем sysfs, но API в основном тот же. Ниже приведен пример минимальный runnable.

configfs - еще один. Это позволяет легко динамически создавать объекты ядра из пользовательского пространства через файловую систему: https://www.kernel.org/doc/Documentation/filesystems/configfs/configfs.txt

В любом случае вам придется загрязнить некоторое пространство имен... запись в файловой системе в случае sysfs и debugfs. Просто выберите свой яд.

Кроме того, правила udev делают /dev очень похожим на sysfs и debugfs: Как автоматически создать устройство в /dev при загрузке модуля ядра для драйвера устройства?