ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • LKM(Loadable Kernel Module)
    2011. 10. 13. comments

    Loadable Kernel Module(이하 LKM이라 축약해서 부름)이란 말 그대로 시스템 운영 중에 커널에 load/unload 가능한 모듈을 의미한다. linux 커널의 장점 중에 하나로써, 시스템 운영 중에 모듈을 올릴 때 재부팅의 과정이 필요하다면 그 자체도 시스템 운영자에게 있어서 신경써야 할 부분이기 때문에 유연한 관리를 위한 기능이기도 하다.

    간단한 LKM dummy 코드를 소개한다. 이 dummy 커널 모듈을 일단 만들고 커널 공부한 부분들을 이 모듈에 넣어 테스트 하면 유용하다.

    일단 linux 시스템이 있어야 하고, 일단 커널 코드를 다운받아야 한다.

    2011/08/18 - [리눅스(Linux)/커널(Kernel)] - linux kernel 소스코드는 어디서 받나요??

    자 그러면 소스코드를 위한 디렉토리를 만들어보자.

    mkdir dummy_mod 



    만들어진 디렉토리로 이동 한 후, 컴파일에 필요한 Makefile과 소스코드 파일을 만든다.

    cd dummy_mod
    touch Makefile
    touch dummy_core.c


    다음으로 Makefile 파일에 컴파일을 해야 할 소스코드에 대한 오브젝트 파일을 작성 한다.

    obj-m += dummy_core.o
    


    마지막으로 소스코드를 작성하면 된다. 기본적으로 사용되는 코드는 다음과 같다.

    • linux/module.h 를 include 해주어야 한다.

    /** define module configure */
    MODULE_LICENSE("GPL");
    MODULE_DESCRIPTION("Dummy module");
    MODULE_AUTHOR("morenice");
    
    int init_dummy_mod(void)
    {
        printk(KERN_INFO "init called.\n");
    
        return 0;
    }
    
    void cleanup_dummy_mod(void)
    {
        printk(KERN_INFO "cleanup called. module is now unloaded.\n");
    }   
    
    
    /** register entry function. */
    module_init(init_dummy_mod);
    /** register exit function. */
    module_exit(cleanup_dummy_mod);
    

    • MODULE_ 로 시작하는 부분은 이 커널 모듈을 정의하는 부분이다.
    • module_로 시작하는 부분은 커널 모듈이 load/unload될 때 호출되는 함수를 정의하는 부분이다.
    • printk는 커널에서 사용되는 출력 함수로써 dmesg명령어로 메세지를 확인 할 수 있다.

    전체 컴파일을 한번 진행 해야 커널 모듈이 정상적으로 컴파일이 되어 load 된다.

    make menuconfig
    make



    자 이제부턴 커널 모듈과 컴파일 할 수 있다.

    make modules SUBDIRS=dummy_mod


    컴파일을 진행하면 커널 오브젝트의 약자인 .ko 파일이 생성된다. 해당 파일을 커널 모듈로 load할 때는 insmod 명령어를 그리고 내릴 때는 rmmod로 모듈을 load/unload 할 수 있다.

     


    반응형

    댓글

Designed by Tistory.