강좌 & 팁
안녕하세요^^
오늘부터 리눅스 커널을 분석해볼 호서대학교 석사(과정) 이우영 입니다.
커널에 접근하기
보통 일반적인 프로그램에서는 커널 정보에 접근이 불가능한데요
그래서 사용하는 방법이 시스템 콜이나 인터럽트 등이 있습니다.
그러나 시스템 콜이나 인터럽트 같은걸 만들자니 벌써 머리가 아파옵니다.
그래서 선택한것이 모듈프로그램입니다.
모듈프로그램은 디바이스 드라이버를 만들 때 사용하는것입니다.
간단한 모듈프로그램은 만들기도 간단하고 쉽게 테스트 가능합니다.
저는 ez-s3c2440 보드를 통해 작업을 하기로 했습니다.
리눅스 커널은 포럼에서 제공하는 2.6.21 버전을 사용했습니다.
우선 간단한 모듈을 만들어 보겠습니다.
01_test_module.c
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
MODULE_LICENSE("GPL");
int module_start()
{
printk(" hello!!! \n");
return -EBUSY;
}
void module_end()
{
}
module_init( module_start );
module_exit( module_end );
소스는 참 간단하죠?
소스를 보면 일반적인 printf 가 아닌 printk 를 사용했습니다. <-커널이기 떄문이죠
그리고 모듈이 등록 되지 않도록 -EBUSY를 리턴해 줬습니다.
(나중에 모듈을 제거하거나 보드를 다시 리셋할 필요가 없어집니다.)
그럼 컴파일을 해야겠죠 Makefile 을 만들어 봅시다.
Makefile
cc := armlinux-gcc-3.4.3 //arm보드를 사용하니 크로스컴파일러를 사용해야 합니다.
obj-m := 01_test_module.o
KDIR := /linux-2.6.21 //사용하는 커널이 있는 폴더를 넣어 줍니다.
all:
make -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
rm -rf *.o *.ko *.mod.* .*.cmd
make를 하시면 01_test_module.ko 파일이 생성됩니다.
이 파일을 nfs 등을 이용하여 s3c2440 보드로 옴겨 줍니다.
insmod 01_test_module.ko 입력하시면 다음과 같이 hello!!!를 화면에 출력하고 종료 될겁니다.
간단하죠?
다음부터는 이 모듈을 이용해서 커널을 구석구석 살펴 보도록 하겠습니다.