2010년 5월 27일 목요일

리눅스 커널 모듈 컴파일 하기

출처 : http://www.cyberciti.biz/tips/compiling-linux-kernel-module.html

1. 우선 커널 소스 코드를 다운 받고, 다음과 같이 압축을 해제하자

$ tar -zxvf kernel* -C /usr/src

2. 커널 모듈 소스이 있는 디렉토리로 가서 Makefile을 만들자.

$ vi Makefile

3. 다음의 라인을 추가하자. (모듈 이름을 foo라고 하자)

obj-m = foo.o
KVERSION = $(shell uname -r)
all:
make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean

4. make 명령어로 모듈을 컴파일하자. (모듈 컴파일은 어떠한 사용자라도 가능하다.)

$ make

마지막으로 foo.ko이라는 모듈이 생성될 것이다.

5. 모듈 컴파일에 성공하면 insmod나 modprobe명령어를 이용해서 로드하자.
여기서 root 사용자 계정이 필요하다.

$ insmod foo.ko

예제: hello.c 모듈

1) hello.c C 소스 코드를 만들자.

$ mkdir demo; cd demo
$ vi hello.c

2) 다음의 라인을 추가하자.

#include /* Needed by all modules */
#include /* Needed by KERN_INFO */
#include /* Needed by the macros */

static int __init hello_start(void)
{
printk(KERN_INFO "Loading hello module...\n");
printk(KERN_INFO "Hello world\n");
return 0;
}

static void __exit hello_end(void)
{
printk(KERN_INFO "Goodbye Mr.\n");
}

module_init(hello_start);
module_exit(hello_end);

3) 파일을 저장하고, 새로운 Makefile을 다음과 같이 만들자.

$ vi Makefile

다음 라인들을 추가하자.

obj-m = hello.o
KVERSION = $(shell uname -r)
all:
make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean

4) 저장하고 파일을 닫자.

5) hello.c모듈을 컴파일하자.

$ make

6) 루트 계정으로 전환하고 모듈을 로드하자.

$ sudo insmod hello.ko

7) 로드된 모듈을 확인하자.

$ lsmod | less

8) /var/log/message 파일에서 메세지를 확인하자.

9) 모듈을 언로드하자.

$ rmmod hello

10) 리눅스 시스템이 부팅할때 모듈을 로드할 수 있도록, /etc/modules 파일을 수정하자.
이파일은 부팅시 로드할 커널 모듈의 이름을 가지고 있다. 먼저 해당 모듈을 /lib/modules/$(uname -r)/kernel/drivers 에 복사하고, 다음의 단계들을 밝아 나가자.

(a) hello모듈의 디렉토리를 만들자

$ mkdir -p /lib/modules/$(uname -r)/kernel/drivers/hello

(b) 모듈을 복사하자.

$ cp hello.ko /lib/modules/$(uname -r)/kernel/drivers/hello/

(c) /etc/modules파일을 편집하자.

$ vi /etc/modules

(d) 다음 라인을 추가하자.

hello

(e) 변경된 사항을 살펴보기 위해서 재부팅하자. 그리고 lsmod나 dmesg 를 사용해서 로드된 모듈을 확인하자.

$ cat /proc/modules

OR

$ lsmod | less

댓글 없음:

댓글 쓰기