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
#include
#include
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
댓글 없음:
댓글 쓰기