|
Навигация
|
Главная » Linux Разработка модулей ядра Linux: Часть 11. Использование параметров при загрузке модуляИсточник: IBM ВведениеПосле рассмотрения общих вопросов, связанных с инсталляцией и де-инсталляцией модулей ядра, следует рассмотреть более сложные вопросы, связанные с данным аспектом разработки модулей ядра. В данной статье будет рассматриваться использование параметров для передачи значений в модуль ядра в ходе его загрузки. Параметры, передаваемые модулю при загрузке При загрузке модуля ему могут быть переданы значения параметров. Здесь наблюдается полная аналогия (по смыслу, но не по формату) с передачей параметров пользовательскому процессу из командной строки через параметры: argс и массив argv[] . Такую передачу параметров модулю при его загрузке можно проследить в ближайшем рассматриваемом драйвере символьного устройства (архив cdev.tgz с этим примером будет рассмотрен в одной из следующих статей). Более того, для этого модуля, если значение параметра не указано явно, устанавливается значение по умолчанию (динамически определяемый системой старший номер устройства), а если параметр указан, то принудительно устанавливается заданное значение, даже если оно и недопустимо с точки зрения системы. Этот фрагмент кода выглядит, как показано ниже:
В нем определяется переменная-параметр (с именем major ), и далее это же имя указывается в макросе module_param() . Подобный макрос должен быть записан для каждого предусмотренного параметра и должен последовательно определять:
insmod или modprobe ; последняя команда также может считать значение параметра из своего файла конфигурации (/etc/modprobe.conf), используемого для загрузки модулей.Обработка входных параметров для модуля обеспечивается макросами (описанными в
Из этого подмножества чаще всего употребляются два макроса: module_param() и module_param_array() (детально изучить, как они работают, можно будет с помощью примера, который будет рассматриваться ниже).Примечание: В последнем параметре perm указываются права доступа (например, S_IRUGO / S_IWUSR), относящиеся к имени параметра, отображаемому в подсистеме /sys, если же нас не интересует имя параметра, отображаемое в /sys, то правильным значением для параметра perm будет 0.Для параметров модуля в макросе module_param() могут использоваться следующие типы:
module_param_array() ).В листинге 1 показан пример, демонстрирующий большинство приёмов, используемых для загрузки параметров модуля (файл mod_params.c из архива parms.tgz в разделе "Материалы для скачивания"). Листинг 1. Модуль, использующий входные параметры
В коде этого модуля есть два момента, которые могут показаться Си-программисту непривычными: отсутствие резервирования памяти для символьного параметра sparam и динамический размер (после загрузки модуля) параметра-массива aparam . Но оба эти вопроса объясняются ниже.Выполним следующие команды, чтобы сравнить, как выполняется загрузка модуля с параметрами по умолчанию, а затем - с переопределением значений всех параметров: Листинг 2. Примеры загрузки модуля с указанием параметров и без указания параметров.
Команда insmod жестко контролирует параметры, передаваемые при загрузке, и их значения (хотя, естественно, всё проконтролировать абсолютно невозможно), так как если модуль, загруженный с ошибочными значениями параметров, станет составной частью ядра, возникнет угроза целостности системы. Если хотя бы один из параметров будет признан некорректным, загрузка модуля производиться не будет. Ниже показано, как контролируется процесс загрузки модуля с указанием параметров:
Как видно, имела место попытка поместить в массив aparam большее число элементов, чем в нем было изначально зарезервировано (5).
Была попытка передать параметр, не определённый в модуле.
Была попытка присвоения не числового значения параметру числового типа.
Была превышена максимальная длина для строки, передаваемой копированием. Хотя, надо отдать должное, в реализации подсистемы параметризации модулей, имеющейся в ядре, присутствуют и определенные странности:
В ходе статьи были последовательно рассмотрены все аспекты использования параметров, передаваемых модулям в ходе загрузки. Из фундаментальных вопросов разработки модулей ядра нам осталось изучить только предназначение счетчика ссылок использования модуля и инструментарий, доступный разработчику модулей ядра, что и будет выполнено в следующих статьях. Изучаем Linux, 101: Приоритеты исполнения процесса. Доступно оптимизированное решение Oracle для облачных инфраструктур на SPARC/ Solaris. В ядре Linux найдена локальная root-уязвимость. KLANG - проект новой аудиоподсистемы для ядра Linux и FreeBSD. Lisp: Слезы радости, часть 4. Главная » Linux |
© 2024 Team.Furia.Ru.
Частичное копирование материалов разрешено. |