달공이와 임베디드

Module 생성을 위한 과정 본문

디바이스 드라이버

Module 생성을 위한 과정

하일리99 2016. 8. 23. 15:51

Module 생성을 위한 과정 ( KDIR 경로 설정을 위한 과정 )

module 을 컴파일 하기 위해서는 두가지가 필요하다. 하나는 리눅스 커널의 소스 파일(헤더파일)이고 다른 하나는 Module.symvers (Symbol Table) 파일이다. ★ 우선적으로 모듈 빌드시 사용하기 위한 Makefile 을 살펴보자.



Makefile : make modules

 


간단하게 모듈빌드를 위한 make 명령어는 make modules 이다.

make module : 커널 환경설정에서 모듈로 설정한 기능들을 컴파일합니다.

cf) make module_install 컴파일 된 모듈을 /lib/modules 아래 설치합니다.


make 옵션을 살펴보면 1) 크로스 컴파일 옵션   2) -C 옵션   3) 서브디렉토리 설정 옵션이 있다. 1) 크로스 컴파일은 PC 환경에서 컴파일하여 해당보드에 전달해 주기위해 사용한 옵션이고, 2) -C 옵션은 컴파일시 경로를 지정해주기 위해 사용한 옵션이다.  man page 에서는 다음과 같이 설명한다.

 


3) 서브디렉토리 설정옵션[ SUBDIRS=$(경로) ] : 위의 코드에서는 $(PWD) : print working directory / 설정되어 있는 값(현재의 위치)을 사용하고 있다. 


※ SUBDIRS 

: 빌드하려는 라이브러리 또는 실행 바이너리가 다른 디렉토리에 있는 라이브러리에 의존하는 경우, 해당 라이브러리의 디렉토리로 이동해서 빌드를 먼저 수행하고 나서, 원래 디렉토리로 돌아와 빌드를 이어할 수 있도록 해주는 것. 즉, 해당 컴파일 경로를 지정해주고 그 경로의 라이브러리를 이용해 빌드를 하고, 다시 원래 디렉토리로 돌아와 빌드를 이어나가는 것이다.  그럼 커널모듈 빌드를 위한 경로는 어디로 지정해주어야 할까?





[ 더보기 ]  Makefile reference  & Module compilie 


1) kdir 설정해주기

 다음 페이지를 참조하라 : http://onecellboy.tistory.com/306


 2) 일반적인 Module 컴파일을 위한 형태

obj-$(CONFIG) := device.o

즉, CONFIG 의 설정에 따라 컴파일하는 모듈의 속성을 지정하여 줄 수 있다. 커널소스 트리에 있는 각종 드라이버들은 모듈(Loadable kernel Module)로 컴파일 될 수도 있고, 커널 이미지에 바로 들어갈 수도(Built-in kernel Module) 있다.


obj-y := device.o

obj-m := device.o



일반적인 커널 컴파일시 .config 만들기


1) make raspi2_defconfig (이미 정의되어 있는 설정)

2) make menuconfig (직접 설정)

3) make oldconfig (직접 설정)

4) config 파일 받아오기

  /proc 에서,  #sudo modprobe configs 하면 → config.gz 생성, #zcat config.gz > .config 



라즈베리파이3 모듈 생성을 위한 .config 파일 받아오기


1) 라즈베리파이3 보드의 라즈비안(OS) 에서 .config 받아오기

 [개발보드] /proc 에서, #sudo modprobe configs → config.gz 생성, #zcat config.gz > .config


※ .config 파일은 커널을 컴파일 하기위해 생성해주는 Configuration (설정)이 저장되어 있는 파일이다. 즉, kernel 을 컴파일 할 때, .config 파일을 통해 특정 값을 DEFINE 하여 하드웨어에 의존적으로 커널의 설정을 결정할 수 있다. 이러한 .config 파일은 make menuconfig, make oldconfig 명령어를 이용하여 컴파일 할 커널을 GUI 또는 응답식(Y/N) 등의 형태로 생성할 수 있다. 


2) 받아온 .config 파일을 이용하여 커널 컴파일하여 Module.symvers 만들기

 [개발환경 PC] 라즈베리 파이 OS(kernel) 에 알맞은 버전의 kernel 을 git 으로 부터 받아와

 앞서 만든 CONFIGURATION 파일인 .config 파일을 통해서 개발보드에 맞는 환경(?)으로 컴파일.

 라즈베리파이3 은 arm Core 프로세서이므로, export ARCH=arm

 export CROSS_COMPILE=arm-linux-gnueabihf-

 make → Module.symvers 파일을 만든다.


3) kernel Module 을 생성을 위한 make module_prepare

 make clean & make mrproper 을 통해 컴파일한 파일 제거

 다시 .config 파일 받아 kernel module 컴파일

 export ARCH=arm, exprot CROSS_COMPLIE=arm-linux-gnueabihf-

 make module_prepare



참고자료

http://www.joinc.co.kr/w/Site/Embedded/Documents/LinuxKernelModuleProg

http://developinghappiness.com/?p=461

http://onecellboy.tistory.com/306

http://poplinux.tistory.com/106




Comments