4. 모듈 파라미터 처리
모듈은 command line에서 인자들을 받을 수 있다. 인자를 모듈로 넘기기 위해서는 module_param() 매크로를 사용하여 변 수 를 선 언 하 여 야 한 다 . 예 를 들 어 “ insmod
hello_world_parm.ko myarg1=1”같이 int형의 하나의 인자를 넘기기 위해서는 커널의 모듈 코드에 다음과 같이 선언해야 한다.
int myarg1 = 0
module_param(myarg1, int, 0);
module_parm 매크로는 변수의 이름, 타입, sysfs의 관련된 파일의 permission 이렇게 3개의 인자를 갖는다. 인자로 배열을 넘기는 방법은 약간 다르다. 먼저 매크로는
module_param_array를 사용하며 4개의 인자를 갖는다. 3번째 인자로 배열의 갯수를 받을 수 있는 변수를 추가되었다.
int myarg2 [4];
int count;
module_parm_array(myarg2, int, &count , 0);
인자의 갯수를 특별히 받고 싶지 않다면 단순히 NULL을 사용하면 된다.
다음, 모듈의 파라미터를 설명하기 위한 MODULE_PARM_DESC() 매크로가 있다. 이것은 모듈을 사용하는 사람을 위해서 인자를 설명하기 위한 방법이다. 이것은 변수의 이름과 그 변수를 설명하는 문자열을 받게 된다.
MODULE_PARM_DESC(myarg2, "This is int array forI/O port data");
위의 모든 것을 다 포함해서 hello_world2를 만들어 보자.
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/stat.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("you");
static int argint = 1;
static char *argstring = "This is a string";
static int argarray[2] = { 0, };
static int size_argarray= 0;
module_param(argint, int, S_IRUSR | S_IWUSR |
S_IRGRP | S_IWGRP);
MODULE_PARM_DESC(argint, "A short integer");
module_param(argstring, charp, 0000);
MODULE_PARM_DESC(argstring, "A character string");
module_param_array(argarray, int, &size_argarray,
0000);
MODULE_PARM_DESC(argarray, "An array of
integers");
static int __init hello_init(void)
{
int i;
printk(KERN_EMERG "argint : %d ", argint);
printk(KERN_EMERG "argstring : %s ", argstring);
for (i = 0; i < (sizeof (argarray) / sizeof (int)); i++)
{
printk(KERN_INFO "argarray [%d] : %d ", i,
argarray [i]);
}
printk(KERN_INFO "argarrary size : %d ",size_argarray);
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_EMERG "Goodbye, world ");
}
module_init(hello_init);
module_exit(hello_exit);
위의 코드를 컴파일 한 후 실행하기 전에 modinfo를 통해 모듈의 정보를 확인해보자.
root@barrios-desktop:~/example/module2# modinfo
hello_world.ko
filename: hello_world.ko
license: GPL
author: you
vermagic: 2.6.18 SMP mod_unload 586 REGPARM gcc-4.1
depends:
srcversion: 300231DCA83E809D0F54644
parm: argarray:An array of integers (array of int)
parm: argstring:A character string (charp)
parm: argint:A short integer (int)
위와 같이 이전에 비하여 많은 정보들이 출력되는 것을 볼 수 있다. 이 중에는 여러분들이 파라미터를 설명하는문자열도 출력된다. 이번에는 모듈을 로드해보자. 무엇이 출력되는가?
root@barrios-desktop:~/example/module2# insmod
hello_world.ko argint=100 argstring="hey"
argarray=100,200
여러분들의 예상이 맞는가?
출처 : http://www.linux.co.kr/home2/board/bbs/board.php?bo_table=lecture&wr_id=1640&sca=1&sca2=32