임베디드 리눅스 학습/실습 방향관련 질문드립니다.

sheld2의 이미지

안녕하세요.

임베디드 리눅스를 해보려고 하는데요, 잘 아시는 분들께 몇가지 여쭤보려고합니다.

리눅스 경험은 많지않고요,
올해 초에 라즈베리파이4를 사서 시스템 프로그래밍관련 API 쭉 해보고,
Raspbian 기본 setting 으로 kernel compile, upgrade, 간단한 character device driver 정도 만들어보고 어떻게 돌아가는지 맛본 정도입니다.

제가 최종적으로 원하는 수준은
ARM SoC가 탑재된 보드를 딱 받았다고 했을 때, kernel 포팅, root file system 설치, C/C++ 개발이 가능하도록 개발환경을 구축하는 것 입니다. 쉬운일이 아니라는 것 잘 압니다.

[ARM으로 배우는 임베디드 리눅스시스템] 을 주 교재로 들여다보고있고,
실습을 라즈베리파이4로 하려고합니다.

해당 보드와 관련된 driver 들은 이미 다 구현되어 배포되는 kernel에 다 포함되어있기 때문에 그에 관한 작업은 하지 않아도 될 것으로 생각하고 아래의 4가지를 해보려고합니다.

1. Boot loader를 U-Boot로 변경 (현재 라즈베리파이는 GRUB을 사용중).
2. custom kernel build 및 포팅
3. 기본적인 root file system 설치 (initrd 이용)
4. C/C++ app 만들어보기

질문은,
1. 라즈베리파이4로 위 작업을 하는게 어느정도의 난이도가 될지?
2. [ARM으로 배우는 임베디드 리눅스시스템] 라는 교재가 위 작업에 얼마나 효과적인 도움을 줄 수 있을지?
더 좋은 교재 또는 자료가 있다면 어느것이 있을지?

입니다.

참고로 저는 반도체설비 개발을 하면서 firmware 개발(OS없음) + RTOS app. 개발을 10년 가까이했고,
firmware 개발을 하면서 MCU 에 대한 기본지식/경험, CAN, PCI bus 로 firmware image 를 내려받는 boot loader를 개발했었기 때문에 위 교재에서 설명하는 내용들이 대충 어떻게 흘러가는구나 정도는 이해하고 있는 상태입니다.

그리고, 관련해서 어디선가 one-point lesson 을 받으면 훨씬 수월하게 진행하고 감을 잡을 수 있을 것 같은데 제가 원하는 것을 해주는 교육기관은 별로 없는 것 같네요.

그럼 경험많으신 분들의 답변 및 조언 부탁드립니다.

AustinKim의 이미지

"ARM으로 배우는 임베디드 리눅스시스템" 책도 좋지만 아래 책도 같이 보시면 좋습니다.

임베디드 OS 개발 프로젝트
http://www.yes24.com/Product/Goods/84909414

한 가지 궁금한 점이 있습니다. 아래와 같이 말씀을 하셨는데요.
---
ARM SoC가 탑재된 보드를 딱 받았다고 했을 때, kernel 포팅, root file system 설치, C/C++ 개발이 가능하도록 개발환경을 구축하는 것 입니다.
---

보통 ARM SoC가 탑재된 보드를 전달받으면 기본으로 리눅스 커널, root file 시스템과 기본 유틸리티 코드나 이미지까지 SoC 벤더로부터 함께 공유받는 경우가 많습니다. 물론 다운로드나 개발 툴까지 같이 받기도 합니다. 아마 빌드 가이드 문서를 보시고 크로스 컴파일러를 설치하신 다음에 소스를 내려받으면 될 것 같은데요.

(개인블로그)
http://rousalome.egloos.com

sheld2의 이미지

안녕하세요! 커널전문가님이 답글을 달아주시니 영광이네요.
현재 캐나다에 거주중인데 조만간 일이 있어서, 한국에 들어가면 저술하신 책도 한번보고 돌아오는 길에 구매하려고 생각하고 있었어요.
마침 말씀하신 책의 저자분이 앞서쓰신 책 - [도전! 임베디드 OS만들기] 가 있는데, 리눅스를 모를 때 구입하고 대충훑어보던 것이라 이참에 한번 다시 쭉 봐야겠네요.

제가 생각했을 때, 제가 하고싶다고한 boot loader, kernel porting, root file system 구축 등의 작업이 임베디드 리눅스개발자가 도달할 수 있는 high level 역량이라고 생각한건데, 현업하시는 분들에게는 SoC 제조사에서 대부분 해주고 제공해주는 것으로 이해가 되네요.
사실 학습동기중의 하나가, 현재 캐나다에서 embedded software job을 구하고있는데 embedded linux 경험을 요구하는 곳이 많아요. 제 생각에 user space 에서 application 을 만들줄아는 것을 가지고 embedded linux 경험이라고 볼수없을 것 같아서, 그와 차별화된, 좀 더 전문적인 일을 하려면 무엇을 해야할까 생각해본 것이에요.
그런데 그런 경험을 요구하는 회사들이 SoC 제조사들이 아니라 SoC 를 사서 보드를 만들고 자신들만의 application 을 만드는 것이라고 한다면.. 그쪽에서 요구하는 embedded linux 경험이란 device driver 에 집중된 경험을 이야기하는 것일까요?
만약 device driver 쪽 경험을 요구하는 것이라면, boot roader 가 어떻게 돌아가는지, root file system 에 대해서는 잘 몰라도 되지 않을까요? OS에 관련된 여러 subsystem 들이 그래도 잘 분리되어있어서 그럴것이라고 생각하고 있습니다만..
뭐 그렇다고 하더라도, 궁극적으로 앞서말한 그런 것들을 방향으로 삼아서 시간을 가지고 공부를 해보려고해요.

AustinKim의 이미지

아, 해외에 진출하신 개발자님이시군요. 궁금해하시는 내용에 대해 저의 사견을 짧게 말씀드리면요.

> 그쪽에서 요구하는 embedded linux 경험이란 device driver 에 집중된 경험을 이야기하는 것일까요?

아마, 그럴 확률이 높아보입니다.

> 만약 device driver 쪽 경험을 요구하는 것이라면, boot roader 가 어떻게 돌아가는지, root file system 에 대해서는 잘 몰라도 되지 않을까요?

제가 생각하는, 실전 개발을 염두한 디바이스 드라이버 분야에 대한 기반 지식은 다음과 같습니다.

● 부트로더
; 그래픽 하드웨어, 메모리, 파일 시스템 관련 디바이스는 부트로더에서 초반 설정을 하는 경우가 많습니다.
; 임베디드 개발자라면 기본적인 부트로더의 구조와 부팅 과정을 대략이라도 알 필요가 있다고 생각합니다.
; 참고로 SoC 벤더별로 제공하는 부트로더는 각각 다른데요.
; 부트로더는 uboot나 LK(Little Kernel)이 대세이니 한 가지만 제대로 익혀두면 문제될 것 같지 않습니다.
; 부트로더의 구조는 대부분 비슷하거든요.

● 시스템 프로그래밍
; 디바이스 드라이버는 커널 디바이스 드라이버만 하드웨어를 제어할 수도 있지만,
; 유저 공간의 리눅스 저수준 함수들과 연동돼 동작하는 경우가 많습니다.
; 이를 보통 HAL(Hardware Adaptation Layer)라고 부르죠.
; 대부분 디바이스 드라이버는 캐릭터 타입 디바이스 드라이버를 기반으로 동작하므로, 리눅스 시스템 프로그래밍을 배우면 좋습니다.

● root file system
; 기본 동작 원리만 파악하면 될 것 같은데요.
; 부팅 도중에 root file system이 제대로 마운트가 안돼면 커널 크래시가 발생할 것입니다.
; 대부분 커널 컨피그나 설정 문제인데 이 부분만 체크하면 될 것 같습니다.

● 드라이버 설정
; 디바이스 드라이버의 초기 설정은 대부분 디바이스 트리와 커널 컨피그를 활용합니다.
; 특히, 디바이스 트리에 대해 잘 알고 있으면 디바이스 드라이버를 설정하는데 많은 도움이 될 것 같습니다.

추가로, 고수 디바이스 드라이버 개발자가 되려면 익혀야 되는 스킬에 조금 더 말씀드리면;

● 하드웨어 디버거
; 대부분 TRACE32나 하드웨어 디버깅을 잘하면 인정 받을 확률이 높습니다.
; 디버깅을 잘하면 문제의 원인을 빨리 분석하므로 일찍 퇴근할 수 있겠죠.

● ARM 프로세서
; 제가 만나 본 고수 개발자들은 ARM 프로세서를 정말 잘 알고 있습니다.
; 익셉션은 물론 코프로세서 관련된 내용을 잘 알고 있더군요.
; 많은 디바이스 드라이버에서 인터럽트를 활용해 하드웨어를 제어하는데,
; 깊게 코드를 파고 들어가면 ARM 프로세서와 관련된 코드를 만나게 됩니다.
; 또한 보안이나 하이퍼바이저와 관련된 드라이버의 경우도 ARM의 기반 지식 위에서 구동되는 경우가 많습니다.

● 리눅스 커널
; 디바이스 드라이버는 커널에서 제공하는 함수를 사용하므로, 리눅스 커널을 잘 알면 좋습니다.
; 고수 디바이스 드라이버 개발자 중에 리눅스 커널을 잘 모르는 분을 본 적이 없습니다.

짧은 사견이지만 참고하시면 좋을 것 같아 공유드립니다. 즐거운 하루되세요.

(개인블로그)
http://rousalome.egloos.com

sheld2의 이미지

역시 device driver 쪽에 무게를 둔다면 방향이 약간 달라질 수 있겠군요.
driver 는 kernel의 일부로 여겨지니까 말씀하신대로 kernel 쪽을 틈나는대로 보고 익혀야할 것 같고요.

종류별로 잘 정리해주셔서 도움이 많이 될 것 같습니다. 따로 저장해 놓고 봐야겠네요.
감사합니다. 좋은하루보내세요!

AustinKim의 이미지

제 답글이 도움이 됐다니 다행입니다.
혹시 추가로 임베디드 리눅스 개발에 대해 궁금한 점이 있으면 댓글을 달아주시거나, 제 메일로 문의 사항을 보내주시면 됩니다.

austindh.kim@gmail.com

감사합니다.

(개인블로그)
http://rousalome.egloos.com

Anti-Lock의 이미지

궁금한게 있습니다.

참고로 저는 반도체설비 개발을 하면서 firmware 개발(OS없음) + RTOS app. 개발을 10년 가까이했고, firmware 개발을 하면서 MCU 에 대한 기본지식/경험, CAN, PCI bus 로 firmware image 를 내려받는 boot loader를 개발했었기 때문에 위 교재에서 설명하는 내용들이 대충 어떻게 흘러가는구나 정도는 이해하고 있는 상태입니다.

이러한 커리어가 있으신데... 임베디드 리눅스쪽으로 잡을 구하시는 이유는 무엇인가요?
펌웨어 또는 RTOS 개발자의 대우나, 관련 분야의 전망이 임베디드 리눅스쪽과 비교했을때 좋지 못하다고 느끼시고 있는 중인가요?

sheld2의 이미지

안녕하세요. 본문과 위의 댓글들에서 말씀드렸듯이 저는 작년말에 캐나다로 이주하여 이쪽에서 정착할 계획을 가지고 있습니다.
현재 job을 구하고 있던 중이었는데 부득이한 사정으로 한국으로 돌아가 2달 정도 머물러야하기에 구직을 중단하고 시간이 허락되는 한 공부를 좀더하려고 하는 중인것이구요.

결론만 간단히 먼저 말씀드리면, 제가 느끼기에는 이곳에서 job 을 구하고 embedded 개발자로써 인정받는 커리어로 가려면 결국 리눅스를 잘 알아야합니다.
한국에서는 반도체설비에 특화된 것들을 개발했고 (Motion control PCI card 개발, VxWorks platform 에서의 motion sequence 개발)
반도체설비나 automation 을 하는 곳이 수도없이 많기 때문에 linux를 해본적이 없어도 domain 경험만 잘 이어가면 커리어를 잘 이어갈 수 있다고 생각해요.

그런데 캐나다에는 반도체설비를 개발하는 곳이 없습니다 (미국과 달리 제조업 기반이 매우 약합니다).
그나마 industrial automation 을 하는 곳이 있지만 대부분 PLC 기반이라서 저처럼 C/C++ base 경험이 대우받을 수 있는 곳이 매우 드물구요.
그래서 그나마 어쨌거나 유사한 "embedded" 를 하는 곳들을 찾아야하는데 대부분 embedded linux 기술을 요구합니다.
Linux에 focus 된 쪽 말고, bare-metal firmware (OS 없이 돌아가는 firmware, 주로 ARM Cortex-M3,4 계열로)를 하는 곳들도 있습니다.
이런 곳은 제가 지금 가진 기술로도 충분히 바로 일을 할 수 있지만, Linux base 로 일하는 embedded software 개발 업무 난이도에 비하면 진입장벽이 낮다고 생각해요.
진입장벽이 낮다는 말은, 좀 더 많은 사람들이 그런 수준의 일을 할 수있을 가능성이 높고, 따라서 제가 job 을 구하는 사람으로써 돋보이기가 어렵겠죠.
Pay 도 많이 받기도 어렵겠구요.

그래서 결국 장기적인 관점에서 embedded linux 쪽으로 해봐야겠다는 생각을 한 겁니다.

질문자님의 의도를 비추어 생각해봤을 때,
한국은 개발자로써 여러가지 옵션이 가능하다고 생각됩니다.

Firmware 나 RTOS를 잘해도 여러가지 길이 있을 수 있다고 생각되고요.
다만 개인적인 생각입니다만, Linux에 비해서 RTOS 는 micro kernel 도 많이 있어서
OS 자체에 대한 지식과 경험을 마스터 하는 것에 있어서는 Linux가 훨씬 어려울 것이라고 생각해요.
참고로 며칠전에 FreeRTOS를 한번 알아봐둘까 싶어서 자료를 찾아서 가지고있던 ST사의 보드에 porting 해보았는데 정말 쉽고 간단하더군요.
보드 타입이 약간 달라서 port가 정확히 맞는 것이 아니었는데 config 파일을 수정해서 쉽게 올려볼수있었어요.

위와 같이 말씀드렸듯이, RTOS는 상대적으로 쉽게 porting하고 결국 그 위에서 돌아가는 applicatoin 을 만드는 개발에 focus 될 수 밖에 없을텐데
RTOS전문가란 결국 어느정도 제품에 dependant 한, applicaton 전문가가 될수밖에 없지 않을까생각해요.
그런데 저와 같이 반도체설비를 위한 RTOS applicaton 을 주로 하다가,
이렇게 캐나다와 같이 다른 세상에 오게되면 경력을 살릴수없는 상황이 되는 것이죠.

그런데 제가 만약 Linux 를 잘했다면 조금 다를 것이라 생각해요.
Linux 는 하나의 기반기술로 간주할수있고, 깊게 잘하는 사람이 많지 않을 것이기에 캐나다에 왔어도 좀 더 다양한 옵션을 가질 수 있었을 것이라 생각하는 것이죠.

Anti-Lock의 이미지

지금의 펌웨어, RTOS 경력에서 임베디드 리눅스가 더해진다면 더 좋아질거라고 기대가 됩니다.
그리고 분명히 펌웨어, RTOS 분야 보다는 진입장벽이 높기 때문에 페이도 좋아질 수 있을거 같습니다.

그리구요.. 밑에... 제가 잘 모르는 부분이 많아 제생각을 이리저리 써보겠습니다...

리눅스보드를 설계제작하여,'리눅스보드 자체가 제품'으로 판매하는 회사가 아니라면,
(리눅스 보드 제작업체의 소프트웨어 엔지니어가 할 일은 부트로더,커널,파일시스템 등의
구축에 그치지 않고, 유저를 위해 그것을 공개하고 개선/관리 하는 일일거라 생각합니다)

리눅스보드를 기반으로 하는 애플리케이션을 판매하는 것일 텐데,
그러면 디바이스드라이버는 필요시에 한하여 만들고,
주요 업무는 리눅스 애플리케이션을 만드는 일이 되는것 아닐까요?

이때 만들어지는 디바이스드라이버는 애플리케이션 성능만 나와준다면,
"기능적 완벽함과 효율적 성능"에 그렇게 목매달지 않아도 될 것이구요.
커널 메인 소스트리에 올라가는 일은 거의 없을 것이구요.

물론 디바이스드라이버 개발은 진행되어야 겠지만,
디바이스드라이버 개발의 목적을 볼때,
애플리케이션에 필요하기 때문에 하는 것이라 볼 수 있을 겁니다.

결국 애플리케이션 개발이 주이기 때문에,
기존커널과 호환되는 주변장치가 있다면 굳이 새로운 칩을 도입할 이유가 없고
디바이스드라이버 개발 비중도 줄어들지 않을까 생각합니다.

회사의 업무 분야 또는 해당 부서의 업무 분야를 잘 봐야 할거 같다는 생각이 드네요.

한편 리눅스 제품으로서 머리속에 떠오르는건... IoT 가 제 머리속에 떠오르네요...
리눅스까지 올릴 필요가 없는 말단 센서...가 아니라면
성능좋은 게이트웨이? 장치에 리눅스를 올릴수 있을거 같습니다.
그런데 이부분은, 이제는 소프트웨어 엔지니어가 더 활약할 기회가 더 많지 않을까 생각해 봅니다.
성능좋은 보드를 만들고 리눅스를 포팅하고 SDK 까지 구축되면...
리눅스 엔지니어는 무엇을 더 할수 있을까요?

위에도 댓글 달아주신 AustinKim 님께서 쓰신 글을 읽은 기억이 있습니다.
캐나다는 한국과 다르기를 바래봅니다.
(저는 관련분야의 사람이 아닙니다. 그글이 얼마나 과장되었는지 아닌지는 모릅니다..)
https://kldp.org/node/161701

sheld2의 이미지

아마, linux 를 쓰더라도
H/W platform 은 큰 변화없이 가고 위에서 동작하는 application level 에서 계속 제품을 개선시키는 회사라면
linux 개발자가 계속해서 linux와 관련된 역량을 넓힐 수 있는 일은 많지 않을꺼라 생각되네요.

아마 software뿐 아니라 H/W 도 조금씩 다른 파생모델들을 많이 만드는 회사라면
또 여러 SoC 와 peripheral 들을 제어할 수 있도록 새로운 porting 작업, BSP를 update, device driver 개선 등을 늘 해야하니 linux 개발자가 상대적으로 많이 필요할 수 있지않을까하네요. 또 새로운 SoC를 support하는 보드에 손을대면 아무래도 최신 kernel을 다루면서 최신 trend를 따라갈 수 있지않을까싶고요.

반대의 경우로 H/W platform의 변화가 더딘대신 application으로 먹고사는 회사라면,
소수의 linux 전문가만 있고, 저와같이 linux 경험이 없는 embedded 개발자도 금방 일을 할수있지 않을까싶네요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.