본문 바로가기

[개발] 임베디드 OS 만들기 - 1. 환경구성


임베디드 직접 개발하기 프로젝트 중 소프트웨어 영역인 OS 개발하기를 시작한다.

다뤄질 내용은 '인사이트'에서 출판한 '도전! 임베디드 OS 만들기' 라는 도서를 따라간다.


우선 책의 내용은 주로 이지보드(EZ-X5)라는 개발보드를 이용하여 테스트하나

보드가 10만원이 넘기 때문에 QEMU 에뮬레이터를 이용하여 작업하는 내용도 다뤄준다.


하지만 책의 초판에 비해 이미 몇년이 흐르면서 바뀐 부분들이 있기 때문에

최신 버전에 맞게 직접 수행하고, 바뀐 부분이나 시행착오도 다뤄볼 예정이다.





그럼... START



환경을 갖추기에 앞서, 필요한 파일들이 있으므로 이를 먼저 다운받자.

책에 적혀있는 자료 링크는 이미 죽었고, 새롭게 아래 링크에서 자료를 배포하고 있다.


http://www.insightbook.co.kr/books/programming-insight/%EB%8F%84%EC%A0%84-%EC%9E%84%EB%B2%A0%EB%94%94%EB%93%9C-os-%EB%A7%8C%EB%93%A4%EA%B8%B0/%EC%86%8C%EC%8A%A4%EC%BD%94%EB%93%9C%EC%99%80-%EC%B0%B8%EA%B3%A0-%EC%9E%90%EB%A3%8C


필요한 파일이 있다면 위의 링크에서 다운받아 진행하면 된다.


이번에 다룰 내용은 간단한 환경구성으로,

크로스 컴파일과 qemu 그리고 에뮬레이팅 테스트까지 진행한다.




0. 전체적인 환경


필자는 우분투 12.04 32bit desktop 버전의 환경에서 작업했다.

64bit 이거나 혹은 32bit 에서 64bit 를 구동하려고 할 경우엔 

종종 문제가 생기는 듯 하니 다른 블로그를 참고하길 바란다.


arm-linux-gcc 는 책과 같은 3.3.2 버전을 사용했고

gcc 와 qemu 는 최신 버전으로 진행했다.


qemu와 gcc 를 책과 같은 버전으로 진행하려고 할 경우

최신 리눅스에서 기본적으로 지원이 안되기 때문에 여러가지 설정이 필요하다고 한다.

귀찮으므로 최신 버전으로 진행한다.


위와 같은 환경과 버전에서 여러번 해본 결과 문제 없이 깔끔하게 진행이 되었다.

본인만의 작업 환경이 있는게 아니라면 위와 비슷하게 구성하길 추천한다.



1. ARM 크로스 컴파일 환경


ARM 아키텍쳐에서 돌아갈 프로그램을 일반 PC에서 컴파일 하려면

크로스 컴파일이란 환경을 갖춰야 한다.


이 때 필요한 것이 arm-linux-gcc 이고 이는 도서 자료 링크에서 받을 수 있다.


arm-linux-gcc-3.3.2.tar.bz2 파일을 다운 받았으면, 

이를 우분투 내의 루트 폴더로 옮긴 후 루트 폴더에서 압축을 해제한다

($ tar xvf arm-linux-gcc-3.3.2.tar.bz2 )


기본적으로 압축을 해제하면, usr/local/arm 구조로 폴더가 생성되는데

루트 폴더에서 풀 경우 기존에 이미 있던 /usr/local/ 와 겹쳐지면서

/usr/local/arm/3.3.2 폴더와 파일들이 생성된다.


파일들이 제대로 생성됐는지 확인하고 넘어가자.

($ ls /usr/local/arm/3.3.2/ )


arm-linux-gcc 파일들이 정상적으로 생성 되었다면,

홈 디렉토리로 이동 후 ($ cd ~ ), 사용자 프로파일을 수정한다. ($ vi .profile )



파일의 맨 아랫줄에 아래 내용을 삽입한다.

PATH=/usr/local/arm/3.3.2/bin:/usr/local/arm/3.3.2/sbin:"${PATH}"


수정이 끝나면 이를 반영시켜준다.

($ source ~/.profile )


이후엔 정상적으로 반영되었는지 확인한다.

($ echo $PATH )


아래와 같이 나왔다면 크로스 컴파일 환경 구성은 갖춰졌다.

(/usr/local/arm/3.3.2 << 이 내용이 있어야 함)




※ Desktop 과 같은 몇몇 디렉토리에선 설정해준 경로가 적용되지 않으므로,

  홈 폴더 내에서 작업용 디렉토리를 생성한 후 그곳에서만 작업하길 권장합니다.



2. qemu 설치


다른 블로그를 보면 qemu 를 설치하기 위해 많은 오류를 보고 시행착오를 겪게 된다.

qemu 를 직접 소스를 다운 받은 후 컴파일 하는 과정에서 문제가 생기는 것이다.


그러므로 필자는 깔끔하게 apt-get 을 사용해서 설치했다.

($ sudo apt-get install qemu )


qemu 로 에뮬레이팅을 할 때, qemu-system-arm 이라는 툴을 사용하게 되는데

qemu 만 설치하면 이 명령어가 없다면서 qemu-system 을 설치하라고 한다. 해주자.

($ sudo apt-get install qemu-system)




3. qemu 테스트


qemu 설치가 완료되었으면, qemu 로 돌릴 보드 환경을 갖춰야 한다.

아쉽게도 책에서 사용하는 이지보드는 qemu 에서 기본적으로 제공이 안되고,

대신 같은 칩(pxa255)을 사용하는 gumstix 라는 보드로 진행한다.


gumstix 는 u-boot 라는 부트로더를 사용한다.

도서 자료 링크에서 gumstix_uboot.tgz 를 다운받자.


gumstix_uboot.tgz 파일을 적당한 폴더에서 압축을 해제하고, 폴더 내로 이동한다.

그리고 아래와 같이 차례대로 명령어를 입력한다.


$ make distclean

$ make gumstix_config

$ make all


distclean 명령이 수행되면 몇개의 파일들이 삭제되었다는 로그를 볼 수 있다.

make all 을 진행하면 수많은 오브젝트 파일이 생성되는 로그가 뜨면서

최종적으로 u-boot.bin 파일이 생성된다.


그리고 이 파일을 qemu 를 통해 실행하면 된다.

$ qemu-system-arm -M connex -pflash u-boot.bin -nographic


하지만 실행 결과는 처참하게 에러가 발생할 것이다.

(qemu : Error registering flash memory.)



구글에 검색해볼 경우 불친절하게(?) 해결방법만 나와있고 이유는 설명해주지 않는다.


우선 해결법은 있으니 따라하기라도 해보자.

아래와 dd 명령어를 이용해서 파일을 새로 만들어주고, 다시 실행해본다.

$ dd if=/dev/zero of=flash.bin bs=1k count=16k

$ dd if=u-boot.bin of=flash.bin bs=1k conv=notrunc

qemu-system-arm -M connex -pflash flash.bin -nographic



그럼 아래와 같이 gumstix의 u-boot 가 성공적으로 실행된다.




앞으로 사용되는 u-boot 및 추가 커널 내용들도, 이 방법을 통해 수정해줄 것이다.



여기까지 qemu 를 이용한 임베디드 OS 개발 환경 갖추기 과정이었다.




※ 마지막 단계에서 왜 책과 다르게 파일을 만들어줘야 하는지 정확한 이유는 모르겠다.

하지만 일단 책에서 수행하는 u-boot.bin 파일은 158kb에 불과하지만

새로 만들어준 flash.bin 파일은 정확히 16MB 이다.


아마 qemu 에서 flash memory 를 설정하기 위해서 파일이 16MB 를 만족해야 하는 것 같다.


그래서 dd 옵션의 if 로 처음에 준 /dev/zero 는 '0' 값을 채워넣기 위한 소스이고

이를 통해 bs=1k 와 count=16k 만큼의 크기를 생성한다. (1K * 16K = 16M)


이후에 flash.bin 파일에 u-boot.bin 파일을 덮어쓰는 형태로

크기를 유지하고 u-boot 내용을 집어넣는다.