Внутреннее устройство ядра Linux 2.4




Разбор командной строки - часть 2


Для написания кода, обрабатывающего командную строку, следует использовать макрос __setup(), определенный в include/linux/init.h:

/* * Used for kernel command line parameter setup */ struct kernel_param { const char *str; int (*setup_func)(char *); };

extern struct kernel_param __setup_start, __setup_end;

#ifndef MODULE #define __setup(str, fn) \ static char __setup_str_##fn[] __initdata = str; \ static struct kernel_param __setup_##fn __initsetup = \ { __setup_str_##fn, fn }

#else #define __setup(str,func) /* nothing */ endif

Ниже приводится типичный пример, при написании собственного кода (пример взят из реального кода драйвера BusLogic HBA drivers/scsi/BusLogic.c):

static int __init BusLogic_Setup(char *str) { int ints[3];

(void)get_options(str, ARRAY_SIZE(ints), ints);

if (ints[0] != 0) { BusLogic_Error("BusLogic: Obsolete Command Line Entry " "Format Ignored\n", NULL); return 0; } if (str == NULL *str == '\0') return 0; return BusLogic_ParseDriverOptions(str); }

__setup("BusLogic=", BusLogic_Setup);

Обратите внимание, что __setup() не делает ничего в случае, когда определен литерал MODULE, так что, при необходимости обработки командной строки начальной загрузки как модуль, так и статически связанный код, должен вызывать функцию разбора параметров "вручную" в функции инициализации модуля. Это так же означает, что возможно написание кода, который обрабатывает командную строку, если он скомпилирован как модуль, и не обрабатывает, когда скомпилирован статически, и наоборот.

Назад




Содержание  Назад  Вперед