Энциклопедия разработчика модулей ядра Linux | страница 25
> }
> putchar(c);
> }
> putchar('\n');
>}
>/* Main - Call the ioctl functions */
>main() {
> int file_desc, ret_val;
> char *msg = "Message passed by ioctl\n";
> file_desc = open(DEVICE_FILE_NAME, 0);
> if (file_desc < 0) {
> printf("Can't open device file: %s\n", DEVICE_FILE_NAME);
> exit(-1);
> }
> ioctl_get_nth_byte(file_desc);
> ioctl_get_msg(file_desc);
> ioctl_set_msg(file_desc, msg);
> close(file_desc);
>}
Загрузочные параметры
Во многих из предыдущих примеров, мы жестко задавали какие-либо параметры в модуле. Это идет против правил Unix и Linux, философия которых такова, что программа должна быть гибкой, чтобы пользователь мог ее настраивать.
Способ сообщить программе или модулю что-либо до запуска это параметры командной строки. В случае ядерных модулей, мы не получаем argc и argv. Вместо этого, мы получаем кое-что лучше. Мы можем определять глобальные переменные в модуле, и insmod заполнит их для нас.
В этом ядерном модуле мы определяем две таких переменных: str1 и str2. Все, что Вы должны делать это скомпилировать модуль и затем выполнить insmod str1=xxx str2=yyy. При вызове init_module str1 укажет на строку `xxx' и str2 на строку `yyy'.
В версии 2.0 не имеется никакого контроля соответствия типов аргументов[6]. Если первый символ str1 или str2 является цифрой, ядро заполнит переменную значением целого числа, а не указателем на строку. В реальной ситуации Вы должны проверять это.
С другой стороны, в версии 2.2 Вы используете макрокоманду MACRO_PARM , чтобы сообщить insmod, что Вы ожидаете параметры, их имена и их типы. Это решает проблему типа и позволяет модулям получать строки, которые начинаются с цифры.
>/* param.c
>*
>* Receive command line parameters at module installation
>*/
>/* Copyright (C) 1998-99 by Ori Pomerantz */
>/* The necessary header files */
>/* Standard in kernel modules */
>#include
>#include
>/* Deal with CONFIG_MODVERSIONS */
>#if CONFIG_MODVERSIONS==1
>#define MODVERSIONS
>#include
>#endif
>#include
>/* In 2.2.3 /usr/include/linux/version.h includes a
>* macro for this, but 2.0.35 doesn't - so I add it
>* here if necessary. */
>#ifndef KERNEL_VERSION
>#define KERNEL_VERSION(a,b,c) ((a)*65536+(b)*256+(c))
>#endif
>/* Emmanuel Papirakis:
>*
>* Parameter names are now (2.2) handled in a macro.
>* The kernel doesn't resolve the symbol names