Параметры модуля
Различные параметры, в которых нуждается драйвер, могут меняться от системы к системе. Они могут быть различными в зависимости от используемого номера устройства (как это мы увидим в следующей главе) и определять многочисленные аспекты работы драйвера. Например, драйверы SCSI адаптеров часто имеют параметры контроля за использованием очереди помеченных команд (tagged command queuing), а IDE драйверы позволяют пользователю контролировать DMA операции. Если ваш драйвер управляет устаревшим оборудованием, он может нуждаться в явном указании портов ввода/вывода оборудования или в адресах ввода/вывода в памяти. Ядро поддерживает эти потребности тем, что позволяет указать для драйвера параметры, которые могут быть изменены при загрузке модуля драйвера.
Значения этих параметров могут быть заданы во время загрузки при помощи insmod или modprobe; последняя утилита может также считать параметры из конфигурационного файла (/etc/modprobe.conf ). В командной строке могут фигурировать значения различных типов. Чтобы продемонстрировать эту возможность, представим себе, что в модуль "Привет мир" (названный hellop), показанный в начале этой главы, внесено улучшение. Мы добавили два параметра: целое значение, названное howmany, и строку символов, названную whom. Наш модуль повышенной функциональности выводит приветствие whom не один раз, а howmany раз. Командная строка для загрузки такого модуля будет выглядеть следующим образом:
insmod hellop howmany=10 whom="Mom"
Загруженный таким образом, hellop скажет "Hello, Mom" 10 раз.
Однако, до того, как insmod сможет изменить параметры модуля, модуль должен сделать эти параметры доступными. Параметры объявляются макросом module_param, который определён в moduleparam.h. module_param принимает три параметра: имя переменной, её тип и маска разрешений, используемая для записи в sysfs. Макрос должен быть размещён за пределами функций и обычно находится ближе к началу файла. Итак, hellop объявляет свои параметры и делает их доступными для insmod следующим образом:
static char *whom = "world";
static int howmany = 1;
module_param(howmany, int, S_IRUGO);
module_param(whom, charp, S_IRUGO);
Для параметров модуля поддерживаются следующие типы:
bool
invbool
Логическое (истина или ложь) значение (связанная переменная должна иметь тип int). Тип invbool инвертирует значение так, что истина становится ложью и наоборот.
charp
Указатель на строку символов. Для строки, передаваемой пользователем, выделяется память, и соответственно устанавливается указатель.
int
long
short
uint
ulong
ushort
Базовые целочисленные значения различной длины. Варианты, начинающиеся с u означают беззнаковые значения.
Параметры-массивы, значения которых представляют собой список, разделенный запятыми, также поддерживаются загрузчиком модулей. Для объявления параметров-массивов используется
module_param_array(name,type,num,perm);
Здесь
name
-- это имя массива (и параметра), type
-- тип элементов массива, num
-- целочисленная переменная, а perm
-- обычное значение разрешений. Если параметр-массив указывается при загрузке, num
устанавливается равным числу передаваемых значений. Загрузчик модулей не принимает больше значений, чем может поместиться в массив.Если вам нужен другой тип, не указанный в списке, приведенном выше, в модуле есть хуки (hooks), которые позволят определить его; см. moduleparam.h для получения более подробной информации о том, как это сделать. Все параметры модуля должны иметь значения по умолчанию; insmod меняет значение только тогда, когда оно явно указано пользователем. Модуль может проверить значения явно заданных параметров по сравнению со значениями по умолчанию.
Последним полем module_param является значение permission; для его определения вы должны использовать определения из файла stat.h>. Это значение определяет, кто может получить доступ к представлению параметра модуля в sysfs. Если это значение равно 0, параметр в sysfs не виден никому, в противном случае он появляется в /sys/module[3] с заданным значением доступа. Используйте S_IRUGO для параметра, который может быть всеми прочитан, но не изменен; сочетание S_IRUGO|S_IWUSR позволит изменять значение параметра пользователю root. Имейте в виду, что если параметр изменен через sysfs, значение этого параметра отразится на работе вашего модуля, но ваш модуль никак не будет предупрежден об этом изменении. Вероятно, вы должны сделать параметры модуля недоступными для записи, до тех пор, пока не будете готовы для обнаружения изменений и к соответствующей реакции на это событие.
[3] На момент написания раздела шли разговоры о перемещении параметров в другое место внутри sysfs.
Переведено на сайте www.notabenoid.com
http://notabenoid.com/book/11832/38208
Внимание! Этот перевод, возможно, ещё не готов,
так как модераторы установили для него статус
"перевод редактируется"
Комментариев нет:
Отправить комментарий
Примечание. Отправлять комментарии могут только участники этого блога.