리눅스에서 디바이스 드라이버 모듈을 동적으로 적재할 수 있기 때문에, 간단한 디바이스 드라이버 예제를 만들어 본다. 다음은 로드와 언로드가 가능한 가장 기본적인 뼈대만을 가지고 있는 적재 가능한 디바이스 드라이버 모듈이다.
-------------------- test.c --------------------
#include <linux/module.h>
static int test_init(void)
{
printk("test module is loaded \n");
return 0;
}
static void test_exit(void)
{
printk("test module is unloaded \n");
}
module_init(test_init);
module_exit(test_exit);
MODULE_LICENSE("GPL");
-------------------- Makefile --------------------
obj-m := test.o
KDIR := /lib/modules/$(shell uname -r)/build/
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
rm -rf .*.cmd
rm -rf .tmp*
rm -rf *odule*
rm -rf *.ko
rm -rf *.mod.*
rm -rf *.o
$make 를 하게 되면 ko 확장자를 가지는 모듈이 생성된다. 생성된 모듈을 로드하려면 $insmod test.ko 를 실행한다. 모듈을 로드한 뒤에는 아무런 메시지도 뜨지 않는다. 하지만 $dmesg를 하게 되면 test.c에서 모듈로드시 커널메시지로 출력하게되는 test module is loaded. 이라는 메시지를 볼 수 있다. test module is loaded.라는 메시지를 보았다면 정상적으로 모듈이 로드가 된 것이다. 뿐만 아니라, $lsmod를 하게 되면 현재 로드된 모듈이 리스트로 출력되며, test 모듈도 확인할 수 있다. 마지막으로 로드된 모듈을 제거하는 명령어인 $rmmod test.ko를 실행하면 test 모듈은 해제되며, $dmesg에서 모듈이 제거되었다는 메시지를 확인할 수 있다.
-------------------- test.c --------------------
#include <linux/module.h>
static int test_init(void)
{
printk("test module is loaded \n");
return 0;
}
static void test_exit(void)
{
printk("test module is unloaded \n");
}
module_init(test_init);
module_exit(test_exit);
MODULE_LICENSE("GPL");
-------------------- Makefile --------------------
obj-m := test.o
KDIR := /lib/modules/$(shell uname -r)/build/
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
rm -rf .*.cmd
rm -rf .tmp*
rm -rf *odule*
rm -rf *.ko
rm -rf *.mod.*
rm -rf *.o
$make 를 하게 되면 ko 확장자를 가지는 모듈이 생성된다. 생성된 모듈을 로드하려면 $insmod test.ko 를 실행한다. 모듈을 로드한 뒤에는 아무런 메시지도 뜨지 않는다. 하지만 $dmesg를 하게 되면 test.c에서 모듈로드시 커널메시지로 출력하게되는 test module is loaded. 이라는 메시지를 볼 수 있다. test module is loaded.라는 메시지를 보았다면 정상적으로 모듈이 로드가 된 것이다. 뿐만 아니라, $lsmod를 하게 되면 현재 로드된 모듈이 리스트로 출력되며, test 모듈도 확인할 수 있다. 마지막으로 로드된 모듈을 제거하는 명령어인 $rmmod test.ko를 실행하면 test 모듈은 해제되며, $dmesg에서 모듈이 제거되었다는 메시지를 확인할 수 있다.