Linux Device Drivers 3 / Драйверы устройств Линукс (третье издание): 2.8. Параметры модуля
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Параметры модуля mahoro 23.10.10 в 11:07 |
|
|
Различные параметры, в которых нуждается драйвер, могут меняться от системы к системе. Они могут быть различными в зависимости от используемого номера устройства (как это мы увидим в следующей главе) и определять многочисленные аспекты работы драйвера. Например, драйверы SCSI адаптеров часто имеют параметры контроля за использованием очереди помеченных команд (tagged command queuing), а IDE драйверы позволяют пользователю контролировать DMA операции. Если ваш драйвер управляет устаревшим оборудованием, он может нуждаться в явном указании портов ввода/вывода оборудования или в адресах ввода/вывода в памяти. Ядро поддерживает эти потребности тем, что позволяет указать для драйвера параметры, которые могут быть изменены при загрузке модуля драйвера. victor8632 09.11.10 в 07:35 |
||
|
Значения этих параметров могут быть заданы во время загрузки при помощи insmod или modprobe; последняя утилита может также считать параметры из конфигурационного файла (/etc/modprobe.conf ). В командной строке могут фигурировать значения различных типов. Чтобы продемонстрировать эту возможность, представим себе, что в модуль "Привет мир" (названный hellop), показанный в начале этой главы, внесено улучшение. Мы добавили два параметра: целое значение, названное howmany, и строку символов, названную whom. Наш модуль повышенной функциональности выводит приветствие whom не один раз, а howmany раз. Командная строка для загрузки такого модуля будет выглядеть следующим образом: victor8632 09.11.10 в 09:47 |
||
|
<code> ximen 25.10.10 в 09:02 |
||
|
Загруженный таким образом, hellop скажет "Hello, Mom" 10 раз. ximen 25.10.10 в 09:03 |
||
|
Однако, до того, как insmod сможет изменить параметры модуля, модуль должен сделать эти параметры доступными. Параметры объявляются макросом module_param, который определён в moduleparam.h. module_param принимает три параметра: имя переменной, её тип и маска разрешений, используемая для записи в sysfs. Макрос должен быть размещён за пределами функций и обычно находится ближе к началу файла. Итак, hellop объявляет свои параметры и делает их доступными для insmod следующим образом: ximen 25.10.10 в 12:23 |
||
|
<code> ximen 25.10.10 в 09:03 |
||
|
Множество типов поддерживается для параметров модуля: ximen 25.10.10 в 09:04 Для параметров модуля поддерживаются следующие типы: victor8632 09.11.10 в 08:00 |
||
|
<code> ximen 25.10.10 в 09:04 |
||
|
Логическое (истина или ложь) значение (связанная переменная должна иметь тип int). Тип invbool инвертирует значение так, что истина становится ложью и наоборот. ximen 25.10.10 в 13:17 |
||
|
<code> ximen 25.10.10 в 09:05 |
||
|
Указатель на строку символов. Для строки, передаваемой пользователем, выделяется память, и соответственно устанавливается указатель. ximen 25.10.10 в 13:20 |
||
|
<code> ximen 25.10.10 в 09:05 |
||
|
Базовые целочисленные значения различной длины. Варианты, начинающиеся с u означают беззнаковые значения. ximen 25.10.10 в 09:06 |
||
|
Параметры-массивы, значения которых представляют собой список, разделенный запятыми, также поддерживаются загрузчиком модулей. Для объявления параметров-массивов используется ximen 25.10.10 в 13:24 |
||
|
Здесь <code>name</code> -- это имя массива (и параметра), <code>type</code> -- тип элементов массива, <code>num</code> -- целочисленная переменная, а <code>perm</code> -- обычное значение разрешений. Если параметр-массив указывается при загрузке, <code>num</code> устанавливается равным числу передаваемых значений. Загрузчик модулей не принимает больше значений, чем может поместиться в массив. ximen 26.10.10 в 11:33 |
||
|
Если вам нужен другой тип, не указанный в списке, приведенном выше, в модуле есть хуки (hooks), которые позволят определить его; см. moduleparam.h для получения более подробной информации о том, как это сделать. Все параметры модуля должны иметь значения по умолчанию; insmod меняет значение только тогда, когда оно явно указано пользователем. Модуль может проверить значения явно заданных параметров по сравнению со значениями по умолчанию. victor8632 10.11.10 в 06:56 |
||
|
Последним полем module_param является значение permission; для его определения вы должны использовать определения из файла stat.h>. Это значение определяет, кто может получить доступ к представлению параметра модуля в sysfs. Если это значение равно 0, параметр в sysfs не виден никому, в противном случае он появляется в /sys/module[3] с заданным значением доступа. Используйте S_IRUGO для параметра, который может быть всеми прочитан, но не изменен; сочетание S_IRUGO|S_IWUSR позволит изменять значение параметра пользователю root. Имейте в виду, что если параметр изменен через sysfs, значение этого параметра отразится на работе вашего модуля, но ваш модуль никак не будет предупрежден об этом изменении. Вероятно, вы должны сделать параметры модуля недоступными для записи, до тех пор, пока не будете готовы для обнаружения изменений и к соответствующей реакции на это событие. victor8632 10.11.10 в 07:07 |
||
|
[3] На момент написания раздела шли разговоры о перемещении параметров в другое место внутри sysfs. victor8632 10.11.10 в 07:23 |
