리눅스 커널은 사용자가 매개변수를 부트시나 모듈 로드시에 선언하고 드라이버 안에서는 이 매개변수들이 전역변수처럼 보이도록 하는 단순명료한 프레임웍을 제공한다. 이러한 모듈 매개변수는 sysfs에서도 보이게 된다. 결과적으로 모듈 매개변수를 생성하고 관리하는 일이 매우 간편해졌다.
모듈 매개변수를 정의하기 위해서는 module_param() 매크로를 정의해야 한다.
module_param(name, type, perm);
name => 변수 이름
type => 변수 타입
perm => 퍼미션(0666 아시져?)
이 매크로는 변수를 대신 선언해주지는 않는다. 즉 매크로를 사용하기 전에 반드시 변수를 직접 선언해야한다.
따라서 대개 다음과 같은 형태를 지니게 된다.
static int allow_live_bait = 1;
module_param(allow_live_bait, bool, 0644)
이코드는 아마도 여러분의 모듈 소스의 가장 바깥 ㅉ고에 위치하게 될 것이다. 다시 말하면 allow_llive_bait는 전역변수이다.
한편 내부변수의 이름을 외부에 보이는 매개변수 이름과 다르게 지정할 수도 있다. 이 때는 module_param_named()을 사용하면 된다.
module_param_named(name, variable, type, perm);
name = > 외부로 보이는 매개변수의 이름
variable => 내부 전역 변수의 이름
static unsigned int max_test = DEFAULT_MAX_LINE_TEST;
module_param_named(maximum_line_test, max_test, int , 0);
일반적으로 문자열 값을 모듈 매개변수를 얻어올 때는 charp자료형을 사용한다. 커널은 사용자가 지정한 문자열을 메모리에 복사하고 여러분으 ㅣ변수가 그 메모리르르 가리키도록 한다.
static char *name;l
module_param(name, charp, 0);
또한, 원한다면 커널로 하여금 이 문자열을 여러분이 지정한 캐릭터 배열에 복사하도록 할수도 있다.
module_param_string(name, string, len, perm);
static char species[BUF_LEN];
mdole_param_string(specifies, species, BUF_LEN,0);
한편, 쉼표로 분리된 매개변수 리스트를 C배열에 저장되도록 할 수도 있는데, 이 때는 module_param_array()을 사용한다.
module_param_array(name, type, nump, perm);
여기서 name은 외부 매개변수이자 내부 변수의 이름, type은 자료형, perm은 sysfs접근권한
-------------- 위에 것만 보고 이해하기는 어려워, 다른 책에서 동일한 내용을 정리합니다 ----------
2.4 , 2.6의 커널에서는 MODULE_PARM 매크로가 존재함
int a;
MODULE_PARM(a,"i"); //변수 a를 int형 커널 매개변수로 사용 "i"=>int형을 뜻함
#insmod param.ko a=300
a=300
문자열 매개변수 전달
char *str;
int a;
MODULE_PARM(str, "charp");
MODULE_PARM(a,"i");
#insmod param.ko a=300 str="Hello"
str = Hello
a = 300
MODULE_PARM의 선언
#define MODULE_PARM(var, type) \
const char __module_parm_##var[] \
__attribute__((section(".modinfo"))) = \
"parm_" __MODULE_STRING(var) "=" type
MODUEL_PARMa,"i");
다음 코드가 생성됨
const char __module_parm_a[] = "parm_a = i";
[__attribute__((section(".modinfo")))]가 의미하는 것은 매개변수에 대한 정보를 .modinfo 섹션에 저장하라는 것이다. 프로그램의 섹션에는 .text, .data, .bss가 있으며, 모듈 정보에 대해서는 .modinfo 섹션에 저장한다.
MODULE_LICENSE(), MODULE_PARM()등의 내용은 모두 이 섹션에 정의됨
[__module_parm_##var[]]에서 "##var"는 해당 변수 이름으로 변경된다. 변수이름이 "a"였기 때문에 "__module_param_a[]"로 해석된다.
"parm_" __MODULE_STRING(var) "=" type
["parm_" __MODULE_STRING(var)]은 결국 변수 이름이 되기 때문에 "parm_a = i"라는 결과가 된다.
"parm_" "a" "=" "i" => "parm_a = i"가된다. //printf("A" "A")는 printf("AA")가 되는 것 처럼.
2.6부터는 MODULE_PARM 매크로가 deprecate되었당.....
2.6.17은 완전히 제거...
특히 다른점은 없고 매개변수하나가 추가되었따는점만 다르다.
권한이 추가됨.
module_param(var, type, perm)
MODULE_PARM(a,"i") => module_param(a, int , 0)
배열처리
int b[] = {0,};
module_param_array(b, int, NULL, 0);
#insmod param.ko b=11,22,3,4,33
모듈 매개변수를 정의하기 위해서는 module_param() 매크로를 정의해야 한다.
module_param(name, type, perm);
name => 변수 이름
type => 변수 타입
perm => 퍼미션(0666 아시져?)
이 매크로는 변수를 대신 선언해주지는 않는다. 즉 매크로를 사용하기 전에 반드시 변수를 직접 선언해야한다.
따라서 대개 다음과 같은 형태를 지니게 된다.
static int allow_live_bait = 1;
module_param(allow_live_bait, bool, 0644)
이코드는 아마도 여러분의 모듈 소스의 가장 바깥 ㅉ고에 위치하게 될 것이다. 다시 말하면 allow_llive_bait는 전역변수이다.
한편 내부변수의 이름을 외부에 보이는 매개변수 이름과 다르게 지정할 수도 있다. 이 때는 module_param_named()을 사용하면 된다.
module_param_named(name, variable, type, perm);
name = > 외부로 보이는 매개변수의 이름
variable => 내부 전역 변수의 이름
static unsigned int max_test = DEFAULT_MAX_LINE_TEST;
module_param_named(maximum_line_test, max_test, int , 0);
일반적으로 문자열 값을 모듈 매개변수를 얻어올 때는 charp자료형을 사용한다. 커널은 사용자가 지정한 문자열을 메모리에 복사하고 여러분으 ㅣ변수가 그 메모리르르 가리키도록 한다.
static char *name;l
module_param(name, charp, 0);
또한, 원한다면 커널로 하여금 이 문자열을 여러분이 지정한 캐릭터 배열에 복사하도록 할수도 있다.
module_param_string(name, string, len, perm);
static char species[BUF_LEN];
mdole_param_string(specifies, species, BUF_LEN,0);
한편, 쉼표로 분리된 매개변수 리스트를 C배열에 저장되도록 할 수도 있는데, 이 때는 module_param_array()을 사용한다.
module_param_array(name, type, nump, perm);
여기서 name은 외부 매개변수이자 내부 변수의 이름, type은 자료형, perm은 sysfs접근권한
-------------- 위에 것만 보고 이해하기는 어려워, 다른 책에서 동일한 내용을 정리합니다 ----------
2.4 , 2.6의 커널에서는 MODULE_PARM 매크로가 존재함
int a;
MODULE_PARM(a,"i"); //변수 a를 int형 커널 매개변수로 사용 "i"=>int형을 뜻함
#insmod param.ko a=300
a=300
문자열 매개변수 전달
char *str;
int a;
MODULE_PARM(str, "charp");
MODULE_PARM(a,"i");
#insmod param.ko a=300 str="Hello"
str = Hello
a = 300
MODULE_PARM의 선언
#define MODULE_PARM(var, type) \
const char __module_parm_##var[] \
__attribute__((section(".modinfo"))) = \
"parm_" __MODULE_STRING(var) "=" type
MODUEL_PARMa,"i");
다음 코드가 생성됨
const char __module_parm_a[] = "parm_a = i";
[__attribute__((section(".modinfo")))]가 의미하는 것은 매개변수에 대한 정보를 .modinfo 섹션에 저장하라는 것이다. 프로그램의 섹션에는 .text, .data, .bss가 있으며, 모듈 정보에 대해서는 .modinfo 섹션에 저장한다.
MODULE_LICENSE(), MODULE_PARM()등의 내용은 모두 이 섹션에 정의됨
[__module_parm_##var[]]에서 "##var"는 해당 변수 이름으로 변경된다. 변수이름이 "a"였기 때문에 "__module_param_a[]"로 해석된다.
"parm_" __MODULE_STRING(var) "=" type
["parm_" __MODULE_STRING(var)]은 결국 변수 이름이 되기 때문에 "parm_a = i"라는 결과가 된다.
"parm_" "a" "=" "i" => "parm_a = i"가된다. //printf("A" "A")는 printf("AA")가 되는 것 처럼.
2.6부터는 MODULE_PARM 매크로가 deprecate되었당.....
2.6.17은 완전히 제거...
특히 다른점은 없고 매개변수하나가 추가되었따는점만 다르다.
권한이 추가됨.
module_param(var, type, perm)
MODULE_PARM(a,"i") => module_param(a, int , 0)
배열처리
int b[] = {0,};
module_param_array(b, int, NULL, 0);
#insmod param.ko b=11,22,3,4,33