커널 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 커널의 모듈은 동일한 코드를 사용할 수 있으며, 빌드 과정만 다르다.

 2.6 커널부터는 커널 빌드에 대해서 kbuild 시스템을 사용합니다. 따라서 모듈을 빌드하기 위해서 gcc를 사용할 수 없고, Makefile을 정의하고, kbuild 시스템으로 모듈을 빌드해야 한다.

 모듈을 로드하기 위해 insmod 명령을 실행한다. 모듈에 2.4 커널은 .o 형식을 사용하지만, 2.6 커널은 .ko 형식을 사용한다.
2.4 커널의 경우
# insmod hello.o
2.6 커널의 경우
# insmod hello.ko

 모듈이 로드된 것을 확인하기 위해 lsmod 명령을 사용한다.

 rmmod 명령으로 모듈을 제거한다. 커널 버전에 관계없이 동일하며, 제거할 모듈 이름만 지정한다.
# rmmod hello

+ Recent posts