启动参数9dTLinux联盟 在前面的很多例子中,我们不得不硬性的将一些东西写如内核模块,例如在 /proc 中的文件名或设备的主设备号,因此我们可以对它 ioctl。 这和 Unix及 Linux的编写用户可以定制的灵活的程序精神是相矛盾的。9dTLinux联盟 在程序或内核模块能开始工作之前告诉它一些需要的东西的办法是通过命令行参数。在内核模块的情况下,我们不能得到 argc 和 argv -- 代替的,我们得到更好的东西。我们可以在内核模块中定义全局变量并且 insmod将为我们填充它们。9dTLinux联盟 在这个内核模块中,我们定义了两个: str1 和 str2。你所需要做的全部就是编译那个内核模块然后用insmod str1=xxx str2=yyy运行它。当init_module 被调用,str1 将指向字符串‘xxx’, str2 将指向‘yyy’。9dTLinux联盟 在 2.0 版中对这些参数6.1没有类型检查。如果str1 或 str2 的第一个字符是数字,内核将用整数值填充变量而不是字符串指针。如果是在实际的情形下你需要检查这个。9dTLinux联盟 另一方面,在 2.2 版中你用宏 MACRO_PARM 告诉 insmod 你期待一个参数,它的名字和类型 。这解决了类型的问题并且允许内核模块接收以数字开始的字符串。9dTLinux联盟 范例 param.c9dTLinux联盟 /* param.c9dTLinux联盟 *9dTLinux联盟 * 在模块被安装时接收命令行参数9dTLinux联盟 */9dTLinux联盟 /* Copyright (C) 1998-99 by Ori Pomerantz */9dTLinux联盟 /* 必要头文件 */9dTLinux联盟 /* 标准头文件 */9dTLinux联盟 #include /* 内核工作 */9dTLinux联盟 #include /* 明确指定是模块 */9dTLinux联盟 /* 处理 CONFIG_MODVERSIONS */9dTLinux联盟 #if CONFIG_MODVERSIONS==19dTLinux联盟 #define MODVERSIONS9dTLinux联盟 #include9dTLinux联盟 #endif9dTLinux联盟 #include /* 我需要 NULL */9dTLinux联盟 /* 在 2.2.3 版/usr/include/linux/version.h 包含这个宏9dTLinux联盟 * 但 2.0.35版不包括-因此加入以备需要 */9dTLinux联盟 #ifndef KERNEL_VERSION9dTLinux联盟 #define KERNEL_VERSION(a,b,c) ((a)*65536+(b)*256+(c))9dTLinux联盟 #endif9dTLinux联盟 /* Emmanuel Papirakis:9dTLinux联盟 *9dTLinux联盟 * 现在(2.2版),在宏里参数名现在被处理。内核不能像它好象已经作过的那样解决符号名。9dTLinux联盟 *9dTLinux联盟 * 为了向模块传送参数,你不得不使用 include/linux/modules.h (第 176 行)里面定义的一个宏。9dTLinux联盟 * 宏需要两个参数。参数名和它的类型。类型是用双引号引住的一个字母。例如:9dTLinux联盟 * "i" 将为整数, "s" 将为字符串。9dTLinux联盟 */9dTLinux联盟 char *str1, *str2;9dTLinux联盟 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)9dTLinux联盟 MODULE_PARM(str1, "s");9dTLinux联盟 MODULE_PARM(str2, "s");9dTLinux联盟 #endif9dTLinux联盟 /* 初始化模块--显示参数 */9dTLinux联盟 int init_module()9dTLinux联盟 {9dTLinux联盟 if (str1 == NULL || str2 == NULL) {9dTLinux联盟 printk("Next time, do insmod param str1=");9dTLinux联盟 printk("str2=\n");9dTLinux联盟 } else9dTLinux联盟 printk("Strings:%s and %s\n", str1, str2);9dTLinux联盟 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)9dTLinux联盟 printk("If you try to insmod this module twice,");9dTLinux联盟 printk("(without rmmod'ing\n");9dTLinux联盟 printk("it first), you might get the wrong");9dTLinux联盟 printk("error message:\n");9dTLinux联盟 printk("'symbol for parameters str1 not found'.\n");9dTLinux联盟 #endif9dTLinux联盟 return 0;9dTLinux联盟 }9dTLinux联盟 /* 清除 */9dTLinux联盟 void cleanup_module()9dTLinux联盟 {9dTLinux联盟 }9dTLinux联盟
|