오늘은 모듈 프로그래밍에 대해 간단히 얘기해 보겠당.
솔직히 말해서 저번 시스템 콜 구현시에도 말했지만 처음에는 간단한 프로그램을 컴파일해서 이상없이 돌려보는게 가장 중요한거 같다. 열심히 짜 놨는데 실행 안되면 얼마나 열받는지.~~~
그런 생각으로 모듈 프로그래밍은 컴파일쪽 중심으로 간단한 프로그램을 작성해 보겠다.
이 글만 써놓고 한참이 지난 지금에야 글을 올린당... 그동안 바뻐서리..^^;;
먼저 모듈 프로그램의 필요성에 대해 간단히 짚고 넘어가자
실제 시스템 콜을 구현해보면 알겠지만 커널내에 이러한 함수를 구현한다는 것은 커널을 재 컴파일해야 하므로 정말 시간이 오래걸린다.. 이건 커널 크기가 리눅스의 경우 너무 크기 때문인데 이러한 경우 모듈을 활용하면 필요시만 적재하면 되므로 효과적인 메모리 사용이 가능하게 되는 장점이 있다.
실제 간단한 hello 프로그램을 활용해서 방법을 알아보자..
먼저 임의의 디렉토리내에 다음과 같은 간단한 프로그램을 작성한다.
#include <linux/kernel.h> // 커널관련 자료구조 정의
#include <linux/module.h> // 모듈관련 자료구조 정의
int init_module() // 모듈이 적재될때 실행되는 프로그램
{
printk("<1>Hello world\n");
return 0;
}
void cleanup_module() // 모듈이 제거될때 실행되는 프로그램
{
printk("<1>Goodbye world\n");
}
우선 printk에 대해 간단히 설명하면 printk는 사용자와 정보 교환을 위한것은 아니고(비록 우리가 이러한 목적으로 사용하고는 있지만) 커널에 기록을 위한 함수이다. 각 printk는 우선순위를 갖는데 위의 <1>은 이러한 우선순위를 나타낸다. 그런데 이러한 printk를 사용해 우리가 콘솔로 출력이 가능하게되는 것은 우선순위를 1이라는 가장 높게 잡아놓았기 때문에 물론 로그파일내에도 저장이 되지만 int console_loglevel보다 우선순위가 높기 때문이다.
이제 작성한 프로그램을 컴파일하면 되는데 모듈로 만들어주기 위함이므로 컴파일 옵션이 붙는다.
옵션을 간단히 설명하면
-c : 커널 모듈이 독립적으로 실행 가능하지 않고, insmod를 사용하는 실행시간 중에 커널에 링크되는 오브젝트 파일임을 의미
-O2 : 대문자 O임(숫자 아님). 커널은 인라인 함수를 주로 사용하기 때문에 모듈은 반드시 최적화 옵션을 사용해서 컴파일 되어야 한다. 이 옵션을 사용하지 않은 경우 어떤 어셈블러 매크로는 함수 호출시 정상적으로 작동하지 않을 것이다.
-D__KERNEL__ : 이 코드가 유저 프로세스가 아닌 커널모드에서 작동할 것이라는 걸 커널헤더에 알려준다.
-W -Wall : 모듈 프로그램은 커널에 매우 민감한 영향을 끼칠수 있으며 커널을 다운 시킬수도 잇다. 그러므로 가능한한 모든 종류의 경고 메시지를 검사할 필요가 있고 이 옵션을 사용하면 컴파일러가 발생시킬수 있는 모든 경고메시지를 출력한다.
-DMODULE : 커널 모듈로 작성되는 코드라는걸 알려주기 위해 사용..
위의 옵션을 포함해서 컴파일 하기위한 명령어를 작성해보면
gcc -O2 -Wall -D_KERNEL__ -DMODULE -c 작성 화일명
이렇게 하면 작성화일명.O가 생성된다. 이때 printk에 대한 경고 메시지가 나오지만 모듈은 문제없이 생성되었다.
이제 insmod로 모듈을 커널에 올리면 되는데 실제 수행해보니 2가지 문제가 발생한다.
앞에서도 말했지만 내 커널버전은 kernel-2.4.20-8이다..
그 첫째가 컴파일은 2.4.20으로 컴파일되었는데 수행할 커널은 2.4.20-8이라는 경고 메시지이다.
이러한 메시지와 함께 모듈이 안올라 가게 되는데 이러한 경우는 insmod에 -f 옵션을 붙이면 해결할수 있다. 말그대로 강제로 올린다는 말인데... insmod -f 작성파일이름.o라고 쳐주면 되겠다.
나머지 한가지 문제는
흠 이상하다.. 저번엔 돌려보니까 되던게 안된다.. 다시 돌려보고 정상적인결과가 나오면 다시 이어서 쓰겠당..^^헐..
'System > Linux' 카테고리의 다른 글
[펌] 리눅스 커널 모듈 프로그래밍 안내서 (0) | 2005.01.18 |
---|---|
[펌] Module programming (0) | 2005.01.18 |
[펌] 리눅스명령어 (상세설명, for example) (0) | 2005.01.18 |
[펌] 리눅스 커널 시스템 콜 구현(2) (0) | 2005.01.18 |
[펌] LKM (Linux Kernel Module) Backdooring (by TrueFinder) (0) | 2005.01.14 |