
임베디드 리눅스 프로그래밍 완전정복 3/e - 에이콘 임베디드 시스템 프로그래밍 시리즈
프랭크바스케즈,크리스시먼즈
저자:프랭크바스케즈(FrankVasquez)
가전제품을전문으로하는독립소프트웨어컨설턴트로,임베디드리눅스시스템을설계하고구축한10년이상의경험을갖고있다.그기간동안랙마운트DSP오디오서버,잠수용수중음파탐지기캠코더,소비자IoT핫스팟을비롯한수많은장치를출하했으며,임베디드리눅스엔지니어가되기전에는IBM에서DB2데이터베이스커널개발자로일했다.현재실리콘밸리에살고있다.
저자:크리스시먼즈(ChrisSimmonds)
영국남부에거주하는소프트웨어컨설턴트이자트레이너로,근20년동안오픈소스임베디드시스템을설계하고구축해왔다.임베디드리눅스,리눅스장치드라이버,안드로이드플랫폼개발에대한전문교육및멘토링서비스를제공하는2netLtd의설립자이자수석컨설턴트이며ARM,퀄컴(Qualcomm),인텔(Intel),에릭슨(Ericsson),제너럴다이내믹스(GeneralDynamics)를비롯한임베디드업계의여러대기업에서엔지니어를교육했다.또한임베디드리눅스콘퍼런스와임베디드월드를비롯한여러오픈소스및임베디드관련콘퍼런스에서도다수의강연을진행하고있다.
역자:김기주
포스텍컴퓨터공학과와동대학원을졸업한뒤,지금은elastic.co에서에듀케이션아키텍트EducationArchitect로전세계에일래스틱서치(Elasticsearch)를알리고있다.공저로『SecurityPLUSforUNIX』(영진닷컴,2000),역서로에이콘출판사의『임베디드프로그래밍입문』(2006),『실시간UML제3판』(2008),『리눅스API의모든것』(2012),『(개정3판)리눅스실전가이드』(2014),『한눈에빠져드는셸스크립트2/e』(2018),『임베디드리눅스프로그래밍완전정복2/e』(2019),『페도라로실습하는리눅스시스템관리Vol.1』(2022)가있다.
역자:김병극
웹개발자로소프트웨어개발을시작했으며,피처폰의자바관련업무를맡았던것을계기로썬마이크로시스템즈와오라클에서자바VM개발업무를수행했다.현재는SCA도구인블랙덕(BlackDuck)의기술지원및오픈소스거버넌스,컴플라이언스컨설팅업무를맡고있으며,역서로는에이콘출판사의『한눈에빠져드는셸스크립트2/e』(2018),『임베디드리눅스프로그래밍완전정복2/e』(2019),『실습으로배우는하드웨어보안』(2020)이있다.
역자:송지연
지엔텔,노키아지멘스네트웍스에서근무한경험이있는WCDMA,LTE분야의통신기술엔지니어출신으로,취미로팀을만들어개발에한동안푹빠져있기도했다.현재는주전공인SW개발분야로돌아온후오라클개발팀을거쳐로쿠Roku에서PM으로근무중이며,역서로는『스프링핵심노트』(한빛미디어,2015)와에이콘출판사의『(개정3판)리눅스실전가이드』(2014),『한눈에빠져드는셸스크립트2/e』(2018),『임베디드리눅스프로그래밍완전정복2/e』(2019)등이있다.
1부.임베디드리눅스의요소
1장.시작
__리눅스선택하기
__리눅스를선택하지말아야할때
__참여단체들
__프로젝트생명주기
____임베디드리눅스의4요소
__오픈소스
__라이선스
__임베디드리눅스를위한하드웨어선택하기
__이책에서사용하는하드웨어
____라즈베리파이4
____비글본블랙
____QEMU
__개발환경
__요약
2장.툴체인을배우자
__기술적요구사항
__툴체인소개
____툴체인의종류
____CPU아키텍처
____C라이브러리고르기
__툴체인찾기
__crosstool-NG를이용해툴체인빌드하기
____crosstool-NG설치
____비글본블랙용툴체인빌드
____QEMU용툴체인빌드
__툴체인의구조
____크로스컴파일러를알아보자
____sysroot,라이브러리,헤더파일
____툴체인안의다른도구들
____C라이브러리의요소를살펴보자
__라이브러리와링크하기:정적링크와동적링크
____정적라이브러리
____공유라이브러리
__크로스컴파일기술
____단순makefile
____Autotools
____패키지구성
____크로스컴파일관련문제
____CMake
__요약
__추가자료
3장.부트로더에대한모든것
__기술적요구사항
__부트로더는무슨일을하는가?
__부트순서
____1단계:롬코드
____2단계:SPL
____3단계:TPL
__부트로더에서커널로이동
__장치트리소개
____장치트리기초
____reg프로퍼티
____레이블과인터럽트
____장치트리인클루드파일
____장치트리컴파일하기
__U-Boot
____U-Boot빌드하기
____U-Boot설치하기
____U-Boot사용하기
____리눅스부팅
____U-Boot를새로운보드에이식하기
____빌드와테스트
____팔콘모드
__요약
4장.커널구성과빌드
__기술적요구사항
__커널은무엇을하는가?
__커널선택하기
____커널개발주기
____안정적장기지원릴리스
__커널빌드하기
____소스구하기
____커널구성이해하기:Kconfig
____LOCALVERSION을이용해커널식별하기
____언제커널모듈을사용하는가?
__컴파일하기:Kbuild
____어떤커널이미지를컴파일할지알아내기
____빌드아티팩트
____장치트리컴파일하기
____모듈컴파일하기
____커널소스청소하기
____라즈베리파이4용64비트커널빌드하기
____비글본블랙용커널빌드하기
____QEMU용커널빌드하기
__커널부팅하기
____라즈베리파이4부팅하기
____비글본블랙부팅하기
____QEMU부팅하기
____커널패닉
____초기사용자공간
____커널메시지
____커널명령줄
__리눅스를새보드에이식하기
____새로운장치트리
____보드의compatible프로퍼티설정하기
__요약
__추가자료
5장.루트파일시스템만들기
__기술적요구사항
__루트파일시스템에는무엇이있어야하는가?
____디렉터리레이아웃
____스테이징디렉터리
____POSIX파일접근권한
____스테이징디렉터리의파일소유권과권한
____루트파일시스템용프로그램
____루트파일시스템용라이브러리
____장치노드
____proc과sysfs파일시스템
____커널모듈
__루트파일시스템을타깃으로전송하기
__부트initramfs만들기
____단독형initramfs
____initramfs부팅하기
____QEMU로부팅하기
____비글본블랙부팅하기
____initramfs를커널이미지에넣기
____장치테이블을이용해initramfs빌드하기
____오래된initrd형식
__init프로그램
____데몬프로세스시작하기
__사용자계정구성하기
____루트파일시스템에사용자계정추가하기
__장치노드를관리하는더좋은방법
____devtmpfs를사용하는예
____mdev를사용하는예
____결국정적장치노드는그렇게나쁜것인가?
__네트워크구성하기
____glibc용네트워크요소
__장치테이블을이용해파일시스템이미지만들기
____비글본블랙부팅하기
____NFS를이용해루트파일시스템마운트하기
____QEMU로테스트하기
__비글본블랙으로테스트하기
__파일권한문제
__TFTP를이용해커널로드하기
__요약
__추가자료
6장.빌드시스템선택하기
__기술적요구사항
__빌드시스템비교
__바이너리배포
__Buildroot소개
____배경
____안정버전릴리스및장기간지원버전
____설치
____구성
____실행
____실제하드웨어에타기팅
____커스텀BSP생성
____자신의코드추가
____라이선스준수
__Yocto프로젝트소개
____배경
____안정적인릴리스와지원
____Yocto프로젝트설치
____설정
____빌드
____QEMU타킷실행
____레이어
____local.conf를통한이미지커스터마이징
____이미지레시피쓰기
____SDK생성
____라이선스검사
__요약
__추가자료
7장.Yocto를이용한개발
__기술적요구사항
__기존BSP위에서빌드
____기존BSP를빌드
____Wi-Fi제어
____블루투스제어
____커스텀레이어추가
__devtool로변경사항캡처
____개발워크플로
____새로운레시피생성
____레시피로빌드된소스수정
____레시피를최신버전으로업그레이드
__나만의배포판빌드
____할때와하지말아야할때
____새로운배포레이어생성
____배포판환경설정
____배포판에더많은레시피추가
____런터임패키지관리
__원격패키지서버프로비저닝
__요약
__추가자료
8장.Yocto의내부를살펴보자
__기술적요구사항
__Yocto의아키텍처와워크플로분석
____메타데이터
____빌드태스크
____이미지생성
__메타데이터를레이어로분리
__빌드실패에대한문제해결
____오류격리하기
____환경설정덤프
____태스크로그읽기
____더많은로깅추가
____devshell에서명령실행
____의존성그래프작성
__BitBake구문과의미이해
____태스크
____의존성
____변수
____함수
____RDEPENDS재확인
__요약
__추가자료
2부.시스템아키텍처와설계결정
9장.저장소전략수립
__기술적요구사항
__저장소옵션
____NOR플래시
____NAND플래시
__부트로더에서플래시메모리접근하기
____U-Boot와NOR플래시
____U-Boot와NAND플래시
____U-Boot와MMC,SD,eMMC
__리눅스에서플래시메모리접근
____MTD
____MMC블록드라이버
__플래시메모리를위한파일시스템
____플래시변환레이어
__NOR와NAND플래시메모리를위한파일시스템
____JFFS2
____YAFFS2
____UBI와UBIFS
__컨트롤러가내장된플래시를위한파일시스템
____플래시벤치
____Discard와TRIM
____ext4
____F2FS
____FAT16/32
__읽기전용압축파일시스템
____SquashFS
__임시파일시스템
__읽기전용루트파일시스템만들기
__파일시스템선택
__요약
__추가자료
10장.소프트웨어업데이트
__기술적요구사항
__업데이트는어디에서시작하는가?
__무엇을업데이트해야하는가?
____부트로더
____커널
____루트파일시스템
____시스템애플리케이션
____장치별데이터
____업데이트가필요한컴포넌트
__소프트웨어업데이트의기본
____견고한업데이트
____안전한업데이트
____업데이트보안
__업데이트메커니즘유형
____시메트릭이미지업데이트
____어시메트릭이미지업데이트
____원자파일업데이트
__OTA업데이트
__로컬업데이트시Mender사용하기
____Mender클라이언트빌드하기
__업데이트설치하기
__OTA업데이트시Mender사용하기
__로컬업데이트시balena사용하기
____계정생성하기
____애플리케이션생성하기
____장치추가하기
____CLI설치하기
____프로젝트푸시하기
__요약
11장.장치드라이버인터페이스
__기술적요구사항
__장치드라이버의역할
__문자장치
__블록장치
__네트워크장치
__실행시드라이버찾기
____Sysfs에서정보가져오기
__적합한장치드라이버찾기
__사용자공간의장치드라이버
____GPIO
____LED
____I2C
____SPI
__커널장치드라이버작성
____캐릭터드라이버인터페이스설계
____장치드라이버의구조
____커널모듈컴파일하기
____커널모듈로딩
__하드웨어구성정보찾기
____장치트리
____플랫폼데이터
____장치드라이버와하드웨어의연동
__요약
__추가자료
12장.브레이크아웃보드를이용한프로토타이핑
__기술적요구사항
__장치트리의소스에회로도매핑하기
____회로도와데이터시트읽기
____비글본블랙에데비안설치하기
____spidev활성화하기
____장치트리커스터마이징하기
__브레이크아웃보드를이용한프로
이책에서다루는내용
-Buildroot와Yocto프로젝트를이용해임베디드리눅스시스템을만든다.
-BitBake빌드오류를해결하고Yocto개발워크플로를간소화한다.
-Mender나balena를이용해IoT장치를안전하게업데이트한다.
-회로도를읽고,장치트리를수정하고,브레이크아웃보드를납땜하고,로직분석기로핀을프로브해주변장치추가를프로토타이핑한다.
-커널장치드라이버를작성하지않고도하드웨어와상호작용한다.
-시스템을BusyBoxrunit으로관리되는서비스로나눈다.
-GDB를이용해장치를원격으로디버깅하고perf,ftrace,eBPF,Callgrind같은도구를이용해시스템의성능을측정한다.
이책의대상독자
임베디드컴퓨팅과리눅스에관심이있고자신들의지식을해당주제의다양한분야로확장하려는개발자들을위한책이다.리눅스명령줄(Linuxcommandline)의기초를이해하는독자들이읽기적합하며,프로그래밍예제에서는C와파이썬언어에대한실무지식이있다고가정하고설명한다.몇개의장은임베디드타깃보드에들어가는하드웨어에초점을두므로,하드웨어와하드웨어인터페이스에익숙하면분명히해당경우에이점이있을것이다.
이책의구성
1장.‘시작’에서는임베디드리눅스생태계를살펴보고,프로젝트를시작할때시스템설계자가어떤선택을할수있는지를설명한다.
2장.‘툴체인을배우자’에서는툴체인의요소를설명하고,타깃보드용으로크로스컴파일하기위한툴체인을만드는방법을보여준다.어디서툴체인을구할수있는지살펴보고,소스코드로부터빌드하는방법을자세히설명한다.
3장.‘부트로더에대한모든것’에서는리눅스커널을메모리로로드하는부트로더의역할을설명하고U-Boot와Bareboot를예로사용한다.이어서장치트리도설명한다.장치트리는하드웨어의자세한내용을부호화하는수단으로,거의대부분의임베디드리눅스시스템에쓰인다.
4장.‘커널구성과빌드’에서는임베디드시스템용커널을고르고장치내의하드웨어를위해구성하는방법에대한정보를제공한다.리눅스를새로운하드웨어에이식하는방법도다룬다.
5장.‘루트파일시스템만들기’에서는루트파일시스템구성법에대한단계별안내를통해임베디드리눅스구현의사용자공간부분뒤에감춰진아이디어를소개한다.
6장.‘빌드시스템선택하기’에서는앞의네장에서설명한단계를자동화하는두가지임베디드리눅스빌드시스템(Buildroot와Yocto프로젝트)을다룬다.
7장.‘Yocto를이용한개발’에서는기존BSP레이어위에시스템이미지를빌드하고,Yocto확장SDK를이용해온보드소프트웨어패키지(onboardsoftwarepackage)를빌드하고,런타임패키지관리가포함된완전한자신의임베디드리눅스배포판을작동시키는방법을보여
준다.
8장.‘Yocto의내부를살펴보자’에서는Yocto의고유한멀티레이어접근방법에대한설명을포함해,빌드워크플로와아키텍처를살펴본다.또한기초적인BitBake문법및의미를실제레시피recipe파일에서뽑아낸예를통해자세히살펴본다.
9장.‘저장소전략수립’에서는플래시메모리를관리함으로써생기는,플래시칩과임베디드MMCeMMC패키지등의문제를알아본다.각각에따라적용할수있는파일시스템을설명하고,이미배치돼있는장치의펌웨어를갱신하는기법도다룬다.
10장.‘소프트웨어업데이트’에서는완전관리형OTAOverTheAir를포함해,장치가배치된다음에소프트웨어를업데이트하는다양한방법을검토한다.논의되는핵심주제는신뢰성과보안이다.
11장.‘장치드라이버인터페이스’에서는커널장치드라이버가하드웨어와상호작용하는방법을간단한드라이버의작동예제와함께설명한다.또한사용자공간에서장치드라이버를호출하는다양한방법도설명한다.
12장.‘브레이크아웃보드를이용한프로토타이핑’에서는미리만들어진비글본블랙(BeagleBoneBlack)용데비안이미지와주변기기브레이크아웃보드peripheralbreakoutboard를이용해하드웨어와소프트웨어를빠르게프로토타이핑하는방법을보여준다.데이터시트를읽고,보드의전선을연결하고,장치트리바인딩을멀티플렉스하고,SPI시그널을분석하는방법을배울것이다.
13장.‘시스템구동:init프로그램’에서는나머지시스템을시작하는첫번째사용자공간프로그램인init에대해이야기한다.다양한부류의임베디드시스템에적합한세가지버전의init프로그램(비교적간단한BusyBoxinit에서복잡한systemd까지)을설명한다.
14장.‘BusyBoxrunit’에서는Buildroot를이용해시스템을systemd에서제공하는프로세스감시와로깅이가능한분리된BusyBoxrunit서비스로나누는방법을보여준다.
15장.‘전원관리’에서는동적주파수/전압제어,더깊은유휴상태선택,시스템중단systemsuspend등전력소비를최소화하도록리눅스를튜닝하는다양한방법을고려한다.목표는장치가배터리를이용해서더오래실행되도록하고발열을줄이는것이다.
16장.‘파이썬패키징하기’에서는파이썬모듈을함께배포하기위한몇가지방법을소개하고각각의방법이적합한상황을설명한다.여기서는pip,가상환경,conda,도커(Docker)를다룬다.
17장.‘프로세스와스레드’에서는애플리케이션프로그래머의관점에서임베디드시스템을설명한다.프로세스와스레드,프로세스간통신,스케줄링정책을살펴본다.
18장.‘메모리관리’에서는가상메모리의개념을살펴보고주소공간을메모리매핑으로나누는방법을소개한다.또한메모리사용량을정확히측정하고메모리누수를감지하는방법도설명한다.
19장.‘GDB로디버깅하기’에서는GNU디버거(GDB)를디버그에이전트와함께사용해원격으로타깃장치에서실행되는애플리케이션을디버깅하는방법을설명한다.계속해서이모델을확장해커널디버그스텁과KGDB를활용해커널코드를디버깅하는방법도보여준다.
20장.‘프로파일링과추적’에서는시스템성능을측정하는데사용할수있는기술을설명한다.전체시스템프로필에서시작해병목현상으로인해성능이저하되는특정영역으로좁혀간다.또한애플리케이션에서스레드동기화와메모리할당의정확성을검사하는도구인Valgrind를알아본다.
21장.‘실시간프로그래밍’에서는커널구성과실시간PREEMPT_RT커널패치등을비롯해리눅스에서의실시간프로그래밍에대해자세히설명하고,실시간대기시간을측정하는도구들도살펴본다.커널추적도구인Ftrace를이용해커널지연시간을측정하고다양한커널구성의효과를보여준다.
