Как общаться с модулем ядра Linux из пространства пользователя, не засоряя / dev новыми узлами? - PullRequest
10 голосов
/ 25 мая 2010

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

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

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

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

Ответы [ 6 ]

8 голосов
/ 27 мая 2010

Разъемы Netlink тоже разработаны для таких требований ...

Также см.

8 голосов
/ 25 мая 2010

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

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

(из Википедия )

3 голосов
/ 25 мая 2010

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

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

2 голосов
/ 25 мая 2010

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

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

0 голосов

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

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

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

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

0 голосов
/ 08 декабря 2016

Вы также можете использовать Общая память и IOCTL

...