Top

임베디드 리눅스 프로그래밍 완전정복 2/e [단계별로 따라 하는]

  • 원서명Mastering Embedded Linux Programming - Second Edition: Unleash the full potential of Embedded Linux (ISBN 9781787283282)
  • 지은이크리스 시먼즈(Chris Simmonds)
  • 옮긴이김기주, 김병극, 송지연
  • ISBN : 9791161752549
  • 40,000원
  • 2019년 01월 30일 펴냄
  • 페이퍼백 | 588쪽 | 188*235mm
  • 시리즈 : acorn+PACKT, 임베디드 시스템

책 소개

본문에 쓰인 컬러 이미지는 여기에서 내려 받으세요.
요약

임베디드 리눅스를 이용해서 장치를 만들 때 고려할 하드웨어 관련 사항, 툴체인과 부트로더 선택, 커널 구성과 루트 파일시스템 생성, 빌드 시스템 선택, 플래시 메모리, 장치 드라이버, 시스템 부트 과정을 다룬다. 또한 만들어진 임베디드 리눅스 플랫폼 위에서 프로그래밍할 때 고려해야 할 프로세스와 스레드, 메모리 관리, 디버깅, 프로파일링, 실시간 프로그래밍 관련 내용도 다룬다. 2판에서는 OTA(over-the-air) 업데이트를 다루는 8장, ‘소프트웨어 업데이트’, 배터리 수명 연장과 에너지 절약을 통한 환경 보호에 도움이 되는 11장, ‘전원 관리’가 추가됐다.

이 책에서 다루는 내용

■ 대부분의 SoC나 임베디드 모듈 제조사가 제공하는 BSP 평가하기
■ 빌드루트와 Yocto 프로젝트를 이용해 빠르고 효율적으로 임베디드 리눅스 시스템 구축하기
■ 보안 위협 없이 판매된 IoT 장치 업데이트
■ 장치의 전력 소모량을 줄여 배터리 지속하기
■ 커널 장치 드라이버를 작성하지 않고 하는 하드웨어 상호작용
■ GDB를 이용해 장치를 원격으로 디버그와 perf, ftrace, valgrind 같은 강력한 도구를 이용한 시스템 성능 측정
■ 실시간 운영 체제로 리눅스 구성하기

이 책의 대상 독자

임베디드 컴퓨팅과 리눅스에 관심이 있고, 다양한 주제에 대한 지식을 넓히고자 하는 개발자를 위한 책이다. 리눅스 커맨드라인에 대한 기초적인 이해가 있다고 가정했고, 프로그래밍 예에서는 C 언어에 대한 실용적인 지식이 있다고 가정했다. 몇몇 장은 임베디드 타깃 보드에 들어가는 하드웨어에 초점을 맞추므로, 하드웨어와 하드웨어 인터페이스에 친숙하면 도움이 될 것이다.

이 책의 구성

1장 ‘시작’에서는 임베디드 리눅스 생태계를 설명하고, 프로젝트를 시작할 때 시스템 설계자가 할 수 있는 선택에 대해 설명한다.
2장 ‘툴체인에 대해 배워보자’에서는 툴체인의 요소에 대해 설명하고, 타깃 보드용으로 크로스 컴파일하기 위한 툴체인을 만드는 방법을 보여준다. 어디서 툴체인을 구할 수 있는지와 소스 코드로부터 빌드하는 방법에 대해 자세히 설명한다.
3장 ‘부트로더에 대한 모든 것’에서는 리눅스 커널을 메모리로 로드하는 부트로더의 역할에 대해 설명하고, U-Boot와 Bareboot를 예로 사용한다. 장치 트리도 설명하는데, 장치 트리는 하드웨어의 자세한 내용을 부호화하는 수단으로, 거의 대부분의 임베디드 리눅스 시스템에 쓰인다.
4장 ‘커널 구성과 빌드’에서는 임베디드 시스템용 커널을 고르고 장치 내의 하드웨어를 위해 구성하는 방법에 관한 정보를 제공한다. 리눅스를 새로운 하드웨어에 이식하는 방법도 다룬다.
5장 ‘루트 파일시스템 만들기’에서는 루트 파일시스템 구성법에 대한 단계별 안내를 통해 임베디드 리눅스 구현의 사용자 공간 부분 뒤에 감춰진 아이디어를 소개한다.
6장 ‘빌드 시스템 선택하기’에서는 앞의 네 장에서 설명한 단계를 자동화하는 두 가지 임베디드 리눅스 빌드 시스템(Buildroot와 Yocto 프로젝트)을 다루면서 책의 첫 번째 부분을 마친다.
7장 ‘저장소 전략 만들기’에서는 플래시 메모리를 관리함으로써 생기는 플래시 칩과 임베디드 MMC eMMC 패키지 등의 도전에 대해 알아본다. 기술의 종류에 따라 적용할 수 있는 파일시스템을 설명한다. 또한 이미 배치돼 있는 장치의 펌웨어를 갱신하는 기법도 다룬다.
8장 ‘소프트웨어 업데이트’에서는 완전 관리형(OTA Over the Air)을 포함해서, 장치가 배치된 다음 소프트웨어를 업데이트하는 다양한 방법을 검토한다. 논의되는 핵심 주제는 신뢰성과 보안이다.
9장 ‘장치 드라이버와의 만남’에서는 커널 장치 드라이버가 하드웨어와 상호작용하는 방법을 간단한 드라이버의 작동 예제를 가지고 설명한다. 또한 사용자 공간에서 장치 드라이버를 호출하는 다양한 방법도 설명한다.
10장 ‘시스템 구동: init 프로그램’에서는 나머지 시스템을 시작하는 첫 번째 사용자 공간 프로그램인 init에 대해 이야기한다. 다양한 부류의 임베디드 시스템에 적합한 세 가지 버전의 init 프로그램(비교적 간단한 BusyBox init에서 복잡한 systemd까지)을 설명한다.
11장 ‘전원 관리’에서는 동적 주파수/전압 제어, 더 깊은 유휴 상태 선택, 시스템 중단 등 전력 소비를 최소화하도록 리눅스를 튜닝하는 다양한 방법을 고려한다. 목표는 장치가 배터리를 이용해 더 오래 실행되게 하고 발열을 줄이는 것이다.
12장 ‘프로세스와 스레드’에서는 응용 프로그램 프로그래머의 관점에서 임베디드 시스템에 대해 설명한다. 프로세스와 스레드, 프로세스 간 통신, 스케줄링 정책을 살펴본다.
13장 ‘메모리 관리’에서는 가상 메모리의 개념과 주소 공간을 메모리 매핑으로 나누는 방법을 소개한다. 또한 메모리 사용량을 정확히 측정하고 메모리 누수를 감지하는 방법도 설명한다.
14장 ‘GDB로 디버깅하기’에서는 GNU 디버거 GDB를 디버그 에이전트와 함께 사용해 원격으로 타깃 장치에서 실행되는 응용 프로그램을 디버깅하는 방법을 설명한다. 계속해서 이 모델을 확장해 커널 디버그 스텁 KGDB을 활용한 커널 코드 디버깅 방법도 보여준다.
15장 ‘프로파일링과 추적’에서는 시스템 성능을 측정하는 데 사용할 수 있는 기술에 대해 설명한다. 전체 시스템 프로파일에서 시작해 병목 현상으로 인해 성능이 저하되는 특정 영역으로 좁혀간다. 또한 응용 프로그램에서 스레드 동기화와 메모리 할당의 정확성을 검사하는 도구인 Valgrind에 대해 설명한다.
16장 ‘실시간 프로그래밍’에서는 커널 구성과 실시간 PREEMPT_RT 커널 패치 등을 비롯해 리눅스에서의 실시간 프로그래밍에 대해 자세히 설명하고, 실시간 대기시간을 측정하는 도구들도 설명한다. 커널 추적 도구인 Ftrace를 이용해 커널 대기시간을 측정하고 다양한 커널 구성의 효과를 보여준다.

저자/역자 소개

지은이의 말

리눅스를 임베디드 시스템에 빌드해 넣기 위해 필요한 기법들을 알려준다. 먼저 모든 임베디드 리눅스 프로젝트를 뒷받침하는 기본 요소인 툴체인, 부트로더, 커널, 루트 파일시스템에 대해 배울 것이다. 이들 요소 각각을 만드는 방법을 밑바닥부터 알려준 뒤, Buildroot와 Yocto 프로젝트를 이용해서 자동화하는 방법을 알려준다. 나아가 플래시 메모리를 이용해서 코드와 데이터를 저장하는 방법과 장치가 배포된 뒤에 소프트웨어를 업데이트하는 방법을 배운다. 또한 임베디드 리눅스 코딩의 핵심인 응용 프로그램에서 하드웨어에 접근하는 방법, 멀티프로세스와 멀티스레드 프로그램 설계 방법을 소개한다. 마지막으로 코드를 응용 프로그램 수준과 커널 수준에서 디버그하고 프로파일하는 방법을 익혀 버그를 찾아내고 성능상 병목을 해결할 수 있다. 이 책을 읽고 나면 성공적인 임베디드 리눅스 시스템을 만드는 데 필요한 완전한 개요를 알게 될 것이다.

지은이 소개

크리스 시먼즈(Chris Simmonds)

소프트웨어 컨설턴트이자 교육자로 영국 남부에 살고 있다. 20년 가까이 오픈소스 임베디드 시스템 설계와 개발 경험을 쌓아왔으며, 임베디드 리눅스, 리눅스 장치 드라이버, 안드로이드 플랫폼 개발 관련 교육과 멘토링 서비스를 제공하는 2net Ltd의 창업자이자 수석 컨설턴트다. ARM, 퀄컴(Qualcomm), 인텔(Intel), 에릭슨(Ericsson), 제너럴 다이내믹스(General Dynamics) 등 임베디드 업계의 대규모 회사 여러 곳의 엔지니어들을 교육했다. 임베디드 리눅스 콘퍼런스(Embedded Linux Conference)와 임베디드 월드(Embedded World) 등 오픈소스와 임베디드 콘퍼런스에서 자주 강연한다. 블로그 ‘Inner Penguin’(www.2net.co.uk)에서 그의 작업 중 일부를 살펴볼 수 있다.

옮긴이의 말

지난 10년간 임베디드 장치에서 리눅스의 쓰임은 엄청나게 늘어났다. 2007년 안드로이드가 발표된 이후 리눅스 커널은 임베디드 장치에서, 어쩌면 PC를 포함한 모든 디지털 기기에서 가장 널리 쓰이는 운영체제 커널이 된 것으로 보인다. 안드로이드 외에도 삼성전자의 일부 스마트폰과 기어, 스마트 TV에 사용되는 타이젠(Tizen)(https://www.tizen.org)과 미국 팜 사에서 개발해 HP를 거쳐 LG전자에 인수돼 스마트 TV에 사용되고 있는 WebOS(http://webostv.developer.lge.com)도 리눅스에 기반을 두고 있으며, 자동차 업계에서도 GENEVI(https://www.genivi.org) 등 리눅스를 이용한 범용 플랫폼을 만들려는 노력을 하고 있다.
이 책은 원서 『Mastering Embedded Linux Programming – Second Edition』을 번역한 것으로, 임베디드 리눅스를 이용해 장치를 만들 때 고려할 하드웨어 관련 사항, 툴체인과 부트로더 선택, 커널 구성과 루트 파일시스템 생성, 빌드 시스템 선택, 플래시 메모리, 장치 드라이버, 시스템 부트 과정, 그리고 만들어진 임베디드 리눅스 플랫폼 위에서 프로그래밍할 때 고려해야 할 프로세스와 스레드, 메모리 관리, 디버깅, 프로파일링, 실시간 프로그래밍 관련 내용 등을 다룬다. 특히 2판에서는 OTA over-the-air 업데이트를 다루는 8장, ‘소프트웨어 업데이트’, 배터리 수명 연장과 에너지 절약을 통한 환경 보호에 도움이 되는 11장, ‘전원 관리’가 추가됐다.
임베디드 리눅스 플랫폼을 만들고 그 위에서 프로그래밍하기 위한 전반적인 내용을 다루고 있으므로, 기존에 VxWorks나 퀄컴 BREW 같은 플랫폼을 사용하다가 리눅스로 전환하려는 사람들에게 도움이 될 것으로 보인다. 빌드 시스템의 경우 요즘 리눅스에 기반을 둔 플랫폼과 응용 프로그램들을 한꺼번에 빌드하도록 도와주는 Yocto 프로젝트가 많이 쓰이고 있는데, 이에 대해서도 다루고 있으므로 도움이 될 것이다. 스레드에 대해서도 일반 스케줄링 정책과 실시간 스케줄링 정책을 구별해 설명하고 있어 그 차이를 이해하는 데 도움이 될 것이다.
리눅스는 임베디드 시스템뿐만 아니라 전통적으로 유닉스가 주로 쓰이던 서버에도 널리 사용된다. 내가 몸담고 있는 elastic.co에서 개발하는 검색 엔진인 일래스틱서치(Elasticsearch)는 리눅스와 윈도우만 지원할 뿐 그 밖의 유닉스는 지원하지 않는다. 메모리 크기만 다를 뿐 기본적인 작동 방식은 같으므로, 리눅스에 익숙하면 임베디드 시스템에서 서버까지 쉽게 적용해 사용할 수 있다는 뜻이다.
처음으로 임베디드 시스템 소프트웨어를 작성할 때에 비해 개발 환경이 많이 좋아지고 임베디드 시스템의 성능도 획기적으로 향상돼 응용할 수 있는 영역이 매우 넓어졌으므로 이 책을 통해 많은 분이 흥미로운 임베디드 시스템 소프트웨어를 개발할 수 있게 되기를 바란다.

-김기주

옮긴이 소개

김기주

포스텍 컴퓨터공학과와 동 대학원을 졸업한 뒤 지금은 elastic.co에서 일래스틱서치(Elasticsearch) 사용자들을 돕고 있다. https://www.elastic.co/kr/blog에 다수의 글을 썼으며 오피셜 일래스틱 트레이닝(Official Elastic Training)(https://training.elastic.co/)에서 강의도 한다. 공저로 『Security PLUS for UNIX』(영진닷컴, 2000), 역서로 에이콘출판사의 『임베디드 프로그래밍 입문』(2006), 『실시간 UML』(2008), 『리눅스 API의 모든 것』(2012), 『리눅스 실전 가이드』(2014), 『한눈에 빠져드는 셸 스크립트 2/e』(2018)가 있다.

김병극

IMF 시절 웹 프로그래밍을 시작으로 SW 개발을 시작했으며, 그 뒤 삼성, 팬택 피처폰의 데이터 서비스 및 애플리케이션 관련 업무 진행 중 자바 VM을 포팅하는 일이 인연이 되어 썬 마이크로시스템즈와 오라클에서 자바 VM 관련 개발 업무를 했다. 현재는 시놉시스(Synopsys)의 정적 분석, 동적 분석 및 퍼징 테스트(Fuzzing test) 제품의 기술지원 업무를 맡고 있으며, 역서로는 『한눈에 빠져드는 셸 스크립트 2/e』(에이콘, 2018)가 있다.

송지연

지엔텔, 노키아 지멘스 네트웍스에서 근무한 경험이 있는 WCDMA, LTE 분야의 통신 기술 엔지니어 출신으로, 취미로 팀을 만들어 한동안 개발에 푹 빠져 있기도 했다. 현재는 주전공인 SW 개발 분야로 돌아와 오라클 자바 개발 팀, 그레이스 노트를 거쳐 닐슨에서 근무 중이다. 역서로는 『스프링 프레임워크 핵심노트 3권』(한빛미디어, 2013)과 『리눅스 실전 가이드』(에이콘, 2014) 등이 있다.

목차

목차
  • 1장. 시작
    • 알맞은 운영체제 선택하기
    • 참여 단체
    • 프로젝트 생명주기
      • 임베디드 리눅스의 4 요소
    • 오픈소스
      • 라이선스
    • 임베디드 리눅스용 하드웨어
    • 이 책에서 사용하는 하드웨어
      • 비글본 블랙
      • QEMU
    • 이 책에서 사용하는 소프트웨어
    • 요약

  • 2장. 툴체인에 대해 배워보자
    • 툴체인 소개
      • 툴체인의 종류
      • CPU 아키텍처
      • C 라이브러리 고르기
    • 툴체인 찾기
    • crosstool-NG를 이용한 툴체인 빌드
      • crosstool-NG 설치
      • 비글본 블랙용 툴체인 빌드
      • QEMU용 툴체인 빌드
    • 툴체인의 구조
      • 크로스 컴파일러에 대해 알아보기
      • sysroot, 라이브러리, 헤더 파일
      • 툴체인 안의 다른 도구들
      • C 라이브러리의 요소 살펴보기
    • 라이브러리와 링크하기: 정적 링크와 동적 링크
      • 정적 라이브러리
      • 공유 라이브러리
    • 크로스 컴파일 기술
      • 단순 makefile
      • Autotools
      • 패키지 구성
      • 크로스 컴파일 관련 문제
    • 요약

  • 3장. 부트로더에 대한 모든 것
    • 부트로더는 무슨 일을 하는가?
    • 부트 순서
      • 1단계: 롬 코드
      • 2단계: SPL
      • 3단계: TPL
    • UEFI 펌웨어로 부팅하기
    • 부트로더에서 커널로 이동
    • 장치 트리 소개
      • 장치 트리 기초
      • reg 프로퍼티
      • 레이블과 인터럽트
      • 장치 트리 include 파일
      • 장치 트리 컴파일
    • 부트로더 선택
    • U-Boot
      • U-Boot 빌드
      • U-Boot 설치
      • U-Boot 사용
      • 리눅스 부트
      • U-Boot를 새로운 보드에 이식
      • 빌드와 테스트
      • 팔콘 모드
    • Barebox
      • Barebox 구하기
      • Barebox 빌드하기
      • Barebox 사용하기
    • 요약

  • 4장. 커널 구성과 빌드
    • 커널은 무엇을 하는가?
    • 커널 선택하기
      • 커널 개발 주기
      • 안정적 장기 지원 릴리스
      • 벤더 지원
      • 라이선스
    • 커널 빌드하기
      • 소스 구하기
      • 커널 구성의 이해: KConfig
      • LOCALVERSION을 이용한 커널 식별
      • 커널 모듈
    • 컴파일: Kbuild
      • 어떤 커널 이미지를 컴파일할지 알아내기
      • 빌드 산출물
      • 장치 트리 컴파일
      • 모듈 컴파일
      • 커널 소스 청소
      • 비글본 블랙용 커널 빌드하기
      • QEMU용 커널 빌드하기
    • 커널 부팅하기
      • 비글본 블랙 부팅하기
      • 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장. 저장소 전략 만들기
    • 저장소 옵션
      • 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
    • 임시 파일시스템
    • 읽기 전용 루트 파일시스템 만들기
    • 파일시스템 선택
    • 더 읽을거리
    • 요약

  • 8장. 소프트웨어 업데이트
    • 무엇을 업데이트해야 하는가?
      • 부트로더
      • 커널
      • 루트 파일시스템
      • 시스템 응용 프로그램
      • 장치별 데이터
      • 업데이트가 필요한 컴포넌트
    • 소프트웨어 업데이트의 기본
      • 견고한 업데이트
      • 안전한 업데이트
      • 업데이트 보안
    • 업데이트 메커니즘 유형
      • 시메트릭(대칭) 이미지 업데이트
      • 어시메트릭(비대칭) 이미지 업데이트
      • 원자 파일 업데이트
    • OTA 업데이트
    • 로컬 업데이트 시 Mender 사용하기
      • Mender 클라이언트 빌드하기
      • 업데이트 설치하기
    • OTA 업데이트 시 Mender 사용하기
    • 요약

  • 9장. 장치 드라이버와의 만남
    • 장치 드라이버의 역할
    • 문자 장치
    • 블록 장치
    • 네트워크 장치
    • 런타임 시 드라이버 찾기
      • sysfs에서 정보 가져오기
    • 적합한 장치 드라이버 찾기
    • 사용자 공간의 장치 드라이버
      • GPIO
      • LED
      • I2C
      • SPI
    • 커널 장치 드라이버 작성
      • 문자 드라이버 인터페이스 설계
      • 장치 드라이버의 구조
      • 커널 모듈 컴파일
      • 커널 모듈 로딩
    • 하드웨어 구성 정보 찾기
      • 장치 트리
      • 플랫폼 데이터
      • 장치 드라이버와 하드웨어의 연동
    • 더 읽을거리
    • 요약

  • 10장. 시스템 구동: init 프로그램
    • 커널 구동 이후
    • init 프로그램의 소개
    • BusyBox init
      • Buildroot init 스크립트
    • 시스템 V init
      • inittab
      • init.d 스크립트
      • 새로운 데몬 추가
      • 서비스 시작과 종료
    • systemd
      • Yocto 프로젝트와 Buildroot에서 systemd 빌드하기
      • 타깃, 서비스, 유닛의 소개
      • systemd로 시스템을 구동하는 방법
      • 직접 만든 서비스 설치
      • 워치독 추가
      • 임베디드 리눅스에서 중요한 점
    • 더 읽을거리
    • 요약

  • 11장. 전원 관리
    • 전력 사용량 측정
    • 클록 주파수 스케일링
      • CPUFreq 드라이버
      • CPUFreq 사용
    • 최적의 유휴 상태 선택하기
      • CPUIdle 드라이버
      • 틱리스 작업
    • 주변장치 전원 끄기
    • 시스템을 절전 모드로 전환하기
      • 전력 상태
      • 웨이크업 이벤트
      • 실시간 클록(RTC)의 시간 지정 웨이크업
    • 더 읽을거리
    • 요약

  • 12장. 프로세스와 스레드
    • 프로세스인가 스레드인가?
    • 프로세스
      • 새로운 프로세스 만들기
      • 프로세스 종료하기
      • 다른 프로그램 실행하기
      • 데몬
      • 프로세스 간 통신
    • 스레드
      • 새로운 스레드 만들기
      • 스레드 종료하기
      • 스레드를 사용하는 프로그램 컴파일하기
      • 스레드 간 통신
      • 상호 배제
      • 조건 바꾸기
      • 문제 나누기
    • 스케줄링
      • 공평성 대 결정성
      • 시분할 정책
      • 실시간 정책
      • 정책 선택하기
      • 실시간 우선순위 선택하기
    • 더 읽을거리
    • 요약

  • 13장. 메모리 관리
    • 가상 메모리 기초
    • 커널 공간 메모리 레이아웃
      • 커널이 얼마나 많은 메모리를 사용하는가?
    • 사용자 공간 메모리 레이아웃
    • 프로세스 메모리 맵
    • 스와핑
      • 압축 메모리(zram)로 스왑
    • mmap으로 메모리 매핑
      • mmap을 사용한 독립된 메모리 할당
      • mmap을 사용한 메모리 공유
      • mmap을 사용한 장치 메모리 액세스
    • 응용 프로그램에서 얼마나 많은 메모리를 사용하고 있는가?
    • 프로세스별 메모리 사용량
      • top과 ps 사용
      • smem 사용
      • 고려할 만한 그 밖의 툴
    • 메모리 누수 알아내기
      • mtrace
      • Valgrind
    • 메모리 부족
    • 더 읽을거리
    • 요약

  • 14장. GDB로 디버깅하기
    • GNU 디버거
    • 디버깅 준비하기
    • 응용 프로그램 디버깅
      • gdbserver를 이용한 원격 디버깅
      • 원격 디버깅을 위한 Yocto 프로젝트 셋업하기
      • 원격 접속을 위한 Buildroot 셋업하기
      • 디버깅 시작하기
      • 네이티브 디버깅
    • JIT 디버깅
    • 디버깅 포크와 스레드
    • 코어 파일
      • GDB를 이용해 코어 파일 살펴보기
    • GDB 사용자 인터페이스
      • 터미널 사용자 인터페이스
      • 데이터 디스플레이 디버거
      • 이클립스
    • 커널 코드 디버깅
      • kgdb를 사용한 커널 코드 디버깅
      • 디버그 세션 예제
      • 얼리 코드(early code) 디버깅
      • 디버깅 모듈
      • kdb를 사용한 커널 코드 디버깅
      • oops 메시지 살펴보기
      • oops 메시지의 보존
    • 더 읽을거리
    • 요약

  • 15장. 프로파일링과 추적
    • 관찰자 효과
      • 심볼 테이블과 컴파일 플래그
    • 프로파일 시작하기
    • top으로 프로파일링하기
    • 푸어맨 프로파일러
    • perf 소개
      • perf용 커널 구성
      • Yocto 프로젝트로 perf 빌딩하기
      • Buildroot로 perf 빌딩하기
      • perf로 프로파일링하기
      • 호출 그래프
      • perf annotate
    • 그 밖의 프로파일러: OProfile, gprof
    • 이벤트 추적
    • Ftrace 소개
      • Ftrace 사용 준비
      • Ftrace 사용
      • 동적 Ftrace 및 trace 필터
      • 이벤트 추적
    • LTTng 사용
      • LTTng와 Yocto 프로젝트
      • LTTng와 Buildroot
      • 커널 추적에 LTTng 사용
    • Valgrind 사용
      • Callgrind
      • Helgrind
    • strace 사용
    • 요약

  • 16장. 실시간 프로그래밍
    • 실시간이란 무엇인가?
    • 비결정론의 근원 식별하기
    • 스케줄링 대기시간 이해하기
    • 커널 선점
    • 실시간 리눅스 커널(PREEMPT_RT)
      • 스레드 인터럽트 핸들러
    • 선점 가능한 커널 잠금
      • PREEMPT_RT 패치 얻기
      • Yocto 프로젝트와 PREEMPT_RT
    • 고해상도 타이머
    • 페이지 폴트 방지
    • 인터럽트 쉴링
    • 스케줄링 대기시간 측정
      • cyclictest
      • Ftrace 사용
      • cyclictest와 Ftrace 결합
    • 더 읽을거리

도서 오류 신고

도서 오류 신고

에이콘출판사에 관심을 가져 주셔서 고맙습니다. 도서의 오탈자 정보를 알려주시면 다음 개정판 인쇄 시 반영하겠습니다.

오탈자 정보는 다음과 같이 입력해 주시면 됩니다.

(예시) p.100 아래에서 3행 : '몇일'동안 -> 며칠동안

정오표

정오표

[p.81]

[p.82]
pkg-config sqlite3 --libs --cflags -lsqlite3
->
pkg-config sqlite3 --libs --cflags
-lsqlite3