файл конфигурации для модуля ядра - PullRequest
0 голосов
/ 18 декабря 2018

Я учусь писать драйверы для ядра Linux, и теперь я хотел бы предоставить пользователю из пространства пользователя возможность изменять поведение моих модулей (или любой другой подсистемы / модуля).

Я хотел бы сохранить любое значение (список строк) в любом файле конфигурации / системе и в форме значения внутри файла / системы - изменить поведение модулей.

Я думал о procfs, я могу создать модуль, который создает /proc/file и реагирует на операции чтения / записи из пространства пользователя.

Дело в том: как прочитать эту конфигурацию из другой, назовите ее B, модуль в пространстве ядра?

Возможно, возможен другой тип конфигурации (я думал о sysctl, но вижу, что строки не хранятся, и мне нужно хранить какой-то простой "список").

1 Ответ

0 голосов
/ 20 декабря 2018

1) Обычно, если это конфигурация и список параметров, ioctl более популярен и рекомендует его использовать.

2) Вы спрашиваете, есть 2 модуля ядра - A и B, и выхотите прочитать конфигурацию А на Б.В этом случае, независимо от того, что у вас есть proc или ioctl (помните, proc не является реальной файловой системой. Вы печатаете или читаете и возвращаете некоторое значение из некоторых переменных ядра ... вы можете прочитать содержимое из "fs" с помощью VFSв ядре и вернуть строку, но это очень и очень глупо, так как у вас есть контроль над пользовательским пространством.), в конце концов, вам нужно сохранить конфигурацию модуля ядра для некоторых переменных.Если вы хотите прочитать их из другого модуля, ваша переменная должна быть представлена ​​с помощью ключевого слова EXPORT_SYMBOL (), но обычно мы этого не делаем.

Создайте некоторый API на вашем символе, который возвращает значение конфигурации ивыставить эти API и вызвать его из другого модуля.Из-за зависимости от модуля вам может потребоваться быть осторожным.

Самый простой способ сделать это - создать некоторый ptr обратного вызова и определить его в исходном коде ядра.И затем, когда модуль A инициализируется, настройте ptr обратного вызова и вызовите его из модуля B. В этом случае вы избавитесь от зависимости модуля.

или создадите указатель обратного вызова на модуле B и создадите модуль Bкак встроенный модуль и выставить ptr обратного вызова.

Затем из модуля A вы можете инициализировать их и всякий раз, когда вы вызываете его из B, вы можете проверить «нулевой ptr» в этом обратном вызове ptr.

Надеюсь, что это поможет вам.

...