컴퓨터공부/Embedded

ARM 관련 임베디드 리눅스 공부

achivenKakao 2007. 3. 6. 07:35

제목 : ARM관련 임베디드 리눅스 공부에 대한....

고도리입니다.

제주 내려가서 한숨자다가...갑자기 무슨 바람이 불었는지, 함 정리해 보고 싶더군요.

임베디드 리눅스 공부에 대한 개인적인 생각을 예전에 썼던 글을 보면서
다시 정리했습니다.

정답도 없고, 정답일 수도 없지만, 제 개인적인 생각과, 어제(12일) 이제현님,
aesop site 후배들과 한잔 하면서 얘기했던 것 등을 썼습니다.

어차피 공부에는 왕도가 없고, 방향을 정하는 것은 개개인이 하는 것이지만
만일 임베디드 리눅스쪽에 재미를 붙여보고자 한다면(ARM쪽), 대략 이렇게
하는것이 어떨까 하고 써 본 것입니다.

그냥 참조 정도만 하면 될 듯 합니당...^^

넘 싸가지 없다고 답글 달지 마시기 바랍니다....소심남 상처받습니다....쩝

그리고, aesop site에 관련된 내용이 많습니다. 해서 대충 걸러서 읽어주시면
될 듯 합니다....ㅎㅎ
============================================

임베디드 리눅스 공부에 대해서

- 2006.09.30 집에서 자다 깬 후....^^, 고도리

예전에 썼던 자료를 가지고 다시 간단하게 써 볼까 합니다.

1. 임베디드 리눅스의 개요
이것에 대해서는 말이 많지만, 실제로 임베디드와 리눅스의 결합입니다.

해서 임베디드와 리눅스 둘 다 잘 써야 합니다.
부트로더 개발시는 firmware와 비슷하지만, 리눅스 커널로 진입하면 firmware지식도
지식이지만, 리눅스 디바이스 드라이버 환경에 익숙해 져야 하며, application개발은
PC에서 개발하는 것과 같의 같은 수준의 리눅스/유닉스 개발환경에 익숙해져야만
가능합니다.

나중에 상용화를 위한 패키징을 하게 되면 PC용 리눅스 패키지본(우부투나 페도라 코어)
만드는 것과 유사합니다.

결론적으로는 둘 다 잘해야하는 것이죠.

처음 시작하시는 분들의 경우

1> hw만 하시던 분
2> firmware만 하시던 분(micom쪽의 경우)
3> 리눅스에서 주로 세팅쪽으로 많이 하셨던 분(아니면 사용만 해 보셨던 분)
4> 리눅스/유닉스 상에서 프로그래밍을 하셨던 분

정도로 시작할때의 상황을 나눠볼 수 있을 듯 하네요.

개인적인 생각으로는 4>의 상태에서 hw쪽을 좀 아시는 분의 경우 가장 빠를거라고
봅니다만, 어차피 기술의 습득은 얼마나 투자하느냐등의 개인적인 편차가 크기 때문에
애매한 추측이고요.

임베디드 리눅스 공부를 시작하려면 이렇게 하는게 낫다고 생각합니다. 개인적인 얘기니
궂이 논쟁을 삼으시지는 말기 바랍니다.

Software쪽으로 설명하자면(제가 hw에는 먹통이라서요...^^)


redo:
0> 무조건 프로그래밍은 기본입니다. 특히 C에 대한 기본이 되어 있어야 합니다. assembly
도 잘하면 좋습니다(반드시는 아닌게...저도 잘 못해서리). C++은 선택입니다...^^

1> 리눅스 환경에 익숙해 질 것. 즉 세팅을 잘해야 합니다.

2> 네트워크에 대한 기본지식을 갖출 것(첫째와 비슷하지만, 리눅스 개발환경은 주로 네트워크임)

3> 리눅스 시스템 프로그래밍을 공부해 둘 것(결국 이것을 이용해서 application을 작성합니다)

4> 하드웨어 동작에 대한 기본을 공부할 것(제 경우는 학교때 주워들은 거랑 68000 책을 좀 읽었었습니다)

5> 타겟을 정합니다. 타겟 cpu뿐만이 아니라, 공부에 대한 목표를 정해야 합니다. 무엇을 할것인가?
어디까지 공부할 것인가? 하는 등등의 것들

6> 부트로더 소스등을 충분히 분석해 볼 것(부트로더 - ex> u-boot - 는 훌륭한 text가 됩니다)

7> 가장 중요한 factor로써 넘 성급하지 말것. 하루 아침에 임베디드 리눅스의 고수는 힘들 듯...^^

보통 질문들을 읽다보면, 7>째 항목에서 제일 걸리더군요. 단숨에 고수(북치는 사람?.......ㅎㅎ)가
되고 싶은 분들이 많은 듯 합니다.

제 경험상 이쪽 파트는 경험이 실력입니다. 아무리 머리 좋고 빨리 일을 하는 친구라도, 결국은
경험치 부족이 나타나면 힘들어 하더군요. 물론 천재레벨이면 저랑 틀리니....할 말 없음...


2. 개발환경

- 리눅스가 설치되어야 한다(개발용 호스트)

- 타겟보드(개발하고자 하는 보드)가 있어야 한다 (ex> aesop-2440 board)

- 호스트와 타겟보드간의 네트워크가 연결되어 잇어야 한다(필수는 아니지만 없으면 대략난감).

- 호스트 시스템에는 타겟보드 개발용 cross toolchain이 설치되어 있어야 한다.

- 타겟보드용 부트로더를 작성하던가 기존의 부트로더(ex>u-boot)를 수정해야한다.

- 타겟보드용 커널이 있어야 한다(다행히 2.6 커널서부터는 embedded커널이 포함되어서 편한면은 있음)

- 타겟보드용 root filesystem이 있어야 한다.


임베디드 리눅스를 개발하려면 위의 조건이 만족되어야 합니다.  마지막 3개는 실제로 직접 개발해야할
가능성이 높고요.

1번에서 설명했듯이 임베디드 리눅스 개발은 PC용 리눅스에서 이루어 집니다. 해서 리눅스는 잘 쓰는게
좋습니다. 덧붙여서 리눅스 네트워크에 익숙해져 있으면 좀 더 편합니다.


3. 공부해야하는 순서

1> 일단 C를 잘해야 합니다. 못할 경우는 ==> goto redo;(^^)

2> 타겟을 정해야하겠지요. 타겟에 따라 공부하는 방법, 양, 질 등등이 들려집니다.
(제 경우 리눅스는 x86으로 공부했고, 임베디드 리눅스는 삼성의 S3C2410으로 공부했습니다.
근래는 S3C2440과 MP2520F(aka. mmsp2)를 많이 썼습니다)

==> 여기서는 주로 S3C2440을 타겟으로 쓰는게 나을 듯 합니다. 제가 운영하는 프로젝트 사이트인
이솝 사이트(http://www.aesop-embedded.org)에서 메인으로 사용하는 CPU가 S3C2440이기 때문이기도
하고, 여러가지를 써 본 결과 공부/실무에 적용하기 가장 좋은 CPU로 생각이 되기 때문입니다.


3> ARM 기초

여기서부터 시작입니다.

주로 많이 공부해야하고 봐야할 자료라고 생각되는 것들을 나열해 봅니다.

- ARM7강좌
"김효준"님께서 쓰신걸로 알고 있습니다. 제가 알기론 이 강좌는 옛날에 하이텔 '디지털 동호회'에
올라왔던 강좌입니다. 깔끔하게 아래한글로 정리가 되어 있네요...
ARM코어랑 명령어쪽은 굉장히 친절하게 설명이 잘되어 있습니다.

위치:
http://kelp.or.kr/jsboard/read.php?table=pds&no=8&page=8

arm startup code볼 때 유용합니다.


- ARM architecture reference manual
ARM에 대해서 가장 잘 나온 책으로 알고 있습니다. ARM에 대해 깊은 곳 까지 보고 싶은 분들께
추천합니다.

실제로는 reference에 많이 가깝게 활용이 될 듯 합니다.

이 책의 내용과 비슷한 책 중 한글로도 번역이 된 책이 있다고 들었는데,
제가 본 책이 아닌데다(아마 비싸서 안 샀던 기억이...--;)제가 공부할때는 책으로 안 나왔었던 것 같네요.

"ARM System Developer's Guide 한국어판"라고 후배가 얘기하네용....^^


- S3C2440A CPU manual
http://www.aesop-embedded.org/doc/um_s3c2440a_rev10.pdf

ARM920T를 core로 사용하는 삼성의 application processor입니다. S3C2410의 특징을 거의
가지고 있으며, 여러가지 기능과 bug를 수정해서 추가한 프로세서입니다.

원래는 PDA나 핸폰용인데, 칩의 구성을 보면 범용으로 사용하기에도 아주 좋은 칩입니다.
S3C2410때부터 몇 년 써 본 결과로 임베디드 리눅스 공부하기에는 최고인 칩입니다.

물론, 특정용도로는 실무에서도 최고인 칩이고요.

메뉴얼이 한국사람이 보기에 아주 좋게 되어 있습니다. 영어지만요....

ps> 삼성에서는 왜 한글로 안 내놓는지 의문입니다. 엔지니어들 영어공부시킬려는지 뭔지
몰라도....ㅋㅋ


- U-Boot
Universal Bootloader의 약자로 현재 가장 널리쓰이고, 강력한 기능을 갖는 부트로더입니다.

현재 버젼이 1.1.4네요.

S3C2410과 S3C2400의 EV보드인 SMDK2410에 포팅이 되어 있습니다.
물론 S3C2440A에도 포팅된게 있습니다만 공식포팅은 아니고 aesop board용입니다.
(http://www.aesop-embedded.org/sw/u-boot-1.1.2-aesop2440.tar.gz)

u-boot는 armboot와 ppcboot가 다르게 발전하다가 합쳐진것입니다.
물론 두개다 구조는 비슷한걸로 알고 있습니다....개발자가 거의 같으니깐요...^^

ARM뿐만이 아니라, x86, ppc, mips 등등에도 많이 포팅되어 있습니다. 아마도 전 세계에
나온 evaluation board들에 포팅되어 있을 겁니다.

해서 이걸 공부하게 되면 ppc, mips, x86쪽의 부트로더도 같이 공부하신다고 생각하시면
됩니다. 물론 내부는 틀리지만 흐름이 비슷해서 한번 익힌다면 비슷하게 사용할 수 있을겁니다.

위치:
http://sourceforge.net/projects/u-boot


- 리눅스 커널/디바이스 드라이버 공부

현시점에서 제가 봤을때

로버트 러브의 "리눅스 커널 심층분석"(원제목: Linux kernel development)의 책이 가장 좋다고
생각합니다.

좀 어려운 내용이긴 하지만, 커널이 2.6으로 옮겨가면서 2.6 커널을 다룬 책 자체가 거의 없습니다.
유일한 책이라고 보셔도 될 듯 합니다.

역사적으로 전체적인 리눅스 커널에 대한 책은 The Linux Kernel(돌도끼 번역)입니다.

워낙 유명한 책이니 말할것도 없지만...여러가지를 잘 다뤄 놓았고, 실제로도 도움이 많이 되었습니다.
(ex> PCI)

위치:
http://doc.kldp.org/Translations//html/The_Linux_Kernel-KLDP/tlkindex.html

커널을 공부할 때 제일 좋은 것은 커널 소스와 커널 소스에 포함되어 있는 Documentation 디렉토리입니다.
커널 2.6으로 가면서 많은 부분이 바뀌었는데, 그것에 대해 제대로 언급되어 있는 문서가 드뭅니다.

커널 Documentation외에 참조할 문서는

LWN: Porting device drivers to the 2.6 kernel(http://lwn.net/Articles/driver-porting/)이 있습니다.

디바이스 드라이버의 경우는 2.6 커널 대상으로 가장 잘 나온 책은 역시 O'Reilly에서 나온
"Linux Device Drivers, Third Edition"이 되겠습니다만, 제 개인적인 생각으로는 넘 어려워 졌습니다.

실제 디바이스 드라이버를 만드는 방법을 설명하느라, 가상 디바이스 드라이버를 만드는 예제를 두었는데
그게 넘 난해하더군요(개인적인 생각입니다). 특정 타겟에 얽매이지 않게 쓰느라 그랬겠지만, 실제
적용하려면 난감할 수도 있겠다라는 생각이 들었습니다. 게다가 2.6 커널 디바이스 드라이버를 다뤄
놓느라, 더 난해해진 것도 있겠고요.

ps> 광고: 올해안에 aesop-2440a용 디바이스 드라이버 교재가 나올지도 모르니 기대하셔도 될 듯 하긴 합니다..
ㅎㅎㅎ


- 임베디드 리눅스 커널 분석
embedded linux kernel에 대한 분석 자료는 거의 없습니다. 게다가 2.4.x대의 자료이고(2.4.18 이전일 듯)
2.6 커널에 대해서는 자료 자체가 없습니다(몇가지 부분은 aesop에서 시도 중입니다...^^)

kelp의 권수호님 강좌와 남상규 님이 쓰신 "임베디드 시스템 엔지니어를 위한 리눅스 커널 분석"
두 개가 가장 좋다고 생각이 되네요. 기본적인 내용서부터 전체적인 윤곽을 볼 수 있는 자료가
남상규 님이 쓰신 자료고요, 상세하게 코드분석이 주가 된 자료가 권수호님 강좌입니다.


남상규님 강좌 위치:
http://doc.kldp.org/KoreanDoc//html/EmbeddedKernel-KLDP/


- Root filesystem 및 packaging자료

위치:
http://www.netmanias.com에 가면 development =>Microprocessor & Embedded OS => whitepaper 쪽의
김영남 님이 쓰신 "MPC860T 기반 IO860T보드에 리눅스(RT-Linux, RTAI) 포팅 "

이 부분에 대한 자료는 많다면 많다고 볼 수 있지만, 실제로는 그다지 좋은게 많지 않았던 기억이
납니다.

게다가 2.6 커널로가면서 패키징 부분도 바뀌었기 때문에(2.4 스타일도 적용이 가능합니다만
2.6 메카니즘을 쓰기 힘들게 되겠지요.....) 더더욱 자료가 없습니다.

위의 자료는 제가 예전에 PPC가지고 공부할 때 가장 인상깊게 보았던 자료입니다. 지금도 존재하는지
잘 모르겟지만, 제가 가지고 있으니 나중에 aesop site에 올려놓도록 하던가 하겠습니다.

ps> 생각해 보니, 예전에 소모임에서 강좌했던 동영상 자료가 있네요. 2.6 커널용으로 busybox
이용해서 패키징하는 방법에 대한 것으로요...^^, 제가 한 강좌지만 가끔가다 보면서 참고합니당....ㅎㅎ

=========================================================================================

그 외의 자료들....

임베디드 리눅스 개발환경 설치 및 howto들은 타겟별로 모두 틀립니다.
aesop-2440a 보드용의 문서들은 http://www.aesop-embedded.org/docu.html 에 보시면 있습니다.

기본적인 내용과 howto를 보실 수 있을테고요. 좀 더 자세한 파일들이나 DIY howto들은
http://forum.aesop-embedded.org 의 PDS, DIY data쪽에 있습니다.



=========================================================================
2006년 10월 13일 추가...

12일에 이제현님, 드라이버 책 작업하는 3인방(몰려다니면서 라면만 먹는다는...^^)등 모여서
여러가지 얘기를 했는데...

이제현님께서 아주 도움이 되는 얘기를 했습니다....

커널은 디바이스 드라이버정도에서 만족을 하고 커널 내부는 궂이 공부하지 않아도 되지 않겠느냐...
그 시간에 특정 application에 더 정진을 하면 더 낫지 않겠느냐...하는 얘기였습니다.

실무적인 입장에서 말씀하신건데, 학생이라면 좀 더 밑단까지 공부해도 되겠지만, 직장인들이라면
이제현님 말씀이 정답이라고 생각됩니다.


ps> 커널 내부에 대해서 공부하고 싶으신 분들은 로버트 러브의 책이 가장 좋을 듯 합니다만,
더 자세한 부분까지 공부하는 것은 학술적인 목적외엔 딱히 실무에서 적용되기는 힘들 듯 합니다.
개인적으로 커널 내부까지 막~~~ 공부하는 것은 비추입니당....ㅎㅎ