Я учусь писать драйверы ядра Linux, и теперь я хотел бы дать пользователю из пользовательского пространства возможность изменять поведение моих модулей (или любой другой подсистемы / модуля).
Я хотел бы сохранить любое значение (список строк) в любом типе файла / системы конфигурации и в виде значения внутри файла / системы - изменить поведение модулей.
Я думал о procfs
, я могу создать модуль, который создает /proc/file
и реагирует на операции чтения / записи из пользовательского пространства.
Дело в том, как прочитать эту конфигурацию от другого, назовите его B, модуль в пространстве ядра?
Возможно, возможен другой тип конфигурации (я думал о sysctl, но вижу, что строки не хранятся, и мне нужно сохранить какой-то простой «список»).
1) Обычно, если это конфигурация и какой-то список параметров, ioctl более популярен и рекомендуют его использовать.
2) Вы спрашиваете, есть 2 модуля ядра - A и B, и вы хотите прочитать конфигурацию A на B. Верно? В этом случае, независимо от того, какой у вас proc или ioctl (помните, что proc - это не настоящая файловая система. Вы печатаете или читаете и возвращаете какое-то значение из некоторых переменных ядра ... вы можете читать содержимое из "fs" с помощью VFS в ядре и вернуть строку, но это очень глупо, поскольку у вас есть контроль над пользовательским пространством.), в конце концов, вам нужно сохранить конфигурацию модуля ядра в некоторых переменных. Если вы хотите прочитать их из другого модуля, ваша переменная должна быть представлена с помощью ключевого слова EXPORT_SYMBOL (), но обычно мы этого не делаем.
Создайте некоторый API на вашем символе, который возвращает значение конфигурации, выставьте эти API и вызовите его из другого модуля. Из-за зависимости модуля вам может потребоваться соблюдать осторожность.
Самый простой способ сделать это - создать некоторую функцию обратного вызова и определить ее в исходном коде ядра. А затем, когда модуль A инициализирован, настройте ptr обратного вызова и вызовите его из модуля B. В этом случае вы избавитесь от зависимости модуля.
или создайте указатель обратного вызова на модуле B и сделайте модуль B встроенным модулем и предоставьте ptr обратного вызова.
Затем из модуля A вы можете инициализировать их, и всякий раз, когда вы вызываете его из B, вы можете проверять "null ptr" на этом ptr обратного вызова.
Надеюсь, это вам поможет.