◈ 이 책에서 다루는 내용 ◈
◆ Buildroot와 Yocto 프로젝트를 이용해 임베디드 리눅스 시스템을 만든다.
◆ BitBake 빌드 오류를 해결하고 Yocto 개발 워크플로를 간소화한다.
◆ Mender나 balena를 이용해 IoT 장치를 안전하게 업데이트한다.
◆ 회로도를 읽고, 장치 트리를 수정하고, 브레이크아웃 보드를 납땜하고, 로직 분석기로 핀을 프로브해 주변 장치 추가를 프로토타이핑한다.
◆ 커널 장치 드라이버를 작성하지 않고도 하드웨어와 상호작용한다.
◆ 시스템을 BusyBox runit으로 관리되는 서비스로 나눈다.
◆ GDB를 이용해 장치를 원격으로 디버깅하고 perf, ftrace, eBPF, Callgrind 같은 도구를 이용해 시스템의 성능을 측정한다.
◈ 이 책의 대상 독자 ◈
임베디드 컴퓨팅과 리눅스에 관심이 있고 자신들의 지식을 해당 주제의 다양한 분야로 확장하려는 개발자들을 위한 책이다. 리눅스 명령줄(Linux command line)의 기초를 이해하는 독자들이 읽기 적합하며, 프로그래밍 예제에서는 C와 파이썬 언어에 대한 실무 지식이 있다고 가정하고 설명한다. 몇 개의 장은 임베디드 타깃 보드에 들어가는 하드웨어에 초점을 두므로, 하드웨어와 하드웨어 인터페이스에 익숙하면 분명히 해당 경우에 이점이 있을 것이다.
◈ 이 책의 구성 ◈
1장. ‘시작’에서는 임베디드 리눅스 생태계를 살펴보고, 프로젝트를 시작할 때 시스템 설계자가 어떤 선택을 할 수 있는지를 설명한다.
2장. ‘툴체인을 배우자’에서는 툴체인의 요소를 설명하고, 타깃 보드용으로 크로스 컴파일하기 위한 툴체인을 만드는 방법을 보여준다. 어디서 툴체인을 구할 수 있는지 살펴보고, 소스 코드로부터 빌드하는 방법을 자세히 설명한다.
3장. ‘부트로더에 대한 모든 것’에서는 리눅스 커널을 메모리로 로드하는 부트로더의 역할을 설명하고 U-Boot와 Bareboot를 예로 사용한다. 이어서 장치 트리도 설명한다. 장치 트리는 하드웨어의 자세한 내용을 부호화하는 수단으로, 거의 대부분의 임베디드 리눅스 시스템에 쓰인다.
4장. ‘커널 구성과 빌드’에서는 임베디드 시스템용 커널을 고르고 장치 내의 하드웨어를 위해 구성하는 방법에 대한 정보를 제공한다. 리눅스를 새로운 하드웨어에 이식하는 방법도 다룬다.
5장. ‘루트 파일시스템 만들기’에서는 루트 파일시스템 구성법에 대한 단계별 안내를 통해 임베디드 리눅스 구현의 사용자 공간 부분 뒤에 감춰진 아이디어를 소개한다.
6장. ‘빌드 시스템 선택하기’에서는 앞의 네 장에서 설명한 단계를 자동화하는 두 가지 임베디드 리눅스 빌드 시스템(Buildroot와 Yocto 프로젝트)을 다룬다.
7장. ‘Yocto를 이용한 개발’에서는 기존 BSP 레이어 위에 시스템 이미지를 빌드하고, Yocto 확장 SDK를 이용해 온보드 소프트웨어 패키지(onboard software package)를 빌드하고, 런타임 패키지 관리가 포함된 완전한 자신의 임베디드 리눅스 배포판을 작동시키는 방법을 보여
준다.
8장. ‘Yocto의 내부를 살펴보자’에서는 Yocto의 고유한 멀티 레이어 접근 방법에 대한 설명을 포함해, 빌드 워크플로와 아키텍처를 살펴본다. 또한 기초적인 BitBake 문법 및 의미를 실제 레시피recipe 파일에서 뽑아낸 예를 통해 자세히 살펴본다.
9장. ‘저장소 전략 수립’에서는 플래시 메모리를 관리함으로써 생기는, 플래시 칩과 임베디드 MMCeMMC 패키지 등의 문제를 알아본다. 각각에 따라 적용할 수 있는 파일시스템을 설명하고, 이미 배치돼 있는 장치의 펌웨어를 갱신하는 기법도 다룬다.
10장. ‘소프트웨어 업데이트’에서는 완전 관리형 OTAOver The Air를 포함해, 장치가 배치된 다음에 소프트웨어를 업데이트하는 다양한 방법을 검토한다. 논의되는 핵심 주제는 신뢰성과 보안이다.
11장. ‘장치 드라이버 인터페이스’에서는 커널 장치 드라이버가 하드웨어와 상호작용하는 방법을 간단한 드라이버의 작동 예제와 함께 설명한다. 또한 사용자 공간에서 장치 드라이버를 호출하는 다양한 방법도 설명한다.
12장. ‘브레이크아웃 보드를 이용한 프로토타이핑’에서는 미리 만들어진 비글본 블랙(BeagleBone Black)용 데비안 이미지와 주변 기기 브레이크아웃 보드peripheral breakout board를 이용해 하드웨어와 소프트웨어를 빠르게 프로토타이핑하는 방법을 보여준다. 데이터시트를 읽고, 보드의 전선을 연결하고, 장치 트리 바인딩을 멀티플렉스하고, SPI 시그널을 분석하는 방법을 배울 것이다.
13장. ‘시스템 구동: init 프로그램’에서는 나머지 시스템을 시작하는 첫 번째 사용자 공간 프로그램인 init에 대해 이야기한다. 다양한 부류의 임베디드 시스템에 적합한 세 가지 버전의 init 프로그램(비교적 간단한 BusyBox init에서 복잡한 systemd까지)을 설명한다.
14장. ‘BusyBox runit’에서는 Buildroot를 이용해 시스템을 systemd에서 제공하는 프로세스 감시와 로깅이 가능한 분리된 BusyBox runit 서비스로 나누는 방법을 보여준다.
15장. ‘전원 관리’에서는 동적 주파수/전압 제어, 더 깊은 유휴 상태 선택, 시스템 중단system suspend 등 전력 소비를 최소화하도록 리눅스를 튜닝하는 다양한 방법을 고려한다. 목표는 장치가 배터리를 이용해서 더 오래 실행되도록 하고 발열을 줄이는 것이다.
16장. ‘파이썬 패키징하기’에서는 파이썬 모듈을 함께 배포하기 위한 몇 가지 방법을 소개하고 각각의 방법이 적합한 상황을 설명한다. 여기서는 pip, 가상 환경, conda, 도커(Docker)를 다룬다.
17장. ‘프로세스와 스레드’에서는 애플리케이션 프로그래머의 관점에서 임베디드 시스템을 설명한다. 프로세스와 스레드, 프로세스 간 통신, 스케줄링 정책을 살펴본다.
18장. ‘메모리 관리’에서는 가상 메모리의 개념을 살펴보고 주소 공간을 메모리 매핑으로 나누는 방법을 소개한다. 또한 메모리 사용량을 정확히 측정하고 메모리 누수를 감지하는 방법도 설명한다.
19장. ‘GDB로 디버깅하기’에서는 GNU 디버거(GDB)를 디버그 에이전트와 함께 사용해 원격으로 타깃 장치에서 실행되는 애플리케이션을 디버깅하는 방법을 설명한다. 계속해서 이 모델을 확장해 커널 디버그 스텁과 KGDB를 활용해 커널 코드를 디버깅하는 방법도 보여준다.
20장. ‘프로파일링과 추적’에서는 시스템 성능을 측정하는 데 사용할 수 있는 기술을 설명한다. 전체 시스템 프로필에서 시작해 병목 현상으로 인해 성능이 저하되는 특정 영역으로 좁혀간다. 또한 애플리케이션에서 스레드 동기화와 메모리 할당의 정확성을 검사하는 도구인 Valgrind를 알아본다.
21장. ‘실시간 프로그래밍’에서는 커널 구성과 실시간 PREEMPT_RT 커널 패치 등을 비롯해 리눅스에서의 실시간 프로그래밍에 대해 자세히 설명하고, 실시간 대기 시간을 측정하는 도구들도 살펴본다. 커널 추적 도구인 Ftrace를 이용해 커널 지연 시간을 측정하고 다양한 커널 구성의 효과를 보여준다.
◈ 옮긴이의 말 ◈
2007년 안드로이드가 발표된 이후 리눅스 커널은 임베디드 장치에서, 어쩌면 PC를 포함한 모든 디지털 기기에서 가장 널리 쓰이는 운영체제 커널로 자리매김했다. 안드로이드 외에 삼성전자의 스마트 TV에 쓰이는 Tizen(https://www.tizen.org)과, 미국 팜 사가 개발한 후 HP를 거쳐 LG전자 스마트 TV에 탑재된 WebOS(http://webostv.developer.lge.com)도 리눅스에 기반을 두고 있다. 또한 자동차 업계에서도 리눅스를 이용한 범용 플랫폼을 만들고자 계속 노력 중이다.
이런 흐름 속에서 이 책의 2판에 이어 3판을 번역하게 돼 기쁘다. 이 책은 임베디드 리눅스를 이용해 장치를 만들 때 고려해야 할 하드웨어 관련 사항, 툴체인과 부트로더 선택, 커널 구성과 루트 파일시스템 생성, 빌드 시스템 선택, 플래시 메모리, 장치 드라이버, 시스템 부트 과정뿐 아니라 만들어진 임베디드 리눅스 플랫폼 위에서 프로그래밍할 때 고려해야 할 프로세스와 스레드, 메모리 관리, 디버깅, 프로파일링, 실시간 프로그래밍 관련 내용 등도 다룬다. 3판에서는 리눅스와 Yocto 프로젝트 버전을 비롯해 전체적으로 최신 내용을 반영해 업데이트되고 상세한 설명이 추가됐으며, 모던 빌드 시스템인 CMake와 파이썬 관련 내용이 추가됐다.
임베디드 리눅스 플랫폼을 만들고 그 위에서 프로그래밍하기 위한 전반적인 내용을 다루고 있으므로, 기존에 RTOS를 사용하다가 리눅스로 전환하려는 사람들에게 도움이 될 것이다. 빌드 시스템의 경우 요즘 리눅스에 기반을 둔 플랫폼과 애플리케이션들을 한꺼번에 빌드하도록 도와주는 Yocto 프로젝트가 많이 쓰이고 있는데, 이 역시 다루고 있으므로 유용하다. 또한 스레드에 대해서도 일반 스케줄링 정책과 실시간 스케줄링 정책을 구별해 설명하고 있어 그 차이를 이해하는 데 도움을 줄 것이다.
리눅스는 임베디드 시스템뿐만 아니라 전통적으로 유닉스가 주로 쓰이던 서버에도 널리 사용된다. 메모리 크기만 다를 뿐 기본적인 작동 방식은 같으므로, 리눅스에 익숙하면 임베디드 시스템에서 서버에 이르기까지 쉽게 적용해 사용할 수 있다는 뜻이다.
2판을 번역한 세 역자가 다시 힘을 모았다. 바쁜 와중에도 애써주신 두 분께 감사드리며, 좋은 기회를 주신 에이콘출판사 여러분께 다시 한 번 감사드린다.
내가 처음으로 임베디드 시스템 소프트웨어를 개발하던 때에 비해 개발 환경이 많이 좋아졌고 임베디드 시스템의 성능도 획기적으로 향상돼 응용할 수 있는 영역이 매우 넓어졌으므로, 이 책을 통해 많은 분이 흥미로운 임베디드 시스템 소프트웨어를 개발할 수 있게 되길 바란다.
- 김기주