chapter 2. hello world -凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 3977652
  • 博文数量: 536
  • 博客积分: 10470
  • 博客等级: 上将
  • 技术积分: 4825
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-26 14:08
文章分类

全部博文(536)

文章存档

2024年(3)

2021年(1)

2019年(1)

2017年(1)

2016年(2)

2013年(2)

2012年(10)

2011年(43)

2010年(10)

2009年(17)

2008年(121)

2007年(252)

2006年(73)

相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: linux

2007-04-07 15:43:36

从命令行传递参数给内核模块

  模块也可以从命令行获取参数。但不是通过以前你习惯的argc/argv。

  要传递参数给模块,首先将获取参数值的变量声明为全局变量。然后使用宏module_parm()(在头文件linux/module.h)。运行时,insmod将给变量赋予命令行的参数,如同 ./insmod mymodule.o myvariable=5。为使代码清晰,变量的声明和宏都应该放在模块代码的开始部分。以下的代码范例也许将比我公认差劲的解说更好。

宏module_parm()需要两个参数,变量的名字和其类型。支持的类型有 "b": 比特型,"h": 短整型, "i": 整数型,"l": 长整型和 "s": 字符串型,其中正数型既可为signed也可为unsigned。 字符串类型应该声明为"char *"这样insmod就可以为它们分配内存空间。你应该总是为你的变量赋初值。 这是内核编程,代码要编写的十分谨慎。举个例子:

int myint = 3;
char *mystr;

module_parm(myint, "i");
module_parm(mystr, "s");    

  数组同样被支持。在宏module_parm中在类型符号前面的整型值意味着一个指定了最大长度的数组。 用'-'隔开的两个数字则分别意味着最小和最大长度。下面的例子中,就声明了一个最小长度为2,最大长度为4的整形数组。

int myshortarray[4];
module_parm (myintarray, "3-9i");
    
  将初始值设为缺省使用的io端口或io内存是一个不错的作法。如果这些变量有缺省值,则可以进行自动设备检测,否则保持当前设置的值。我们将在后续章节解释清楚相关内容。在这里我只是演示如何向一个模块传递参数。

  最后,还有这样一个宏,module_parm_desc()被用来注解该模块可以接收的参数。该宏两个参数:变量名和一个格式自由的对该变量的描述。

example 2-7. hello-5.c
/*
 *  hello-5.c - demonstrates command line argument passing to a module.
 */
#include
#include
#include
#include
#include

module_license("gpl");
module_author("peter jay salzman");

static short int myshort = 1;
static int myint = 420;
static long int mylong = 9999;
static char *mystring = "blah";

/*
 * module_param(foo, int, 0000)
 * the first param is the parameters name
 * the second param is it's data type
 * the final argument is the permissions bits,
 * for exposing parameters in sysfs (if non-zero) at a later stage.
 */

module_param(myshort, short, s_irusr | s_iwusr | s_irgrp | s_iwgrp);
module_parm_desc(myshort, "a short integer");
module_param(myint, int, s_irusr | s_iwusr | s_irgrp | s_iroth);
module_parm_desc(myint, "an integer");
module_param(mylong, long, s_irusr);
module_parm_desc(mylong, "a long integer");
module_param(mystring, charp, 0000);
module_parm_desc(mystring, "a character string");

static int __init hello_5_init(void)
{
    printk(kern_alert "hello, world 5\n=============\n");
    printk(kern_alert "myshort is a short integer: %hd\n", myshort);
    printk(kern_alert "myint is an integer: %d\n", myint);
    printk(kern_alert "mylong is a long integer: %ld\n", mylong);
    printk(kern_alert "mystring is a string: %s\n", mystring);
    return 0;
}

static void __exit hello_5_exit(void)
{
    printk(kern_alert "goodbye, world 5\n");
}

module_init(hello_5_init);
module_exit(hello_5_exit);

我建议用下面的方法实验你的模块:

satan# insmod hello-5.o mystring="bebop" mybyte=255 myintarray=-1
mybyte is an 8 bit integer: 255
myshort is a short integer: 1
myint is an integer: 20
mylong is a long integer: 9999
mystring is a string: bebop
myintarray is -1 and 420

satan# rmmod hello-5
goodbye, world 5

satan# insmod hello-5.o mystring="supercalifragilisticexpialidocious" \
> mybyte=256 myintarray=-1,-1
mybyte is an 8 bit integer: 0
myshort is a short integer: 1
myint is an integer: 20
mylong is a long integer: 9999
mystring is a string: supercalifragilisticexpialidocious
myintarray is -1 and -1

satan# rmmod hello-5
goodbye, world 5

satan# insmod hello-5.o mylong=hello
hello-5.o: invalid argument syntax for mylong: 'h'
阅读(853) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图