강좌

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


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

부트로더 설정은 이렇게

 

 

시스템을 처음 동작시키기 위해서는 시스템을 구동시켜 주는 부트로더가 필요하다. 부트로더는 시스템을 구동시킨 운영체제를 메모리에 로딩해 운영체제가 동작할 있도록 만들어 준다. 이번호에서는 부트로더에 대한 기본적인 내용과, 타겟을 동작시키기 위한 절차에 대해 알아 보기로 하겠다.

 

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

 

연재 순서

임베디드 리눅스 걸음마

교차 개발 환경을 구축하자

부트로더 설정은 이렇게

커널을 올려보자

루트 파일 시스템은 어떻게 구성되는가

2% 부족함을 채워보자

 

 

윈도가 설치된 PC 전원을 켜면 어떤 과정을 거쳐서 윈도가 실행되는 것일까. PC마다 다를 있겠지만 보통그림1 같은 화면이 보이고, 윈도 OS 구동돼 인터넷, 게임 PC 기능을 활용할 있게 된다.

 

 

 

 

단계는 하드웨어 검사, 하드웨어 초기화 등의 과정을 거쳐 시스템을 구동시켜 주고, OS 실행시키는 역할을 수행한다. 이를 부트로더(Boot Loader)라고 한다(PC에서는 BIOS라는 용어를 많이 사용). 임베디드 시스템에서도 마찬가지이다. 시스템을 처음 동작시키기 위해서는 시스템을 구동시켜 주는 부트로더가 필요하다. 시스템의 전원을 켜면 ROM이나 FLASH 또는 하드디스크와 같은 저장장치에 있는 부트로더가 가장 먼저 실행되고, 부트로더는 시스템을 구동시킨 운영체제를 메모리에 로딩해 운영체제가 동작할 있도록 만들어 준다.

이번호에서는 부트로더에 대한 기본적인 내용과, 타겟을 동작시키기 위한 절차에 대해 알아보기로 하겠다.

 

 

부트로더의 종류

부트로더는 기능이 간단하고 크기가 작은 프로그램이긴 하지만, 하드웨어 의존성이 강해 하드웨어의 구조를 이해해야만 작성할 있다. 그래서 보통은 보드 제작업체에서 하드웨어와 함께 탑재해 출시하는데, 간단한 구조이기 때문에 사용자가 직접 작성하기도 하고, 공개된 부트로더를 해당 보드에 맞게 고쳐서 사용하기도 한다. 공개된 부트로더를 이용하는 방식이 훨씬 만들기도 쉽고, 시리얼, 네트워크 등 여러 가지 기능을 이용할 있기 때문에 많이 사용되고 있다. 부트로더의 종류로는 U-boot, Blob, PMON, LILO, GRUB 등이 있고, 이중에서 임베디드 시스템에서 가장 많이 사용되는 것은 U-boot 이다. 타겟마다 사용되는 부트로더가 다르겠지만, 여기서는 가장 많이 사용되는 U-boot 기준으로 진행하기로 한다.

 

 

U-boot

U-boot Universal Boot Loader 약자로서 리눅스를 탑재하는 임베디드 시스템에서 가장 많이 사용되는 부트로더다. 다양한 시스템에서 사용 가능하고, 시리얼, 네트웍, USB, 플래시를 지원하는 등의 많은 기능을 가지고 있다. U-boot 역시 오픈 소스로서 아래 사이트에서 소스코드를 다운로드 할수 있다.

 

http://www.denx.de/wiki/UBoot

 

현재의 최신 버전은 1.3.0 버전이고, 안정 버전은 1.2.0 이다. 여기서는 1.2.0 버전을 기준으로 설명하기로 하겠다. 물론 어떤 버전을 사용해도 대동소이하다.

먼저 사이트에서 U-boot 최신 버전을 다운로드 한다. 지난호에서와 마찬가지로 oss 계정의

elinux 디렉토리에서 작업하기로 하겠다.

 

 

# cd elinux

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

# tar -xjf u-boot-1.2.0.tar.bz2

# cd u-boot-1.2.0

 

 

U-boot 디렉토리의 cpu 디렉토리를 보면 현재 uboot 에서 지원하는 CPU 종류를 있다.

1.2.0 버전은 다음과 같은 cpu 지원한다.

 

# ls cpu

74xx_7xx arm925t at32ap lh7a40x mpc5xx mpc8260 mpc8xx pxa

arm1136 arm926ejs bf533 mcf52x2 mpc5xxx mpc83xx nios s3c44b0

arm720t arm946es i386 microblaze mpc8220 mpc85xx nios2 sa1100

arm920t arm_intcm ixp mips mpc824x mpc86xx ppc4xx

 

 

다음으로 board 디렉토리를 보면 현재 U-boot에서 지원되는 보드의 종류를 있다. 200여개의 보드가 현재 지원되며, 계속 추가되고 있다.

 

# ls board

AtmarkTechno cradle gw8260 mp2usb pm828 spc1920

BuS cray hermes mpc8260ads pm854 spd8xx

c2mon evb4510 lart o2dnt sbc8260 wepep250

canmb evb64260 logodl omap1510inn sbc8560 westel

cds exbitgen lpd7a40x omap1610inn sc520_cdp xaeniax

cerf250 ezkit533 lubbock omap2420h4 sc520_spunk xilinx

cm4008 fads lwmon omap5912osk scb9328 xm250

cm41xx flagadm m5271evb omap730p2 shannon xpedite1k

cmc_pu2 funkwerk m5272c3 oxc siemens xsengine

cmi g2000 m5282evb pb1x00 sixnet zpc1900

cobra5272 gcplus mbx8xx pcippc2 sl8245 zylonite

cogent gen860t mcc200 pcs440ep smdk2400

cpc45 genietv ml2 pleb2 smdk2410

cpu86 gth modnet50 pm520 snmc

cpu87 gth2 mousse pm826 sorcery

 

 

U-boot에서 지원되는 보드의 종류가 점차 추가되고 있기는 하지만, 물론 현존하는

모든 보드에 대해 지원하지는 않기 때문에 필요한 경우 해당타깃에 맞도록 소스코드를

수정할 필요가 생기기도 한다.

 

U-boot에서 지원되는 보드의 종류가 점차 추가되고 있기는 하지만, 물론 현존하는 모든 보드에 대해지원하지는 않기 때문에 필요한 경우 해당 타깃에 맞도록 소스코드를 수정할 필요가 생기기도 한다.

지난호에서 예를 들었던 SMDK2440 보드도 역시 지원되지 않는다. 이러한 경우 소스코드를

SMDK2440 보드에 맞게 직접 수정하여 사용하거나 인터넷에서 패치 파일을 구해서 사용할 있다.

 

그럼 U-boot 빌드 방법에 대해 알아보기로 하자.

먼저 툴체인을 설정한다. 여기서는 지난호에서 빌드한 ARM 툴체인을 사용하기로 한다.

U-boot디렉토리의 Makefile 파일에서 CROSS_COMPILE 항목에 사용하려는 툴체인의 prefix 지정해주면 된다.

 

# vi Makefile

ifeq ($(ARCH),arm)

CROSS_COMPILE = arm-linuxendif

 

위와 같이 CPU별로 디폴트로arm-linux-라는 prefix 설정되어 있는데 지난호에서 만든 툴체인의 prefix 동일하므로 수정 없이 그대로 사용하면 되고, 만일 다른 툴체인을 사용하게 된다면 해당툴체인의 prefix 수정해 주면 된다.

다음으로 환경 설정을 한다. 사용하려는 보드의 CPU 보드 종류를 지정해주는 것으로 환경 설정이 완료된다. make [보드이름]_config 같이 설정하면 된다. 이때 사용 가능한 보드 이름은 board 디렉토리나 uboot 디렉토리의 Makefile 참고하면 된다. 예를 들어, omap5912osk 이라는 보드의 환경 설정은 다음과 같다.

 

# make omap5912osk_config

 

환경 설정이 완료됐으면 make 명령으로 빌드하면 된다.

 

# make

 

빌드가 성공적으로 완료되면 u-boot.bin 이라는 이미지 파일이 생성된다. 타겟에 탑재되어 실행될 이미지다.

 

부트로더 탑재

부트로더는 타겟의 FLASH 같은 저장장치의 특정 영역에 위치해 있고, 전원을 켜게 되면 부트로더이미지가 RAM으로 복사되어 부팅이 진행된다. 이를 새로 탑재하려는 경우 호스트로부터 부트로더 이미지를 다운로드해 FLASH 저장하면 된다. 이를 퓨징(Fusing)이라고 한다.

 

 

보통의 경우, 타겟 보드(임베디드 시스템)에는 부트로더가 제품 구입 시부터 내장되어 있어서 보드의 전원을 켜게 되면 곧바로 보드를 동작시켜 수가 있다. 그리고 부트로더 상에서 리눅스 커널을 실행하게 된다. 만일 부트로더가 적재되어 있지 않거나 실수로 망가트렸다면, 보드를 실행할 없게 된다.

경우 다른 장비의 도움을 받아 부트로더를 다시 적재하는 작업을 해줘야 것이다.(리눅스 커널과 같은, 부트로더가 아닌 프로그램들은 부트로더를 이용해 다시 적재가 가능하다.)

부트로더나 리눅스 커널 관련 작업을 수행하다 보면 부트로더를 망가트리는 일이 잦기 때문에 부트로더를 적재하는 방법은 숙지하고 있어야 나중에 곤란한 상황을 겪지 않을 것이다. 다만, 개발 보드같은 경우는 부트로더를 적재하는 방법을 보드 제작 업체에서 제공해주기 때문에 크게 걱정할 일은 아니다.

 

타겟에 부트로더를 탑재하기 위해서는 보통 다음과 같은 방법을 사용한다.

 

리눅스에서 가장 보편적으로 이용되는 터미널 프로그램은 monicom이다. 윈도우에서의 하이퍼 터미널과 같은 프로그램이다. 이는 시리얼 포트를 통해 호스트와 타겟 통신을

수행함으로써 타겟의 모니터링역할을 수행한다.

 

 

1. JTAG 포트 이용

보통 개발용 보드에는 JTAG이라고 하는 포트가 부착되어 있다.

이는 하드웨어 제어 디버깅 용도로 사용되고, 시스템을 처음 구동시킬 부트로더 이미지를 타겟에 탑재하기 위한 용도로도 사용된다.

 

 

타겟의 JTAG 포트에 별도의 JTAG 장비를 이용하여 부트로더를 탑재하게 된다. JTAG 장비에는 Trace32, Multi-ICE, BDI2000 등이 있다. 이는 부트로더 퓨징, 하드웨어 디버깅 임베디드 시스템개발 유용하게 쓰인다.

그러나 수십~수백만 원을 호가하는 고가의 장비들이기 때문에 장비가 이미 갖춰진 환경이라면 문제가 없겠지만, 단지 부트로더 퓨징만을 위한 목적이라면 JTAG 동글(dongle) 같은 원대 저가의 도구를 활용할 수도 있다. 물론 이들 도구 역시 간단한 디버깅 기능을 제공한다.

JTAG 포트는 디버깅을 위한 목적으로 주로 사용되므로, 타겟 보드의 개발 당시에만 장착을 하고, 제품을 출시할 때는 제거하는 경우가 많다.

 

2. 기존에 탑재된 부트로더를 이용

이미 부트로더가 탑재된 시스템이라면 이를 이용하여 부팅이 가능할 것이다. 그러면 부트로더 자체에서 제공하는 기능을 이용하여 새로운 부트로더를 퓨징하는 것이 가능해 진다.

방법은 부트로더가 탑재돼 있고, 정상적으로 동작해야만 가능한 것으로, 개발 과정에서 부트로더에 문제가 생긴 경우에는 사용할 수가 없게 된다. 이러한 경우 위에서 설명한 JTAG 이용한 부트로더 적재 방법을 이용해야 것이다.

 

 

타겟 구동

부트로더가 적재 됐다면 보드의 전원을 켜서 동작을 확인해 차례이다. 보통 시리얼 케이블을 호스트에 연결하여 호스트의 터미널 프로그램을 이용하여 동작을 확인하게 된다. 리눅스에서 가장 보편적으로 이용되는 터미널 프로그램은 minicom이다. 윈도우에서의 하이퍼 터미널과 같은 프로그램이다.

이는 시리얼 포트를 통해 호스트와 타겟 통신을 수행함으로써 타겟의 모니터링 역할을 수행한다.

 

# minicom

실행 방법은 다음과 같다.

minicom 처음 실행했다면 먼저 환경 설정을 해줘야 한다.

CTRL + A 키를 누르고 O 누르면 환경 설정 메뉴가 나타나고, 여기에서Serial Port Setup 선택한다. (CTRL+A 누른 상태가 아니라 눌렀다 , O 누른다.) 참고로 minicom 종료하는 방법은 CTRL + A 누른후 X 누르면 된다.

 

 

 

그림을 참조하여 다음 항목을 셋팅한다.

 

 

* Serial Device: /dev/ttyS0

* Baud Rate : 115200

* Parity : 8-N-1

* Hardware Flow Control : No

* Software Flow Control : No

 

 

호스트의 시리얼 COM1 포트에 타겟을 연결한 경우 /dev/ttyS0 이고, COM2 라면 /dev/ttyS1 지정해 주면 되고, 통신 속도 등을 설정하면 된다.

설정 완료후Save setup as dfl 변경사항을 저장한 Exit 환경설정 메뉴를 종료한다. 부트로더가 제대로 적재되었고, 시리얼 케이블 연결 minicom 환경설정이 제대로 되어 있다면 다음 그림과 같이 부트로더가 실행됨을 확인할 있을 것이다. 실행이 되면 프롬프트가 뜨고 여기서 명령어를 입력하여 리눅스 커널 이미지 다운로드, 실행 등의 작업을 있게 된다.

 

 

 

이상으로 부트로더를 타겟에 올리는데 필요한 사항에 대해 알아보았고, U-boot minicom 간단한 사용방법에 대해 알아보았다.

이번호에서는 타겟에서 부트로더를 실행하는 과정까지를 다뤘는데, 부트로더에서 리눅스 커널을 다운로드 받아 실행하는 필요한 설정 방법에 대해서는 다음호 리눅스 커널 시간에 함께 다루기로 하겠다.

 

 

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

 


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


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

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