강좌

HOME > 강좌 >
강좌| 리눅스 및 오픈소스에 관련된 강좌를 보실 수 있습니다.
 
누구나 쉽게 배우는 임베디드 리눅스②
조회 : 17,804  


누구나 쉽게 배우는 임베디드 리눅스

교차 개발 환경을 구축하자

 

 

지난 호에서는 임베디드 리눅스란 무엇인가에 대해 알아보았다. 이번 호부터는 임베디드 리눅스

동작시키기 위해 필요한 사항에 대해 알아보기로 하겠다. 번째로 필요한 사항은

개발 환경(Cross Development Environment) 구축하는 과정이다.

 

_ 장영준 삼성전자 SW연구소 Linux Technology Group 선임 연구원

 

 

연재 순서

임베디드 리눅스 걸음마

교차 개발 환경을 구축하자

부트로더 설정은 이렇게

커널을 올려보자

루트 파일 시스템은

어떻게 구성되는가

2% 부족함을 채워보자

 

교차 개발 환경 구축의 기초

일반적인 프로그램의 개발 과정을 살펴보면 다음과 같다.

 

1. 프로그램 소스 코드를 작성 : 에디터 사용

2. 프로그램 빌드 : 시스템에서 실행 가능한 이미지로 컴파일 : 컴파일러 사용

3. 프로그램 실행, 테스트

4. 디버깅 : 디버깅 사용

 

디버깅을 하는 과정에서 프로그램이 정상적으로 동작하지 않는다면, 문제를 해결하기 위해다시 소스코드를 수정하고, 빌드, 실행해보는 절차를 반복하게 된다. 과정을 수행하는데 에디터, 컴파일러, 디버깅 툴이 사용되었다. 개발을 하는데 있어서는 이와 같은 툴들이 필요하고, 이를 개발 환경이라고 지칭한다. 보통 PC 환경에서는 모든 작업을 PC에서 직접 수행할 수가 있다. , PC에서 직접 개발하고, 개발된 결과물 역시 PC에서 바로 동작시켜 수가 있는 것이다. 이는 다른 임베디드 시스템에 비해 PC 사양이 높고 여러모로 개발을 하기에 적합한 환경을 가지고 있기 때문이다.

반면, 지난 시간에 언급했듯이 임베디드 시스템은 사양이 낮아 개발을 하기에 부족하거나 심지어는 불 가능한 경우까지 있기 때문에, 외부 환경에서 프로그램을 개발하고 개발된 결과물을 임베디드 시스템에서 수행하는 구조를 이용해 개발을 하게 된다. 이렇듯 외부 환경에서 프로그램을 개발하는 구조를 교차 개발 환경이라고 한다.

이때, 개발의 대상이 되는 임베디드 시스템을 타겟(Target)이라고 하고, 타겟에서 실행될 프로그램을 개발하는데 사용되는 시스템을 호스트(Host)라고 한다. 호스트에서는 해당

겟을 개발하기 위한 환경이 필요하게 되는데, 환경을 타겟을 개발하는데 필요

툴들의 모임이라고 하여 툴체인(Toolchain)이라고 한다. 다음은 교차 개발 환경을 간단하게 나타낸 그림이다.

 

 

호스트에서 먼저 프로그램을 개발하고, 타겟에서 이를 다운로드 받아 프로그램을 실행하고, 타겟의 수행상태를 보거나 디버깅이 필요한 경우 역시 호스트에 연결하여 타겟의 상태를 모니터링하는 구조로 되어 있다. 이때, 다운로드의 경우는 보통 속도가 빠른 케이블을 이용하고, 모니터링, 디버깅 등은 콘솔(시리얼 케이블) 이용한다.

PC에서 간단한 프로그램을 개발하는 과정을 보면 다음과 같다.

프로그램은 화면에Hello라는 메시지를 출력하는 프로그램이다. 이를 다음과 같이 빌드하여 실행해 보면Hello라는 결과가 출력된다.

gcc 컴파일러를 이용하여 프로그램을 빌드하고, PC에서 곧바로 실행시켜 결과를 확인하였다. 위에서 생성된 hello 프로그램은 PC 이미지이기 때문에 다른 시스템에서는 사용할 없으므로 해당 시스템에 맞는 컴파일러를 이용해 빌드해 주는 작업이 필요하게 된다. 프로그램을 임베디드 시스템에서 동작시키기 위해서는 다음과 같은 절차를 거치게 된다.

 

gcc 대신 임베디드 시스템용 컴파일러를 사용하여 프로그램 빌드

생성된 hello 프로그램 이미지를 타겟으로 다운로드

타겟에서 hello 프로그램을 실행

 

#include <stdio.h>

int main(void) {

printf( Hello );

return 0; }

# gcc - o hello hello.c

# ./hello

Hello

 

 

임베디드 시스템은 사양이 낮아 개발을 하기에 부족하거나 심지어는 불가능한 경우까지 있기 때문에, 외부 환경에서 프로그램을 개발하고 개발된 결과물을 임베디드 시스템에서

수행하는 구조를 이용해 개발을 하게 된다. 이러한 개발 구조를 교차 개발 환경이라고 한다.

 

 

 

타겟용 툴체인 만들기

이제부터 과정을 수행해 보기 위한 타겟용 툴체인을 만들어 보기로 하겠다.

먼저, 툴체인을 만드는데 필자가 사용한 환경은 다음과 같다.

 

 

 

호스트로는 리눅스가 설치된 펜티엄PC 사용하였고, 타겟은 SMDK2440이라는 ARM CPU 사용

개발 보드를 기준으로 하였다. (ARM이란 임베디드 시스템에서 많이 사용되는 CPU 중의 하나이다.) 호스트가 펜티엄, x86 계열의 CPU 사용하는 반면, 타겟은 ARM 계열의 CPU 사용하고 있기 때문에 호스트에 SMDK2440 개발 환경을 만들기 위해서는 ARM 툴체인을 구성해야 한다.

여기서는 crosstool 이라는 툴을 사용하여 툴체인을 구성해 보기로 하겠다.

툴체인은 gcc, glibc, binutil 등의 프로그램이 통합된 복잡한 구조를 가지고 있는데, 크로스툴은 이를

쉽고 간단하게 만들어 주는 툴이다. 물론 오픈소스로 되어 있기 때문에 무료로 사용 가능하다. 크로스

툴의 공식 사이트는 http://kegel.com/crosstool/ 이다. 다운로드 사용법 크로스툴 사용에 대한

모든 정보를 있다.

 

1. 기본환경 설정

앞으로 강좌를 진행하면서 사용할 계정과 디렉토리를 먼저 설정하도록 하겠다. 물론, 다른 계정이나 디렉토리를 사용해도 무방하지만, 따라 하기 쉽도록 하기 위해 편의상 설정하였다.

 

. 계정 생성

강좌에서는oss라는 유저 계정을 사용하여 진행하기로 한다. 부득이하게 루트 계정을 사용해야하는 경우에는 별도로 언급하도록 하겠다.

다음과 같이 계정을 생성하고, 생성된 계정으로 로그인 한다.

 

# adduser oss

# passwd oss

# su - oss (또는 oss 계정으로 로그인)

 

. 작업 디렉토리 생성

oss 디렉토리의 elinux 라는 디렉토리에서 모든 작업을 진행하기로 한다.

 

# mkdir elinux

# cd elinux

# pwd

/home/oss/elinux

. 툴체인 설치 디렉토리 준비

강좌에서는 /opt 디렉토리를 툴체인이 설치될 디렉토리로 사용할 것이다. 유저 계정에서 /opt 디렉토리의 쓰기 권한이 없는 상태이기 때문에 쓰기 권한을 설정한다. 이는 루트 계정으로 수행해야 한다.

 

2. 크로스툴 설치

 

. 다운로드

크로스툴 공식 사이트에서 크로스툴을 다운로드한다. 여기서는 최신 버전인 0.43 버전을 사용한다. wget 명령어를 이용해서 다운로드 받으면 되고, 아래와 같은 메시지가 출력된다.

 

# wget http://kegel.com/crosstool/crosstool-0.43.tar.gz

oss@jyj0316-linux:~$ wget http://kegel.com/crosstool/crosstool-0.43.tar.gz

--19:24:40-- http://kegel.com/crosstool/crosstool-0.43.tar.gz

=> `crosstool-0.43.tar.gz'

####### 168.219.61.250:8080... ###########

Proxy request sent, awaiting response... 200 OK

Length: 3,047,042 (2.9M) [application/x-tar]

 

100%[=============================>] 3,047,042 70.67K/s ETA 00:00

19:25:25 (67.87 KB/s) - `crosstool-0.43.tar.gz' saved [3047042/3047042]

oss@jyj0316-linux:~$

 

다운로드가 완료되면, tar 명령어를 이용하여 압축된 크로스툴 소스코드의 압축을 해제한다.

 

# tar - xzf crosstool-0.43.tar.gz

# cd crosstool-0.43

 

 

. 스크립트 실행

크로스툴은 다양한 종류의 툴체인 플랫폼을 지원한다. ARM 툴체인을 만들기 위한 스크립트를 사용하면 된다. 그리고 SMDK2440 사용되는 ARM9 실수연산을 지원하지 않기 때문에 softfloat 선택하기로 한다.

 

 

# vi demo-arm-softfloat.sh

set -ex

TARBALLS_DIR=$HOME/downloads

RESULT_TOP=/opt/crosstool

export TARBALLS_DIR RESULT_TOP

GCC_LANGUAGES="c,c++"

export GCC_LANGUAGES

#eval `cat arm-softfloat.dat gcc-2.95.3-glibc-2.1.3.dat` sh all.sh --notest

#eval `cat arm-softfloat.dat gcc-2.95.3-glibc-2.2.2.dat` sh all.sh ?notest

eval `cat arm-softfloat.dat gcc-3.4.5-glibc-2.3.6.dat` sh all.sh --notest

 

 

demo-arm-softfloat.sh 파일을 보면 위와 같이 구성되어 있다. TARBALL_DIR gcc, glibc 툴체인 구성에 필요한 소스를 다운로드 받을 경로를 지정하고, RESULT_TOP 툴체인이 설치될 경로를 의미한다. 필요한 경우 위의 값을 바꾸어 주면 된다.

그리고, eval 시작하는 라인이 여러 있고, 1개를 제외한 모든 라인이 #으로 주석 처리되어 있음을 있다. 사용할 gcc glibc 버전을 지정한다. 디폴트 값으로 우리는 gcc 3.4.5 glibc 2.3.6 버전을 사용하기로 한다. 다른 버전의 툴체인을 만들고 싶은 경우 부분을 변경해 주면 된다.

여기서는 값을 변경하지 않은 채로 빌드를 수행하기로 한다

 

그리고 다음 파일을 수정한다.

 

# vi arm-softfloat.dat

TARGET=arm-linux

 

 

arm-softfloat.dat 파일의 TARGET 항목은 툴체인 설치시 prefix 지정한다. 이를 arm-linux 라고 설정하게 되면 툴체인의 gcc binutil prefix 붙어 arm-linux-gcc 같은 이름으로 만들어지고, prefix 호스트의 gcc 구분이 된다.

 

# sh demo-arm-softfloat.sh

 

 

위와 같이 스크립트를 실행하게 되면, binutil. gcc, glibc 툴체인 구성에 필요한 요소들을 해당 사이트로부터 다운로드 받게 되고, 이후 빌드, 설치 과정이 자동으로 이루어지게 된다. 시간이 걸리는 작업이다. (시스템 사양과 네트웍 속도에 따라 다르지만 보통 30 ~ 2시간 가량 소요된다.)

 

빌드가 성공적으로 완료되면, /opt/crosstool 디렉토리에 툴체인이 설치되었음을 확인할 있다.

 

# ls /opt/crosstool/gcc-3.4.5-glibc-2.3.6/arm-linux

 

툴체인 빌드가 완료되었으면 앞서 만든 hello 프로그램을 빌드해 보기로 하자.

이를 사용하기 위해 먼저 툴체인 실행파일을 PATH 등록해 준다.

 

# vi ~/.bashrc

export PATH=/opt/crosstool/gcc-3.4.5-glibc-2.3.6/arm-linux/bin:$PATH

 

oss 계정의 환경변수를 설정하는 .bashrc 파일의 마지막 줄에 위와 같은 라인을 추가한다. 이때 뒷부분의 :$PATH 특히 주의하여 입력하도록 한다. 잘못 입력하는 경우 기존의 PATH 정보가 지워질 염려가 있기 때문이다.

 

마지막으로 source 명령으로 변경된 내용을 현재 터미널에 반영해준다.

 

# source ~/.bashrc

 

이제, 툴체인을 사용하기 위한 모든 과정이 완료되었다. 이제 hello.c 프로그램을 빌드해 보기로 하자.

 

# arm-linux-gcc - o hello hello.c

 

# ./hello

-su: ./hello: cannot execute binary file

 

 

빌드는 성공적으로 완료가 되었지만, 실행해 보면 실행할 없다는 메시지가 출력된다. x86 아닌 ARM 이미지로 만들어 졌기 때문이다. 파일 정보를 보는 file 명령어로 hello 이미지를 확인해 보면 아래와 같이 ARM용으로 빌드된 이미지라는 정보가 출력된다.

 

# file hello

hello: ELF 32-bit LSB executable, ARM, version 1, for GNU/Linux 2.4.3, dynamically

linked (uses shared libs), not stripped

 

 

후에 임베디드 시스템에서 리눅스를 구동시킨 hello 이미지를 실행해 보면 제대로 실행됨을 확인할 수 있을 것이다.

 

지금까지 교차 개발 환경에 대해서 알아보았고, 크로스 툴이라는 오픈 소스를 이용하여 툴체인을 직접 만들어 보았다. 개발 환경을 구축하는 작업은 임베디드 리눅스를 사용하는 있어 가장 기반이 되는 과정이다. 이를 이용하여 앞으로 사용할 부트로더, 커널을 비롯한 모든 프로그램을 빌드할 것이기 때문이다. 다음 시간에는 부트로더에 대해 알아보고 타겟의 환경 설정에 대해 알아보도록 하겠다.

 

출처 : 공개 SW 리포트 8호 페이지 48 ~ 53 발췌(2007 8) - 한국소프트웨어 진흥원 공개SW사업팀 발간

 


[원글링크] : https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=1646


이 글을 트위터로 보내기 이 글을 페이스북으로 보내기 이 글을 미투데이로 보내기

 
한국소프트웨어진흥원 공개SW사업팀