Энциклопедия разработчика модулей ядра Linux | страница 26
>* like it seems to have once did.
>*
>* To pass parameters to a module, you have to use a macro
>* defined in include/linux/modules.h (line 176).
>* The macro takes two parameters. The parameter's name and
>* it's type. The type is a letter in double quotes.
>* For example, "i" should be an integer and "s" should
>* be a string. */
>char *str1, *str2;
>#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
>MODULE_PARM(str1, "s");
>MODULE_PARM(str2, "s");
>#endif
>/* Initialize the module - show the parameters */
>int init_module() {
> if (str1 == NULL || str2 == NULL) {
> printk("Next time, do insmod param str1=
> printk("str2=
> } else printk("Strings:%s and %s\n", str1, str2);
>#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
> printk("If you try to insmod this module twice,");
> printk("(without rmmod'ing\n");
> printk("it first), you might get the wrong");
> printk("error message:\n");
> printk("'symbol for parameters str1 not found'.\n");
>#endif
> return 0;
>}
>/* Cleanup */
>void cleanup_module() { }
Системные вызовы
Пока что все программы, которые мы сделали должны были использовать хорошо определенные механизмы ядра, чтобы регистрировать /proc файлы и драйверы устройства. Это прекрасно, если Вы хотите делать что-то уже предусмотренное программистами ядра, например писать драйвер устройства. Но что, если Вы хотите сделать что-то необычное, изменить поведение системы некоторым способом?
Это как раз то место, где программирование ядра становится опасным. При написании примера ниже, я уничтожил системный вызов open. Это подразумевало, что я не могу открывать любые файлы, я не могу выполнять любые программы, и я не могу закрыть систему командой shutdown. Я должен выключить питание, чтобы ее остановить. К счастью, никакие файлы не были уничтожены. Чтобы гарантировать, что Вы также не будете терять файлы, пожалуйста выполните sync прежде чем Вы отдадите команды insmod и rmmod.
Забудьте про /proc файлы и файлы устройств. Они только малые детали. Реальный процесс связи с ядром, используемый всеми процессами, это системные вызовы. Когда процесс запрашивает обслуживание из ядра (типа открытия файла, запуска нового процесса или запроса большего количества памяти), используется этот механизм. Если Вы хотите изменить поведение ядра интересными способами, это как раз подходящее место. Между прочим, если Вы хотите видеть какие системные вызовы использованы программой, выполните: strace