이전 시간에 Makefile을 만드는 방법에 대해 알아 보았습니다. 즉, 컴파일하는 방법을 알게 되었으므로 이번 시간부터 모듈 프로그램을 작성해 보도록 하겠습니다.

샘플 프로그램을 작성하기에 앞서서 모듈 프로그램에서 주의해야할 내용이 있습니다. 모듈 프로그램은,

  • main() 함수가 없습니다.
  • 표준 C 라이브러리를 사용할 수 없습니다.
  • 실수 연산을 할 수 없습니다.

모듈 프로그램은 커널 버전에 맞추어서 작성되어야 하겠습니다. 그러다 보니 이전 시간에 커널 버전에 따라 Makefile이 다른 것처럼 모듈의 초기화와 종료하는 코드가 다릅니다. 커널 2.4와 2.6에서 모듈 프로그램 예를 보겠습니다.

커널 2.4 커널 2.6
#include <linux/kernel.h>
#include <linux/module.h>

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

void __exit cleanup_module(void)
{
  printk( KERN_ALERT "Good-bye~n" );
}

MODULE_LICENSE( "GPL" );
#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" );

헤더파일 정리

모듈 프로그램에 반드시 들어가는 헤더파일에 대해서 알아 보겠습니다.

헤더파일 헤더 파일 설명
#include <linux/init.h> (1) 커널 2.6에서만 사용되며, (2) module_init()와 module_exit() 매크로 함수가 정의되어 있습니다.
#include <linux/kernel.h> 커널과 관련된 자료 구조와 printk() 함수 등이 정의 되어 있습니다.
#include <linux/module.h> 모듈과 관련된 자료 구조와 매크로가 정의되어 있습니다.

샘플 모듈 테스트

이 글에서는 커널 2.6에 대해서만 말씀을 드립니다만 2.4 커널과의 차이점이라면, 2.4에서는 모듈 확장자가 .o 이지만 2.6은 .ko이며, 이후에 모듈 등록부터 관리, 제거까지 모두 같습니다. 위 소스는 아래의 Makefile로 생성했으며, 소스와 함께 압축해서 첨부하겠습니다.

KERNELDIR =	/lib/modules/$(shell	uname	-r)/build

obj-m	:= sample.o

KDIR	:=	/lib/modules/$(shell	uname	-r)/build
PWD	:=	$(shell pwd)

default:
	$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

clean:
	rm	-rf *.ko
	rm	-rf *.mod.*
	rm	-rf .*.cmd
	rm	-rf *.o
	rm	-rf .tmp_versions

만들어진 모듈은 samle.ko 가 됩니다. 이 모듈을 커널에 등록해 보도록 하겠습니다. 모듈을 테스트하기 위해서는 root로 로그인하셔야 합니다. 모듈을 등록하기 위해서 insert module 명령인 insmod 를 실행합니다.

]$ su -
Password: 
]# insmod sample.ko
Hello world.
You have new mail in /var/spool/mail/root
]#
여기서 잠깐

모듈은 테스할 때 반드시 시스템에서 직접 테스트하십시오. 저는 평상시 텔넷 프로그램을 이용하기 때문에 모듈도 텔넷에서 등록했는데, Hello world. 문자열이 출력되지 않는 것입니다. 이것은 또 무슨 문제인가 긴장했는데, printf()와는 달리 printk()는 시스템 내에서만 출력합니다. 즉, 텔넷 프로그램 쪽으로는 문자열 출력을 해 주질 않습니다.

그러므로 델텟에서 테스트하지 마시고 시스템에서 직접 테스트하시기 바랍니다.

모듈이 등록되어 있는지 확인하려면 list moule 명령인 lsmod 를 실행합니다.

]# lsmod
Module                  Size  Used by
sample                  5632  0 
nfsd                  214529  17 
exportfs               10177  1 nfsd

            :

jbd                    59609  1 ext3
[root@jwCentOS 116_device_driver]# 

커널에서 모듀릉 삭제하시려면 remove module 명령인 rmmod 를 이용하시면 되겠습니다. 모듈의 이름까지만 입력하시고 확장자 .ko는 생략하셔도 됩니다.

]# rmmod sample
Good-bye~
]# 

태그: *디바이스드라이버