Ответ 1
Сокеты Netlink также предназначены для такого рода требований...
Также см.
- man 7 netlink
- libnl - библиотека Netlink
- Архив libnl
Каковы способы связи с модулем ядра из пользовательского пространства? Посредством связи я имею в виду отправку информации и команд между модулем ядра и пользовательским пространством.
В настоящее время я знаю два пути:
В частности, может ли кто-нибудь посоветовать лучший способ общения с модулем ядра, который фактически не управляет каким-либо оборудованием, и поэтому не должен засорять /dev узлами-заглушками, которые существуют исключительно для вызовов ioctl? Мне в основном нужно проверить его различные переменные статуса и отправить ему блок данных с тегом типа запроса и посмотреть, удалось ли выполнить запрос.
Сокеты Netlink также предназначены для такого рода требований...
Также см.
Также существует файловая система /sys (sysfs):
Sysfs экспортирует информацию о устройства и драйверы из ядра модели устройства для пользователей, а также используется для конфигурации.
(из Wikipedia)
Вы также можете читать/записывать узлы /dev устройства.
IMHO,/dev уже завален материалом и добавляет свои собственные узлы, нет большой проблемы. Не забывайте, что у вас может быть много кодов ioctl для одного устройства node, а параметры ioctl передаются по ссылке, поэтому они могут быть такими большими, как вам нравится.
Третий - это добавить новый syscall, но два, которые вы написали, являются предпочтительными, я думаю. Я нашел этот документ, который мог бы помочь, но я все еще думаю, что этот параметр недопустим: http://www.csee.umbc.edu/courses/undergraduate/CMSC421/fall02/burt/projects/howto_add_systemcall.html
Другим приемлемым вариантом может быть совместное использование памяти.
Вы также можете использовать общую память и IOCTL
debugfs - еще одна хорошая возможность для API, которые менее стабильны, чем sysfs, но API в основном тот же. Ниже приведен пример минимальный runnable.
configfs - еще один. Это позволяет легко динамически создавать объекты ядра из пользовательского пространства через файловую систему: https://www.kernel.org/doc/Documentation/filesystems/configfs/configfs.txt
В любом случае вам придется загрязнить некоторое пространство имен... запись в файловой системе в случае sysfs и debugfs. Просто выберите свой яд.
Кроме того, правила udev
делают /dev
очень похожим на sysfs и debugfs: Как автоматически создать устройство в /dev при загрузке модуля ядра для драйвера устройства?