달력

3

« 2025/3 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

'OS이야기'에 해당되는 글 86

  1. 2011.11.01 모듈 매개변수
2011. 11. 1. 19:51

모듈 매개변수 OS이야기2011. 11. 1. 19:51

리눅스 커널은 사용자가 매개변수를 부트시나 모듈 로드시에 선언하고 드라이버 안에서는 이 매개변수들이 전역변수처럼 보이도록 하는 단순명료한 프레임웍을 제공한다. 이러한 모듈 매개변수는 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

































 

'OS이야기' 카테고리의 다른 글

kobject  (1) 2011.11.01
익스포트된 심볼들  (0) 2011.11.01
랩탑모드  (0) 2011.11.01
버퍼 캐시  (0) 2011.11.01
래딕스 트리  (0) 2011.11.01
:
Posted by НooпeУ


Code Start Code End