Параметри модулів

Ядро Linux надає можливість драйверам визначати параметри, які користувач буде вказувати при завантаженні ядра або модуля Ці параметри будуть доступні коду модуля в якості глобальних змінних Зазначені параметри модулів також будуть відображатися в файлової системі sysfs (див главу 17, Обєкти kobject і файлова система sysf) Визначати параметри модуля і керувати ними просто

Параметр модуля визначається за допомогою макросу module_para m () так

module_param(name, type, perm)

де аргумент name – це імя неременной, яка зявляється в модулі, і імя параметра, який може вказати користувач Аргумент typ e – це тип даних параметра Значення типу можуть бути наступними: byte, short, ushort, int uint, long, ulong, charp, boo l або invbool Ці значення відповідають наступним типам даних: байт коротке ціле число коротке ціле число без знака ціле число ціле число без знака довге ціле довге ціле число без знака покажчик на рядок символів булевий тип булевий тип, значення якого інвертується по порівняно з тим, яке вказує користувач Дані типу byt e зберігаються у змінній типу char, а дані булевих типів – в змінних типу int Остальниетіпи відповідають аналогічним типам мови С Нарешті, аргумент perm вказуючи-

ет права доступу до відповідного файлу у файловій системі sysfs Права доступу можна вказати як у звичайному вісімковому форматі, наприклад 0644 (власник має права на читання і запис, група має права на читання і запис, інші користувачі мають право тільки на читання), так і у вигляді визначень препроцесора, обєднаних за допомогою оператора | , Наприклад S_IRUGO | S_IWUSR (все можуть зчитувати дані, а власник також і записувати) Нульове значення цього параметра призводить до того, що відповідний файл у файловій системі sysfs не зявляється

Цей макрос не визначає зміннуПеред тим як використовувати макрос, відповідну змінну потрібно визначити У звязку з цим типовий приклад використання може бути наступним

/ * Параметр модуля, який управляє змінної bait * /

static int allow live bait = 1 / * За замовчуванням включено * /

module_param (allow_live_bait, bool, 0644) / * Булевий тип * /

Це визначення має бути в глобальній області видимості, тобто неременная allow_live_bai t повинна бути глобальною

Існує можливість дати зовнішньому параметру модуля імя, відмінне від імені змінної Це можна зробити за допомогою макросу module_param_named ()

module_param_named(name, variable, type, perm)

де name – це імя зовнішнього параметра модуля, a variabl e – імя внутрішньої глобальної змінної модуля, як показано нижче

static unsigned int max_test = DEFAULT_МАХ_LINE_TEST

module_param_named (maximum_line_test, max_test, int, 0)

Для того щоб визначити параметр модуля, значенням якого є рядок символів, необхідно використовувати тип charp Ядро копіює передану користувачем рядок символів в память і присвоює змінної покажчик на цей рядок, як у наступному прикладі

static char *name

module_param(name, charp, 0)

При необхідності ядро ​​може скопіювати рядок у заздалегідь певний масив символів, який вказує розробник Це робиться за допомогою макросу module_param_string ()

module_param_string(name, string, len, perm)

де name – це імя зовнішнього параметра, strin g – імя внутрішньої змінної, яка містить покажчик на область памяті масиву, le n – розмір буфера string (або деякий менше число, ніж розмір буфера, що, однак, зазвичай не має сенсу), perm – права доступу до файлу на файлової системі sysfs (нульове значення забороняє доступ до параметру через sysfs) Приклад показаний нижче

static char species[BUF_LEN]

module_param_string (specifies, species, BUF_LEN, 0)

Як параметри модуля також можна передавати список значень, які розділені комою і в коді модуля будуть записані в масив даних Ці пара-

метри модуля можна обробити за допомогою макросу module_param_array () так

module_param array(name, type, nump, perm)

У даному випадку аргумент name – це імя зовнішнього параметра і внутрішньої змінної, typ e – це тип даних одного значення, a perm – це права доступу до файлу на файлової системі sysfs Новий аргумент nump – це покажчик на цілочисельне значення, де ядро ​​зберігає кількість елементів, записаних в масив Зверніть увагу, що масив, який передається як параметр name, повинен бути виділений статично Ядро визначає розмір масиву на етапі компіляції і гарантує, що він не буде переповнений Як використовувати даний макрос, показано в наступному прикладі

static int fish[MAX_FISH]

static int nr_fish

module_param_array(fish, int, &ampnr_fish, 0444)

Внутрішній масив може мати імя, відмінне від імені зовнішнього параметра, в цьому випадку слід використовувати макрос module_param_array_named ()

module_param_array_named(name, array, type, nump, perm)

Параметри ідентичні аналогічним параметрам інших макросів

Нарешті, параметри модуля можна документувати, використовуючи макрос MODULE_ PARM_DESC ()

static unsigned short size = 1

module_param(size, ushort, 0644)

MODULE_PARM DESC(size, &quotThe size in inches of the fishing pole &quot \ &quotconnected to this computer&quot)

Вага описані в цьому розділі макроси вимагають включення заголовного файлу

&ltlinux/moduleparamh&gt

Джерело: Лав, Роберт Розробка ядра Linux, 2-е видання : Пер з англ – М: ТОВ «ІД Вільямс »2006 – 448 с : Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*