Module Programming Parameter 처리
Module에서 인자 처리 방법
- Module에 인자 추가해서 등록 방법
$insmod module_argument.ko argint=100 argstring=“test”
- MODULE_PARAM() 매크로
- 인자를 Module에 전달하기 위해서는 MODULE_PARAM() 매크로를 이용하여 변수를 선언
MODULE_PARAM(var_name,var_type, var_permission);
- Module에서 선언된 변수명과 명령어 라인에서 사용되는 인자명은 동일
MODULE_PARAM_ARRAY(var_name, var_type, count, 0);
- 배열형의 변수를 선언하기 위해서는 별도의 매크로 사용
- MODULE_PARM_DESC() 매크로
- Module의 인자에 대한 상세 설명 제공
MODULE_PARM_DESC(var_name, var _description)
Source Code & Makefile 작성
- 작업 디렉터리 생성(위치는 아무곳이나 상관 없음)
$ mkdir module
$ cd module
$ mkdir argmodule
- Source Code 작성
- 생성한 argmodule 디렉터리 밑에 생성(argmodule.c)
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/stat.h>
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, 0000);
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 module_start(void)
{
int i;
printk("argint : %d", argint);
printk("argstring : %s", argstring);
for (i = 0; i < (sizeof(argarray) / sizeof(int)); i++)
printk("argarray[%d] = %d", size_argarray);
return 0;
}
static void module_end(void)
{
printk("Goodbye");
}
MODULE_LICENSE("GPL");
module_init(module_start);
module_exit(module_end);
- Makefile 작성
- 생성한 argmodule 디렉터리 밑에 생성(Makefile)
obj-m += argmodule.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all :
make -C $(KDIR) M=$(PWD) modules
clean :
rm -rf argmodule.o argmodule.mod.* argmodule.ko
빌드 및 결과 확인
$ cd module/argmodule
$ make
$ ls
$ insmod argmodule.ko argint=1234 argstring="test" argarray=100,200
$ lsmod | head -n 5
$ dmsg | tail -n 5
$ rmmod argmodule
$ dmesg | tail -n 5