강좌 & 팁
타겟보드를 이용하여 디바이스 드라이버를 배워보자!(3)
안녕하세요 이우영 입니다.
저번시간에는 간단한 모듈을 만들어 보았습니다.
오늘도 간단하지만 기본적으로 알아두어야 할 몇가지에 대해서 알아보도록 하겠습니다.
그럼 오늘도 폴더 만들기 부터 하겠습니다.
test_02 폴더를 만들어 주세요.
전에 만들어둔 파일을 이용해서 만들어 보도록 하겠습니다.
test_01의 파일을 test_02 폴더로 복사해주세요.
이번에는 모듈이 2개 필요하기 때문에 extern_module.c 와 export_module.c 파일을 만들었습니다.
export_module.c
int export_test(int value1, int value2)
{
printk("value1 = %d\n", value1);
printk("value2 = %d\n", value2);
return value1 + value2;
}
int __init export_init()
{
printk(" export_init!!! \n");
}
void __exit export_exit()
{
printk(" export_exit!!! \n");
}
EXPORT_SYMBOL( export_test );
module_init( export_init );
module_exit( export_exit );
MODULE_LICENSE("GPL");
extern_module.c
extern
export_test (int value1, int value2);
int __init extern_init()
{
printk("%d\n",
export_test (5, 5));
}
void __exit extern_exit()
{
}
module_init( extern_init );
module_exit( extern_exit );
MODULE_LICENSE("GPL");
Makefile
cc := arm-generic-linux-gnueabi-gcc-4.3.2
obj-m := export_module.o extern_module.o
KDIR := /home/woo/device_driver/linux-2.6.29-ez-s3c6410
all:
make -C $(KDIR) SUBDIRS=$(PWD) modules
cp *.ko /nfs
clean:
rm -rf *.o
rm -rf *.ko
rm -rf *.mod.*
rm -rf .*.cmd
rm -rf modules.order
rm -rf Module.markers
rm -rf Module.symvers
필독! : 모듈 하나에 Makefile 하나로 구성되야 합니다.
(전 귀찮아서 하나로 ㅎㅎ)
모두 작성하셨으면 make로 컴파일을 해줍니다.
요번에는 cp *.ko /nfs명령어 때문에 따로 모듈을 복사 해줄 필요가 없어 졌습니다.
그럼 minicom을 통해서 보드로 테스트 해보겠습니다.
mount -t nfs -o nilock 192.168.10.1:/nfs /mnt/nfs <- 명령어로 pc와 연결을 하고
/mnt/nfs 폴더에 가보면 export_module.ko 와 extern_module.ko 파일이 생겨있습니다.
아무 생각없이 extern_module.ko를 등록시키면 에러가 나옵니다. 자 왜 그럴까요?
extern_module은 export_module의 함수를 사용합니다. 그래서 의존성이 생겨나게 되었습니다.
export_module이 올라가 있지 않다면 extern_module을 등록 할 수가 없습니다.
그래서 순서대로 등록 하면 동작을 하는 모습입니다.
제거 하실때에는 반대로 extern_module에서 export_module을 사용중이기 때문에 export_module을 먼저 제거 하실 수 없습니다.
간단하지만 두고두고 쓰게될 내용입니다.
오늘도 간단하게 테스트를 해보았습니다.
그럼 다음시간에 만나요~~
빠른만남을 원하시면 http://ms-osek.org/ 여기로 찾아오세요~
강좌에 감사합니다.
딴지는 아니고요. 강좌를 따라하다가 오류를 발견했습니다. .
extern_module.c 코드에서
printk("%d\n", module_test(5, 5)); -> printk("%d\n", export_test(5, 5));