커널 2.4 버젼...
//소스 파일
/* hellomodule.c */
// #define MODULE
#include <linux/module.h>
#include <linux/kernel.h>
int init_module()
{
printk("Module init\n");
printk("Hello Linux Module!\n");
return 0;
}
void cleanup_module()
{
printk("Module Cleaned up\n");
}
MODULE_LICENSE("GPL");
// Makefile
# 변수 설정...
KERNELDIR=/lib/modules/$(shell uname -r)/build
CFLAGS=-D__KERNEL__ -DMODULE -I$(KERNELDIR)/include -O
# CFLAGS=-D__KERNEL__ -I$(KERNELDIR)/include -O
CC=gcc
all : test.o
# $(CC) $(CFLAGS) -c test.c
rebuild : clean all
insert : all
insmod test.o
remove :
rmmod test
clean :
rm -rf *.
커널 2.6 버젼...
//소스 파일
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
int init_hello()
{
printk("Module init\n");
printk("Hello Linux Module\n");
return 0;
}
void exit_hello()
{
printk("Module Cleaned up\n");
}
module_init(init_hello);
module_exit(exit_hello);
MODULE_LICENSE("GPL");
// Makefile
KERENLPATH=/usr/src/linux
obj-m := hello.o
KDIR := /usr/src/linux
PWD := $(shell pwd)
default :
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean :
rm -rf *.o
모듈 작성은 2.4 커널과 2.6 커널이 다르다. 실제로 2.6 커널의 모듈 작성 방법은 2.4.20 이후 버젼의 커널에서도 동일하게 사용할 수 있다.
2.6 커널에서는 linux/init.h 헤더파일이 추가되었다. 그리고 init_module()과 cleanup_module()이라는 함수 이름 규약을 더 이상 따르지 않아도 된다. 초기화 함수와 종료 함수는 자신이 원하는 이름으로 작성하면 되고, module_init()과 module_exit() 매크로에서 초기화 함수와 종료 함수의 이름만 지정해주면 된다. 물론, 2.4 커널의 init_module(), cleanup_module()을 사용해도 되지만, 현재 커널 해커들은 이들 함수를 전혀 사용하고 있지 않다. 2.4.20 이후 버전의 커널에서는 위와 같은 2.6 형식의 코드를 사용하고, gcc를 사용해서 모듈로 빌드할 수 있다. 2.4.20 이후 버젼과 2.6 커널의 모듈은 동일한 코드를 사용할 수 있으며, 빌드 과정만 다르다.
모듈을 로드하기 위해 insmod 명령을 실행한다. 모듈에 2.4 커널은 .o 형식을 사용하지만, 2.6 커널은 .ko 형식을 사용한다.
2.4 커널의 경우
# insmod hello.o
2.6 커널의 경우
# insmod hello.ko
# insmod hello.o
2.6 커널의 경우
# insmod hello.ko
모듈이 로드된 것을 확인하기 위해 lsmod 명령을 사용한다.
rmmod 명령으로 모듈을 제거한다. 커널 버전에 관계없이 동일하며, 제거할 모듈 이름만 지정한다.
# rmmod hello