리눅스에서 디바이스 드라이버 모듈을 동적으로 적재할 수 있기 때문에, 간단한 디바이스 드라이버 예제를 만들어 본다. 다음은 로드와 언로드가 가능한 가장 기본적인 뼈대만을 가지고 있는 적재 가능한 디바이스 드라이버 모듈이다.

-------------------- 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에서 모듈이 제거되었다는 메시지를 확인할 수 있다.

+ Recent posts