Параметры модуля

Предыдущая  Содержание  Следующая V*D*V

Некоторые параметры, которые драйвер должен знать, могут меняться от системы к системе. Они могут варьироваться от номера устройства для использования (как мы увидим в следующей главе) до многочисленных аспектов, как драйвер должен работать. Например, драйверы для адаптеров SCSI часто имеют параметры контроля за использованием маркированной очереди комманд (tagged command queuing), а драйвер, интегрированной в устройство электроники (Integrated Device Electronics, IDE), позволяет пользователю управлять операциями DMA. Если ваш драйвер управляет старым оборудованием, он может также нуждаться в точном указании, где найти порты ввода/вывода для оборудования или адреса памяти ввода/вывода. Ядро поддерживает эти потребности, делая возможным для драйвера указать параметры, которые могут быть изменены при загрузке модуля драйвера.

 

Значения параметрам могут быть заданы во время загрузки через insmod или modprobe; последняя также можете прочитать значение параметра из своего файла конфигурации (/etc/modprobe.conf). Команды принимают спецификацию из нескольких типов значений в командной строке. В качестве способа демонстрации этой возможности представьте себе столь необходимое улучшение в модуле “hello world” (названном 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

Булева величина (true или false) (связанная переменная должна быть типа int). Тип invbool инвертирует значение, так что значение true приходит как false и наоборот.

 

charp

Значение указателя на char. Выделяется память для строки, заданной пользователем, и соответствующим образом  устанавливается указатель.

 

int

long

short

uint

ulong

ushort

Базовые целые величины разной размерности. Версии, начинающиеся с u, являются беззнаковыми величинами.

 

Также модулем загрузчика поддерживаются массивы параметров, где значения поставляются как список значений, разделённых запятыми. Чтобы объявить массив параметров, используйте:

 

module_param_array(name,type,nump,perm);

 

Где name - это имя массива (и этого параметра), type - это тип элементов массива, nump - указатель на целочисленную переменную, а perm является обычным значением параметра разрешения доступа. Если во время загрузки задаётся массив параметров, nump задаёт число получаемых переменных. Загрузчик модуля отказывается принимать больше величин, чем может поместиться в массиве.

 

Если вам действительно необходим такой тип, который не фигурирует в списке выше, существуют приёмы в коде модуля, которые позволяют определить их; смотрите moduleparam.h для подробной информации о том, как это сделать. Всем параметрам модуля должны быть присвоены значения по умолчанию; insmod изменяет значение переменной только если это явно указано пользователем. Модуль может определить, какие параметры были заданы, сравнивая их значения со значениями по умолчанию.

 

Последнее поле module_param является значением разрешения доступа; вы должны использовать определения, содержащиеся в <linux/stat.h>. Это значение определяет, кто имеет доступ к представлению параметра модуля в sysfs. Если perm установлен в 0, вообще нет никакого доступа к записи в sysfs, в противном случае он появится в каталоге /sys/module (* Однако, на момент написания есть разговоры о переносе куда-то в sysfs.) с заданным набором разрешений. Для параметра, который может читаться кем угодно, но не может быть изменён, используйте S_IRUGO; S_IRUGO | S_IWUSR позволяют root-у изменить параметр. Заметим, что если параметр изменяется через sysfs, значение этого параметра, видимого модулем, изменяется, но ваш модуль не уведомляется об этом любым другим способом. Вы, вероятно, не сделаете параметры модуля записываемыми, если вы не готовы детектировать изменения и реагировать соответствующим образом.

Предыдущая  Содержание  Следующая