Skip to content

Linux:Kernel:Module

커널 모듈이란 정확히 무엇인가? 모듈이란 요구에 따라 커널에 적재 되거나 해제 될 수 있는 코드다. 시스템의 재가동 없이 커널의 기능을 확장을 가능케하는 것이다. 예로 모듈의 한 종류는 디바이스 드라이버다. 그리고 그것은 시스템에 연결된 하드웨어에 커널이 접근할 수 있도록 해 준다. 모듈이 없다면 우리는 모놀리틱 커널을 다시 빌드 해야 하며, 커널 이미지에 새로운 기능을 직접적으로 추가 시켜야 한다. 대규모 커널에서는, 우리가 원하는 새로운 기능을 추가 하기 위해서 매번 커널을 다시 빌드해야 하고, 다시 부팅해야하는 단점을 갖게 된다.

Simple example

아래의 예제는 CentOS7 커널 버전 3.10.0-123.20.1.el7.x86_64 에서 테스트 되었다. 우선 아래와 같이 진행한다. 만약 KERN_DIR의 권한문제가 발생할 경우 chmod 또는 chown 등으로 조정한다.

$ export KERN_DIR=/usr/src/kernels/`uname -r`
$ mkdir ~/module_01
$ cd module_01

module_01.c파일을 생성한다.

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>

int __init init_hello(void)
{
    printk(KERN_ALERT "Hello world.\n");
    return 0;
}

void __exit exit_hello(void)
{
    printk(KERN_ALERT "Good-bye\n");
}

module_init(init_hello);
module_exit(exit_hello);

MODULE_LICENSE("GPL");

Makefile파일을 생성한다. (clean target은 생략한다.)

obj-m := module_01.o
KDIR := $(KERN_DIR)

all:
    make -C $(KDIR) M=$(PWD) modules

이후 아래와 같이 빌드한다.

$ make

만약 권한 관련 에러가 발생되면 root권한으로 make를 실행한다.

최종적으로 module_01.ko파일이 생성되면

  • insmod를 사용하여 모듈을 추가,
  • lsmod를 사용하여 추가된 모듈 확인,
  • rmmod를 사용하여 모듈을 제거한다.

printk를 사용하여 출력한 로그 메시지는 dmesg를 사용하여 확인할 수 있다.

See also

Favorite site

References


  1. Joinc-Linux_kernel_module_programming-2.4.pdf 

  2. KLDPWiki-Kernel_Module_Programming_Guide.pdf 

  3. Module_programming_for_linux_kernel.7z 

  4. The_Linux_Kernel_Module_Programming_Guide.pdf