2012-07-20 3 views
1

간단한 char 장치 드라이버를 쓰고 있습니다. module_init()에 전달하는 함수는 모듈을 설치할 때 호출됩니다.module_init 매크로를 호출하는 방법은 무엇입니까?

insmod 명령을 사용하여 모듈을 삽입하면 module_init()에 전달 된 함수가 호출됩니다.

이 module_init() 함수를 호출하는 다른 방법이 있습니까?

답변

3

insmod 이외의 것을 사용하는 경우, 아니오 : insmod이 모듈을 초기화하는 유일한 방법입니다.

그렇지 않으면이 module_init 것은 매크로이며 실제로는 함수 호출이 아닙니다 (C에서 전역 범위에서 함수를 호출 할 수 없음). 동적 모듈이나 커널에 컴파일 된 객체에 따라 초기화 함수를 호출하는 미리 정의 된 "모듈 생성자"로 확장됩니다. 모듈을 개발할 때 #ifdef을 많이 사용하지 않고 개발 프로세스를 쉽게 수행하는 것을 피하는 것이 그 역할입니다 (this 참조).

어떤 이유로 (이 작업을 권장하지 않는 경우) 모듈 코드에서 초기화 함수를 호출 한 다음 직접 호출하면됩니다.

static void some_other_function(void) { 
    // ... 
    initialize(); 
    // ... 
} 

static int initialize(void) { 
    // your initialization code 
} 

module_init(initialize); 

편집 : 예를 들어 유진의 코멘트 다음 __init를 제거했습니다. 하나가 바로이 예에서`) (초기화`전화려고하는 경우에

static void some_other_function(void) { 
    // ... 
    something_that_might_get_called_afterwards_also(); 
    // ... 
} 

static int __init initialize(void) { 
    // your initialization code (done only once) 
    something_that_might_get_called_afterwards_also(); 
    // some other one-time code 
} 

module_init(initialize); 
+3

:

그러나 나는 단지 module_init 확장이 초기화 함수를 호출하고 다른 일반적인 코드는 별도의 기능에있을 추천 모듈이 초기화를 마친 후에는'__init'으로 표시하지 않는 것이 좋습니다. 이 방법으로 표시된 함수 ('__init_data '로 표시된 데이터는 물론)는 모듈의 초기화가 완료된 후 로더에 의해 메모리에서 언로드됩니다. 그 후에 그것들을 호출하면 커널이 잘못 될 수 있습니다. 그것들이'__init'으로 표시되어 있지 않으면, 그들은 메모리에 남아 있고 호출 될 수 있습니다. 그러나 @eepp에 동의합니다. 이렇게하지 않는 것이 좋으며 오히려 별도의 함수를 사용하는 것이 좋습니다. – Eugene

관련 문제