· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
u Clinux

uClinux 시작하기

저자 : David McCullough Mdavidm@snapgear.com
번역 : 김남형 Mpastime@ece.uos.ac.kr


리눅스와 함께 임베디드 영역이 발전해 감에따라 더욱더 많은 사람들이 리눅스에 대한 실험과 임베디드 리눅스가 그들의 응용 프로그램에 얼마나 적합한지를 조사하고 있다. 불행하게도 이러한 조사들은 보통 그러한 응용 프로그램이 돌아가기 위한 타겟 하드웨어와 비슷한 플랫폼에서 돌아가는 리눅스를 얻기 위해 많은 시간적인 투자가 필요하다. 보통 이러한 시간적인 투자는 사람들이 다양한 리눅스 옵션들을 살펴보는 것을 어렵게 한다. 더구나 uClinux 가 사용될 만한 깊은 임베디드 영역에서는 더욱 그러할 것이다. 이 문서에서는 uClinux 운영체제를 돌릴 수 있는 소프트웨어 적인 옵션 (에뮬레이터) 에 대해 살펴볼 것이다. uClinux 는 가상 메모리나 MMU (메모리 관리 유닛) 이 없는 환경에서 동작하는 리눅스 버전이며 일반적으로 아주 작은 양의 메모리와 기억 공간을 가지는 깊은 임베디드 시스템을 타겟으로 한다.

1. 왜 uClinux 를 돌리기 위해 에뮬레이터를 사용하는가?

여기서 논의하는 에뮬레이터에 대하여 중요한 사항 중의 하나는 그것들이 무료라는 것이다. 이러한 특성은 사람들이 몇 번의 다운로드 만으로 uClinux 를 시작하고 평가할 수 있게 하며, 다음 번 프로젝트에서 리눅스를 사용하도록 추천하기 전에 사용자가 툴과 환경에 친숙해 질 수 있도록 해준다. There is nothing worse than finding out the development tools are not up to scratch some time after committing to a delivery date.

가능하다면, 원하는 타겟 CPU 와 가장 비슷한 에뮬레이터를 선택해야 한다. 이것은 개발 툴을 테스트 하는 이점과 메모리와 플래시 ROM 이 요구하는 하드웨어 적인 정보를 얻을 수 있는 이점을 준다. 특정한 환경에서는 실제 하드웨어를 통해 개발하기 전에 에뮬레이터를 이용하여 개발을 시작할 수도 있다. TSIM 에뮬레이터를 사용하여 대부분의 uClinux 작업을 수행한 [http]Leox 프로젝트는 그 좋은 예이다.

에뮬레이터의 가상 환경에서는 디버깅도 역시 훨씬 간편해진다. 실제 하드웨어에서는 접근 불가능한 디버깅 정보를 접근하도록 CPU 를 완전히 제어하는 일도 가능하다. 에뮬레이터는 편리하게 메모리 접근이나 코드 실행 과정을 추적할 수 있으므로 소프트웨어나 운영체제의 숨겨진 버그를 발견하도록 도와준다.

에뮬레이터는 개발자들이 여러가지 실행 성능에 대한 옵션과 사용자 편의성에 대한 노력을 실험해 볼 수 있게 해준다. 이러한 특성은 타겟 하드웨어의 성능 요구사항을 결정할 때 유용하게 사용된다. 또한 에뮬레이터는 메모리와 플래시 요구사항을 결정하는 것을 도와준다. 이러한 모든 사항들은 초기 개발 과정에서 유용하게 사용된다.

2. 에뮬레이터를 선택하기 위한 원칙

에뮬레이터를 선택할 때 고려해야 할 사항들이 있다. 우선, 좋은 에뮬레이터는 사용하고자 하는 타겟 CPU 를 최대한 비슷하게 흉내내야 하며, 가능하다면 동일한 개발 툴을 이용할 수 있어야 한다. 이것은 에뮬레이터를 이용한 작업과 실제 작업과의 연관성을 크게 증대시켜 줄 것이다.

The closer an emulator is to the target hardware the better. 이것은 타겟 하드웨어에서 발견되는 직렬 포트, 타이머 등과 같은 다른 장치들을 흉내내는 것을 의미한다.

디버깅 옵션도 고려되어야 한다. 완전한 소스 레벨의 디버거는 새로운 운영체제를 배우는 동안에 시스템 시작 순서를 이해하는 중요한 부분이 된다. 이 과정에서 얻은 지식들은 실제 하드웨어를 이용하여 개발할 때 디버깅 기술로서 사용될 수 있다. 완전한 소스 레벨의 디버깅 옵션을 이용할 수 없는 경우에는 인스트럭션/주소 추적이 유용하게 사용되며 만약 다른 어떤 것도 이용할 수 없다면 일반적으로 이 기능이 에뮬레이터에 추가될 수 있다.

uClinux 를 돌릴 수 있는 에뮬레이터의 가장 큰 단점 중의 하나는 실제 네트워크 장비에 대한 에뮬레이션이 빠져있다는 것이다. 비록 흉내낸 직렬 포트에 PPP 난 SLIP 을 이용하여 네트워크를 이용할 수는 있지만 네트워크 장비에 대한 에뮬레이션을 가지는 것이 보다 좋을 것이다. 일반적으로 사용되는 임베디드 네트워크 장비에 대한 에뮬레이션은 흥미로운 주제이며 오직 이를 구현할 시간을 가진 사람을 필요로 한다.

3. 어떠한 것들을 선택할 수 있는가

인터넷을 통해 에뮬레이터를 검색한다면 엄청난 양의 목록을 찾을 수 있을 것이다. 여기서는 수많은 가능성 중에서 오직 두가지에 대해서만 좀더 자세히 논의하도록 한다. 이 에뮬레이터들은 이미 uClinux에서 잘 지원되고 있으며 타겟 CPU 의 임베디드 옵션에 대해 좋은 coverage를 제공한다.

첫번째 에뮬레이터는 Xcopilot으로, 최초의 uClinux 버전을 만들게 해 준 에뮬레이터이다. Xcopilot은 Unix/X11 상에서 돌아가는 PalmPilot 에뮬레이터이다. Xcopilot은 모토롤라 68000 (m68k) 에뮬레이션과 그에 대한 타이머, 직렬 포트, 터치 패드, LCD 화면에 대한 에뮬레이션을 제공한다.

두번째 에뮬레이터는 GNU 디버거(gdb)의 일부분인 ARMulator이다. 현재 ARMulator는 빅엔디안, 리틀엔디안, Thumb (16비트 코드) 에뮬레이션을 포함한 많은 ARM 에뮬레이션과 시리얼 콘솔을 제공한다.

4. Xcopilot 얻기

Xcopilot은 여러 곳에서 얻을 수 있다. uClinux에서 사용되는 Xcopilot의 가장 최신 소스는 [http]cvs.uclinux.org에 있는 버전이다.

cvs -d:pserver:anonymous@cvs.uclinux.org:/var/cvs login


패스워드 묻는 부분에서 그냥 엔터를 치고 다음을 실행한다.

cvs -d:pserver:anonymous@cvs.uclinux.org:/var/cvs checkout xcopilot


혹은 아래의 싸이트에서도 최신 버전을 다운받을 수 있다:

Xcopilot을 컴파일하는 것은 간단하다:

./configure
make
make install


올바른 라이브러리가 제공되었다면 실행 준비된 Xcopilot을 얻을 수 있다.

Xcopilot을 위한 uClinux 커널과 실행 파일들을 빌드하기 위해 m68k-elf-tools 가 필요하다. 이들은 다음 싸이트에서 얻을 수 있다:

미리 컴파일된 이진 파일을 설치하거나 소스로 부터 툴을 빌드할 사용자들은 제공된 문서를 참조하기 바란다.

5. GDB/ARMulator 얻기

uClinux에서 사용되는 GDB/ARMulator는 다음 싸이트에서 얻을 수 있다:

이 페이지에는 uClinux와 ARMulator에서 사용되는 gdb를 빌드하기 위해 필요한 모든 정보가 포함되어 있다. 심지어는 ARMulator 상에서 실행되는 미리 컴파일된 uClinux 이진 파일도 얻을 수 있다.

GDB/ARMulator를 위한 uClinux 커널과 실행 파일들을 빌드하기 위해 arm-elf-tools 가 필요하다. 이들은 다음 싸이트에서 얻을 수 있다:

마찬가지로, 미리 컴파일된 이진 파일을 설치하거나 소스로 부터 툴을 빌드할 사용자들은 제공된 문서를 참조하기 바란다.

6. uClinux 소스 얻기/빌드하기

uClinux 소스로 부터 시작하는 제일 간단한 방법은 다음 사이트에서 배포하는 완전한 uClinux 소스를 얻는 것이다:

이것은 커널 버전 2.0.39와 2.4.17을 둘다 포함하며 uClinux로 포팅된 선별된 응용 프로그램을 포함하는 꽤 큰 파일이다. 또한 미리 설정된 설정 파일을 제공함으로 설정 메뉴에서 Xcopilot과 GDB/ARMulator를 선택할 수 있다.

각각의 에뮬레이터에 대한 빌드 메카니즘은 기본적으로 동일하며, 단지 선택한 타겟만이 다를 뿐이다.

먼저 uClinux-dist 타르볼의 압축을 푼다:

gunzip < uClinux-dist-20020701.tar.gz | tar xzf  -
cd uClinux-dist
make xconfig


Target Platform Selection 을 선택하고, 타겟을 선택한다. Xcopilot 타겟이라면 3com/Xcopilot 을, ARMulator 타겟을 원한다면 GDB/ARMulator 를 선택한다. 원하는 커널 버전을 선택하고 C 라이브러리로 이용할 uC-lib 를 선택한다. 그리고는 저장하고 종료하면 된다. 다음은 Xcopilot에 대한 Xconfig 설정의 예이다.

설정이 끝나면 소스 트리를 세팅한다:

make dep
make


이 과정이 끝나면, 선택된 에뮬레이터의 새로 빌드된 실행 이미지가 생성된다.

7. Xcopilot상에서 uClinux 실행하기

Xcopilot상에서 uClinux를 실행하기 위해서는 약간의 설정 작업이 필요하다. uClinux-dist 소스 트리의 루트 디렉토리에서 다음을 실행하라.

mkdir ~/.xcopilot
ln -s `pwd`/images/pilot.rom ~/.xcopilot


이제 Xcopilot이 실행할 준비가 되었다. 단순히 xcopilot 이라고 입력하면 Xcopilot이 실행되며 자동적으로 에뮬레이터상의 uClinux를 실행시킨다. 다음은 예상되는 스크린 샷을 보여준다:

터미널 윈도우 내의 시리얼 콘솔 상에서 명령을 입력할 수 있다. /dev, /bin, /etc 등의 파일 시스템을 살펴보자. 이것은 마치 매우 축소된 Linux/Unix 버전처럼 보일 것이다.

Xcopilot은 여러가지 디버깅 옵션을 가지고 있다. 가장 단순한 것은 내장된 기본 디버거이다. 다음 명령을 이용하여 디버거에 연결한다:

telnet localhost 2000


여기에서 help 를 입력하여 이용가능한 디버거의 명령들을 볼 수 있다. 옵션에는 CPU를 시작/종료 시키거나 실행 추적과정을 파일에 기록하는 옵션등이 포함되어 있다. 명령어 추적은 오직 jump, branch, call 과 같이 비정상적으로 program counter 값을 바꾸는 경우에만 추적하도록 간략화되어 있다.

8. GDB/ARMulator 상에서 uClinux 실행하기

uClinux-dist 소스 트리의 루트 디렉토리에서 다음을 실행하라.

ln -s images/romfs.img boot.rom


이제 적절한 커널에 대해 arm-elf-gdb를 실행한다. 다음은 그 예제이다:

arm-elf-gdb -n linux-2.*.x/linux
GNU gdb 5.0
Copyright 2000 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "--host=i686-pc-linux-gnu --target=arm-elf"...
(gdb) target sim
Loaded ROM boot.rom
Loaded ROM boot.rom
Loaded ROM boot.rom
Loaded ROM boot.rom
Connected to the simulator.
(gdb) load
Loading section .text, size 0x77b84 vma 0x2000000
Loading section .rodata, size 0x8ddb vma 0x2077b84
Loading section .data, size 0x8fc8 vma 0x2080a60
Start address 0x2000000
Transfer rate: 4507960 bits in <1 sec.
(gdb) run


uClinux는 이제 쉘 프롬프트까지의 부팅 절차를 따라갈 것이다. 아무 곳에서나 ^C 를 입력하여 디버거를 중지하고, breakpoint를 설정하거나 메모리와 변수 값 등을 조사해 볼 수 있다. 커널의 초기 부트 절차를 따라가며 (step) 조사해 보고 싶다면 start_kernel 함수에 breakpoint를 설정한다. 예를 들면:

...
(gdb) break start_kernel
(gdb) run

9. 요약

에뮬레이터가 실제 하드웨어를 대체할 수는 없지만, 개발 과정에서 중요한 역할을 할 수 있다. 에뮬레이터는 교육이나 실험 과정에서 유용하게 사용되며, 또한 새로운 운영체제의 기능을 개발하고 디버깅하는데에도 도움을 준다.

여기에서 언급한 에뮬레이터들은 사용자가 uClinux와 그 응용 프로그램을 깊이 이해할 수 있도록 해준다. 그저 학습과정에서만 사용될 수 있는 것이 아니라 실제 장비를 구축할 때도 실제적인 기초를 제공한다.

에뮬레이터는 개발자들이 사용하는 도구들의 중요한 부분으로 즉각적인 필요에 따라 어느 때나 호출될 수 있다.

10. 다른 에뮬레이터들

다양한 수준으로 uClinux를 실행할 수 있는 많은 다른 에뮬레이터들이 존재한다.

[http]LEON Sparc Emulator (TSIM)
uClinux-dist 소스 상에서 많은 지원이 포함되어 있다.
[http]NEC v850e
꽤 지원이 잘 되는 에뮬레이터 중의 하나이다. gdb 기반의 시뮬레이터는 사용하기 쉽고 uClinux-dist 소스에서 지원된다.
[http]ColdFire Emulator
uClinux-dist 상에서 Arnewsh/5206 이미지를 실행할 수 있다.
[http]SWARM (Software ARM)
이 에뮬레이터에 대한 기본적인 지원은 uClinux-dist에 포함되어 있다.



ID
Password
Join
You will be imprisoned for contributing your time and skill to a bank robbery.


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2006-09-27 13:27:32
Processing time 0.0173 sec