타겟보드를 이용하여 디바이스 드라이버를 배워보자!(3)



안녕하세요 이우영 입니다.


저번시간에는 간단한 모듈을 만들어 보았습니다.


오늘도 간단하지만 기본적으로 알아두어야 할 몇가지에 대해서 알아보도록 하겠습니다.


그럼 오늘도 폴더 만들기 부터 하겠습니다.


test_02 폴더를 만들어 주세요.


01.png


전에 만들어둔 파일을 이용해서 만들어 보도록 하겠습니다.


test_01의 파일을 test_02 폴더로 복사해주세요.


02.png


이번에는 모듈이 2개 필요하기 때문에 extern_module.c 와 export_module.c 파일을 만들었습니다.


export_module.c

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

 

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");

 

           return 0;

}

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

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

 

extern  export_test (int value1, int value2);

 

int __init extern_init()

{

           printk(" extern_init!!! \n");

 

           printk("%d\n"export_test (5, 5));

 

           return 0;

}

void __exit extern_exit()

{

           printk(extern_exit!!! \n");

}

 

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 파일이 생겨있습니다.


 03.png


아무 생각없이 extern_module.ko를 등록시키면 에러가 나옵니다. 자 왜 그럴까요?


extern_module은 export_module의 함수를 사용합니다. 그래서 의존성이 생겨나게 되었습니다.


export_module이 올라가 있지 않다면 extern_module을 등록 할 수가 없습니다. 


그래서 순서대로 등록 하면 동작을 하는 모습입니다.


제거 하실때에는 반대로 extern_module에서 export_module을 사용중이기 때문에 export_module을 먼저 제거 하실 수 없습니다.


간단하지만 두고두고 쓰게될 내용입니다.


오늘도 간단하게 테스트를 해보았습니다.  


그럼 다음시간에 만나요~~


빠른만남을 원하시면 http://ms-osek.org/ 여기로 찾아오세요~