정보공간_1

[6기 강북 윤덕진]Cross compile과 Bootloader 본문

IT 놀이터/Elite Member Tech & Talk

[6기 강북 윤덕진]Cross compile과 Bootloader

알 수 없는 사용자 2014. 9. 15. 04:54

안녕하십니까! 강북멤버십 23-1 기 윤덕진입니다.

지난 포스팅에서는 Porting을 위한 환경구축에 대해서 알아봤습니다. 보지 못하신분은 아래의 링크를 참조하시면됩니다.

http://blog.secmem.org/474

오늘은 Cross compile과 Bootloader 에 대해서 알아보겠습니다.

 

1. Cross Compile이란...

 PC에서 실행되는 플랫폼이 아닌 다른 플랫폼에서 실행 가능한 코드를 생성하는 컴파일 방법입니다. 언어로 얘기를 하자면 한국인이 한국어로 외국인에게 말해봐야 아무것도 알아듣지 못합니다. 외국인에게 자신만의 언어가 있기 때문입니다. 그래서 통역이라는 것이 존재하고, 여기서 말하는 통역이 Cross compile입니다.

 PC에서 사용하는Visual 등에서 사용하는 C컴파일러는 ARM 등의 임베디드 시스템에서 적용될 수 없습니다. 그래서 ARM에서 실행되는 프로그램 등을 PC에서 컴파일 하기 위해서 Cross compiler가 필요하게 됩니다. 크로스 컴파일러는 Sourcery G++, Winarm 등 사이트에서 제공하고 있습니다.

 

 1.1 Cross Compiler 설치

 Cross Compiler 설치는 Ubuntu 상에서

 

 sudo apt-get install gcc-arm-linux-gnueabi

 

위 명령어를 통해 arm용 Cross Compiler를 쉽게 설치 할 수 있습니다. 이외에도 Sourcery G++ 홈페이지에서 다운로드 받는 방법도 있습니다. Cross Compiler는 여러가지 version들이 존재하므로 개발자에게 맞는 version을 다운로드 하면됩니다.

 

1.2 Cross Compiler 테스트

 

Cross Compiler를 다운로드 받았다면, 제대로 컴파일이 되고 있는지 실행해봐야 합니다. 작성자는 위에서 언급한 Cross Compiler가 아닌 Sourcery G++에서 제공하는 Cross Compiler를 사용하였습니다.

 

(1) Cross Compiler 경로 설정

설치된 경로를 bash 파일에 추가 해주어야 합니다. root 디렉토리의 .bashrc를 vi로 실행시킵니다.

 

 

 

맨 밑줄에 위 사진과 같이 자신의 Cross Compiler가 설치된 경로를 입력해줍니다. 다음은

source .bashrc 명령어를 통해 경로를 적용합니다. 그리고 명령창에 arm-none 까지만 치고 Tab 을 두 번 누르면 아래 사진과 같이 등록된 컴파일러들이 표시되는 것을 확인할 수 있습니다.

 

 

(2) Compiler Test

 -PC Ubuntu 상에서 Hello World 를 출력하는 source code를 생성합니다. 

 -cross compiler를 이용해서 해당 source code를 compile합니다. 명령어는 아래와 같습니다.

arm-none-eabi-gcc test.c

 -compile 하게 되면 a.out이라는 바이너리 파일이 생성됩니다. 이 파일을 지난 번에 설치했던 NFS 를 통해 임베디드 보드로 전송합니다.

 -임베디드 보드에서 공유된 폴더에 a.out 파일을 확인한 후에 ./a.out 명령어를 통해 실행 시켜보면 Hello World가 표시되는 것을 알 수 있습니다.

 

2. Bootloader란

 Bootloader 는 시스템을 초기화 하고 임베디드 운영체제를 탑재하거나 실행하기 위해서 시스템 초기화 코드, 하드웨어 제어프로그램, 네트워크, USB 등의 프로토콜과 일부 파일 시스템을 관리합니다. 쉽게 생각하면 PC의 BIOS라고 생각하시면 될 것 같습니다. PC가 최초 부팅될 때 실행되는 것이 BIOS 이듯이 임베디드 보드의 전원을 인가할 때 실행되는 것이 Bootloader입니다. Bootloader의 역할은 다음과 같습니다.

 ->Target 초기화, Target 동작 환경설정, 시스템 운영체제 부팅, 플래시 메모리 관리, 모니터 기능

 

2.1 Bootloader의 종류

 일반 개발자들이 Bootloader를 처음부터 작성하기란 매우 어렵습니다. 그래서 몇몇 오픈 소스 개발자들에 의해 만들어진 Bootloader를 사용하게 됩니다. 아래에서 그 종류에 대해 간략하게 설명하겠습니다.

 

(1) LILO

- LInux LOder의 약자로, 리눅스를 위한 Bootlloader입니다. loadlin이 대중화된 뒤 여러해 동안 대부분의 리눅스 배포판을 위한 기본 Bootloader 였습니다.

 

(2) GRUB

-GRand Unified Bootloader 의 약자로 GNU 프로젝트의 Bootloader 입니다. 대부분 운영 체제의 커널을 불러올 수 있습니다.

 

(3) Loadlin

- 리눅스를 load하는 Dos 유틸리티 입니다. Dos를 먼저 부팅하고 사용해야 하기 때문에 근래에는 사용되지 않습니다.

 

(4) EtherBoot

- 디스크 없는 시스템에서 이더넷을 통해 부팅하는 Bootloader입니다.

 

(5) Blob

- ARM 프로세서 시반의 LART 하드웨어를 위한 Bootloader입니다.

 

(6) PMON

- MIPS 보드를 지원하기 위해 제작된 Bootloader입니다.

 

(7) RedBoot

-레드햇에서 개발되어 배포된 Bootloader로 eCos에 기반한다.

 

(8) U-Boot

- Universal Bootloader의 약자로, 여기서 소개된 Bootloader 중 가장 많이 사용되고 있는 bootloader 로써 PPCBoot와 ARMBoot 프로젝트를 기반으로 개발되었으며, 다양한 ARM 프로세서 기반의 Target Board를 지원합니다. 작성자 또한 U-Boot을 사용하여 프로젝트를 진행하였습니다.

 

2.2 U-boot 설치 및 빌드

(1) U-boot 설치

 작성자는 BeagleBoneBlack 보드를 사용하였기 때문에 해당 보드의 U-boot을 git을 통해 다운로드 받았습니다. 명령어는 아래와 같습니다.

wget ftp://ftp.denx.de/pub/u-boot/u-boot-latest.tar.bz2

설치가 끝나면 아래와 같이 u-boot 폴더(u-boot-2014.07)를 확인할 수 있습니다. 폴더로 들어갑니다.(형광표시)

 

 

 branch가 맞지 않아, 파일이 보이지 않으니 git checkout v2014.07 -b tmp 를 통해 branch를 변경합니다.(이것은 각 u-boot마다 다를 수 있습니다. 잘 확인하시길 바랍니다.)

폴더의 내부를 확인해보면 다음과 같이 구성되어 있습니다.

 

 

각 폴더에 대한 설명은 아래와 같습니다.

arch

arm, mips, powerpc 등 프로세서 아키텍처 별로 서로 다른 디레터리를 구성하고 있으며, 각 프로세서 아키텍쳐에 따른 소스를 구성하는 디렉터리입니다.

board

각 제조사별 보드 관련 소스를 구현하는 디렉토리입니다.

common

U-boot에서 공통적으로 사용되는 소스를 구현하는 디렉토리입니다.

disk

DISK를 관리하기 위한 소스로 구성되어 있습니다.

doc

U-Boot 관련 문서를 가지고 있는 디렉토리입니다.

drivers

U-boot 에서 지원되는 다양한 장친들에 대한 드라이버를 구현한 디렉토리입니다.

examples

U-boot에서 독립적으로 프로그램을 실행시키는 샘플 코드를 포함하는 디렉토리입니다.

fs

U-boot에서 지원하는 다양한 파일 시스템에 대한 소스를 구현한 디렉토리입니다.

include

U-boot에서 사용되는 헤더파일을 정의한 디렉토리입니다.

lib

U-boot에서 사용되는 각종 라이브러리를 구현한 디렉토리입니다.

net

U-boot에서 지원되는 UDP,IP,TFTP 등 네트워크 프로토콜을 구현한 디렉토리입니다.

post

POST를 구현하는 디렉토리입니다.

tools

U-boot 사용에 필요한 각종 호스트 유틸리티를 구현하는 디렉토리입니다.

 

(2) U-boot 빌드

  아래와 같이 명령어를 사용해서 u-boot을 빌드하게 됩니다.

 

 위 명령어 다음에 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- 명령어로 u-boot.bin 파일과 MLO 파일을 생성합니다.

 

 

위 사진에 u-boot.img 파일과 MLO파일이 생성된 것을 알 수 있습니다. 이 파일들을 Target board에 이식해주고 부팅을 시키면 U-boot 설치가 끝나게 됩니다.

 보통 대부분의 임베디드 보드는 보드 내부에 위 사진과 같이 U-boot을 이식해서 제품을 출시합니다. 본인이 사용하고자 하는 U-boot과 일치한다면 해당 U-boot을 사용하시면 되고 U-boot을 변경하길 원한다면 위 사진에 있는 U-boot.img 와 MLO파일을 이전에 빌드해서 생성된 파일과 교체해주면 됩니다.

 여기까지 Cross Compiler와 Bootloader에 대한 포스팅을 해보았습니다. 본인도 공부하면서 이것저것 찾아가면서 해본 것이라 중간중간 틀린 것이나 미숙한 것이 있을 수 있습니다. 지적해주시면 바로 수정해서 다시 올리도록 하겠습니다. 다음 시간에는 BeagleBoneBlack 에 Tizen kernel 을 이식하는 과정을 포스팅하도록 하겠습니다. 감사합니다.