일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- dfs recursive
- 라즈베리파이 uboot
- AWS
- .config
- 라즈베리파이3
- tftp 서버
- GPIO
- deque
- tftp
- uboot
- 한수
- 일곱 난쟁이
- DFS
- 인접행렬
- stack
- 최단경로
- STL deque
- Module.symvers
- 2309
- 라즈베리파이3 ftfp
- 라즈비안
- 디바이스 드라이버
- 라즈베리파이3 라즈비안
- 디바이스드라이버
- tftp-hpa
- gui
- u-boot
- 모듈
- putty
- 백준
- Today
- Total
달공이와 임베디드
Module 생성을 위한 과정 본문
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
'디바이스 드라이버' 카테고리의 다른 글
디바이스 드라이버 프로그램의 구성 (0) | 2016.08.23 |
---|---|
디바이스 드라이버에 대한 이해 (0) | 2016.08.23 |