무엇을 배워야 임베디드 리눅스 개발을 잘 할수 있을까
좁게 보면 임베디드 리눅스 개발자가 알아야 할 지식은 다음과 같습니다.
- 리눅스 디바이스 드라이버
- 리눅스 커널
- CPU 아키텍처
- SoC
조금 넓게 보면 다음 내용도 알면 좋습니다.
- 유저 공간 HAL(Hardware Adaption Layer) 코드 구현
- 빌드 스크립트 구현
- 테스트용 디바이스 드라이버 구현
- git 과 형상 관리
숙련된 임베디드 리눅스 개발자가 되려면 배워야 할 내용이 많습니다.
문제는 이런 내용을 쉽게 설명한 자료가 부족합니다. 고수 개발자들은 모두 바쁘며 다른 개발자를 위한 개발 문서를 작성하기도 벅찬 것이 현실입니다.
신입 임베디드 리눅스 개발자가 입사를 하면 어떤 과정으로 실무 능력을 키울까요? 체계적으로 리눅스 직무 교육을 받은 후 실전 개발에 투입 것이라 예상합니다.
하지만 현실은 이렇습니다.
험악하게 생긴 선배 개발자가 리눅스 보드 하나를 주고 하나도 이해할 수 없는 암호같은 소리를 하면서 무언가 하라고 지시합니다.
신입 개발자가 무슨 말인지 몰라 질문을 하면 선배 개발자는 기본자세가 안 돼 있다며 버럭 화를 냅니다. 드라이버 코드를 작성하고 컴파일을 하다 막히면 사막에 자동차 바퀴가 빠져 있듯 진척이 되지 않습니다. 결국 야근을 하게 됩니다. 보름 동안 야근을 반복하면서 헤매는 과정을 보는 선배 개발자는 ‘신입 개발자 신고식을 치른다.’라고 생각합니다. 또한 ‘야근을 했으니 실력이 업그레이드됐겠지.’라고 말하며 흐뭇한 미소를 짓습니다.
필자는 이런 방식으로 신입 개발자를 육성하는 태도는 ‘구시대적’라고 생각합니다. 체계적으로 임베디드 리눅스 개발자를 육성할 수 있는 인프라를 구축하는 것이 필요합니다.
1. 리눅스 디바이스 드라이버
디바이스 드라이버의 시나리오와 제어하는 하드웨어의 종류가 다양합니다. 하지만 다음 내용 정도는 알아야 합니다.
- 인터럽트 핸들러 함수와 인터럽트를 처리하는 방식
- 디바이스 파일로 open/read/write 연산 함수 등록하는 방법
- 디바이스 트리를 읽어 디바이스 속성을 저장하는 방식
개발에 투입되면 자신이 작성한 디바이스 드라이버 코드보다 다른 사람이 작성한 코드를 읽을 가능성이 높습니다. 따라서 디바이스 드라이버 코드를 빨리 읽고 이해하는 능력을 키우는 것도 중요합니다.
2. 리눅스 커널
또한 디바이스 드라이버 개발 과정은 코드를 입력해 드라이버를 구현하는데 그치지 않습니다. 인증 테스트 부서를 통해 드라이버 안정화 테스트 과정을 거칩니다. 이 과정에서 다양한 버그나 문제 증상이 리포트됩니다. 카메라 리눅스 디바이스의 경우 사진을 찍은 후 저장한 화면이 모두 검은색일 수도 있습니다. 또한 그래픽 디바이스의 경우 화면이 깨질 수 있습니다.
이 과정에서 만나는 다양한 버그를 수정해 문제를 해결하기 위해서 리눅스 커널을 잘 알아야 합니다.
3. CPU 아키텍쳐
리눅스 커널 코드를 조금 깊게 들여다보면 만날 수밖에 없는 것이 있습니다.
바로, 어셈블리 코드입니다.
리눅스 커널의 핵심 개념들은 대부분 어셈블리 코드로 구현돼 있습니다. 그 이유는 리눅스 커널 핵심 동작은 CPU와 연관된 부분이 많기 때문입니다. 예를 들면 다음과 같습니다.
- 컨텍스트 스위칭
- 익셉션 벡터
- 시스템 콜
- 시그널 핸들러
- 메모리 관리(MMU)
처음 리눅스를 접하는 분은 무리해서 CPU 세부 원리와 어셈블리 코드를 공부할 필요는 없습니다. 일단 리눅스 시스템과 커널 로그와 ftrace에 친숙해지는 것이 먼저입니다.
그런데 조금 더 리눅스 커널을 깊게 알려는 분들은 CPU 아키텍처에 대해 다음과 같은 내용을 알아야 합니다.
- 리눅스 커널 핵심 원리를 소스 코드로 익히고 싶을 때
- 리눅스 시스템 전체를 책임지는 Expert 레벨 개발자가 되고 싶을 때
- 성능이나 커널 크래시와 같은 문제를 해결해야 할 때
참고로, 추후 어셈블리 코드를 심층 분석합니다.
- 스케줄링
- 시스템 콜
- 시그널
- 인터럽트
4. Build Script와 git
- 빌드 스크립트 구현
- git 과 형상 관리
위에 언급된 내용은 중간 정도만 하면 됩니다. 대신 시간을 모두 쏟아 부을 필요는 없습니다. 임베디드 및 BSP 리눅스 개발자의 핵심은 디바이스 드라이버와 커널입니다. 하지만 위에서 말씀드린 기술에 신경을 안 쓰면 실전 개발에서 많은 걸림돌을 만나게 될 것입니다.
출처: Austin Kim 블로그
'JIRA : : Agile > : : Development Process' 카테고리의 다른 글
시스템 소프트웨어 개발 프로세스 (0) | 2024.05.01 |
---|