임베디드 리눅스 프로그래밍 완전정복 3/e
- 원서명Mastering Embedded Linux Programming, 3rd Edition: Create fast and reliable embedded solutions with Linux 5.4 and the Yocto Project 3.1 (Dunfell) (ISBN 9781789530384)
- 지은이프랭크 바스케즈(Frank Vasquez), 크리스 시먼즈(Chris Simmonds)
- 옮긴이김기주, 김병극, 송지연
- ISBN : 9791161758008
- 50,000원 (eBook 40,000원)
- 2023년 11월 30일 펴냄
- 페이퍼백 | 884쪽 | 188*235mm
- 시리즈 : 임베디드 시스템
책 소개
본문에 쓰인 컬러 이미지는 여기에서 내려 받으세요.
소스 코드 파일은 여기에서 내려 받으실 수 있습니다.
https://github.com/AcornPublishing/embedded-linux-3e
요약
임베디드 리눅스를 이용해서 장치를 만들 때 고려할 하드웨어 관련 사항, 툴체인과 부트로더 선택, 커널 구성과 루트 파일 시스템 생성, 빌드 시스템 선택, 플래시 메모리, 장치 드라이버, 시스템 부트 과정 그리고 만들어진 임베디드 리눅스 플랫폼 위에서 프로그래밍할 때 고려해야 할 프로세스와 스레드, 메모리 관리, 디버깅, 프로파일링, 실시간 프로그래밍 관련 내용 등을 다룬다. 3판에서는 리눅스와 Yocto project 버전을 포함해 전체적으로 내용이 업데이트되고 상세한 설명이 추가됐으며, 모던 빌드 시스템인 CMake, 파이썬 관련 내용이 추가됐다.
이 책에서 다루는 내용
◆ 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장. ‘저장소 전략 수립’에서는 플래시 메모리를 관리함으로써 생기는, 플래시 칩과 임베디드 MMC(eMMC) 패키지 등의 문제를 알아본다. 각각에 따라 적용할 수 있는 파일시스템을 설명하고, 이미 배치돼 있는 장치의 펌웨어를 갱신하는 기법도 다룬다.
10장. ‘소프트웨어 업데이트’에서는 완전 관리형 OTA(Over 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를 이용해 커널 지연 시간을 측정하고 다양한 커널 구성의 효과를 보여준다.
목차
목차
- 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 활성화하기
- 장치 트리 커스터마이징하기
- 브레이크아웃 보드를 이용한 프로토타이핑
- SPI 점퍼 닫기
- GNSS 안테나 부착하기
- SPI 헤더 부착하기
- SPI 점퍼 와이어 연결하기
- 로직 분석기로 SPI 신호 프로빙하기
- SPI를 통해 NMEA 메시지 수신하기
- 요약
- 추가 자료
- 13장. 시스템 구동: init 프로그램
- 기술적 요구 사항
- 커널 구동 이후
- init 프로그램의 소개
- BusyBox init
- Buildroot init 스크립트
- System V init
- inittab
- init.d 스크립트
- 새로운 데몬 추가
- 서비스 시작과 종료
- systemd
- Yocto 프로젝트와 Buildroot에서 system 빌드하기
- 타깃, 서비스, 유닛의 소개
- Systemd로 시스템을 구동하는 방법
- 직접 만든 서비스 추가
- 워치독 추가
- 임베디드 리눅스에서 중요한 점
- 요약
- 추가 자료
- 14장. BusyBox runit
- 기술적 요구 사항
- BusyBox runit 가져오기
- 서비스 디렉터리와 파일 만들기
- 서비스 디렉터리 레이아웃
- 서비스 구성
- 서비스 관리
- 서비스 제어하기
- 다른 서비스에 대한 의존성
- 시작 의존성
- 커스텀 시작 의존성
- 모두 합치기
- 전용 서비스 로깅
- 어떻게 동작하는가?
- 서비스에 전용 로깅 추가하기
- 로그 회전
- 서비스에 시그널 보내기
- 요약
- 추가 자료
- 15장. 전원 관리
- 기술적 요구 사항
- 전력 사용량 측정
- 클럭 주파수 스케일링
- CPUFreq 드라이버
- CPUFreq 사용
- 최적의 idle 상태 선택하기
- CPUIdle 드라이버
- 틱리스 작업
- 주변 기기 전원 끄기
- 시스템을 절전 모드로 전환하기
- 전력 상태
- 웨이크업 이벤트
- 실시간 클럭의 시간 지정 웨이크업
- 요약
- 추가 자료
- 3부. 임베디드 애플리케이션 작성하기
- 16장. 파이썬 패키징하기
- 기술적 요구 사항
- 도커 설치하기
- 파이썬 패키징의 기원 추적
- distutils
- setuptools
- setup.py
- pip로 파이썬 패키지 설치하기
- requirements.txt
- venv를 이용해 파이썬 가상 환경 관리하기
- conda를 이용해 미리 컴파일된 바이너리 설치하기
- 환경 관리
- 패키지 관리
- 도커를 사용해 파이썬 애플리케이션 배포하기
- 도커파일 해부
- 도커 이미지 빌드하기
- 도커 이미지 실행하기
- 도커 이미지 가져오기
- 도커 이미지 게시하기
- 뒷정리
- 요약
- 추가 자료
- 기술적 요구 사항
- 17장. 프로세스와 스레드
- 기술적 요구 사항
- 프로세스와 스레드
- 프로세스
- 새로운 프로세스 만들기
- 프로세스 종료하기
- 다른 프로그램 실행하기
- 데몬
- 프로세스 간 통신
- 스레드
- 새로운 스레드 만들기
- 스레드 종료하기
- 스레드를 사용하는 프로그램 컴파일하기
- 스레드 간 통신
- 상호 배제
- 조건 바꾸기
- 문제 나누기
- ZeroMQ
- pyzmq 받기
- 프로세스 간 메시징
- 프로세스 내 메시징
- 스케줄링
- 공평성 대 결정성
- 시분할 정책
- 실시간 정책
- 정책 선택하기
- 실시간 우선순위 선택하기
- 요약
- 추가 자료
- 18장. 메모리 관리
- 기술적 요구 사항
- 가상 메모리 기초
- 커널 공간 메모리 레이아웃
- 커널이 얼마나 많은 메모리를 사용하는가?
- 사용자 공간 메모리 레이아웃
- 프로세스 메모리 맵
- 스와핑
- 압축 메모리(zram)로 스왑
- mmap으로 메모리 매핑
- mmap을 사용해 독립된 메모리 할당
- mmap을 사용해 메모리 공유
- mmap을 사용해 장치 메모리에 액세스
- 애플리케이션에서 메모리를 얼마나 사용하고 있는가?
- 프로세스별 메모리 사용량
- top과 ps 사용
- smem 사용
- 고려할 만한 다른 도구
- 메모리 누수 식별하기
- mtrace
- Valgrind
- 메모리 부족
- 요약
- 추가 자료
- 4부. 디버깅과 성능 최적화
- 19장. GDB로 디버깅하기
- 기술적 요구 사항
- GNU 디버거
- 디버깅 준비하기
- 애플리케이션 디버깅
- gdbserver를 이용한 원격 디버깅
- 원격 디버깅을 위한 Yocto 프로젝트 셋업하기
- 원격 디버깅을 위한 Buildroot 셋업하기
- 디버깅 시작하기
- 네이티브 디버깅
- JIT 디버깅
- 디버깅 포크와 스레드
- 코어 파일
- GDB를 이용해 코어 파일 살펴보기
- GDB 사용자 인터페이스
- 터미널 사용자 인터페이스
- 데이터 디스플레이 디버거
- 비주얼 스튜디오 코드
- 커널 코드 디버깅
- kgdb를 사용한 커널 코드 디버깅
- 디버그 세션 샘플
- 얼리 코드 디버깅
- 디버깅 모듈
- kdb를 사용한 커널 코드 디버깅
- 웁스 메시지 살펴보기
- 웁스 메시지의 보존
- 요약
- 추가 자료
- 20장. 프로파일링과 추적
- 기술적 요구 사항
- 관찰자 효과
- 심볼 테이블과 컴파일 플래그
- 프로파일링 시작하기
- top을 이용한 프로파일링
- 가난한 사람의 프로파일러
- perf
- perf를 위한 커널 구성
- Yocto 프로젝트를 이용해 perf 빌드하기
- Buildroot를 이용해 perf 빌드하기
- perf를 이용해 프로파일링하기
- 호출 그래프
- perf annotate
- 이벤트 추적
- Ftrace
- Ftrace를 사용하기 위한 준비
- Ftrace 사용하기
- 동적 Ftrace와 트레이스 필터
- 트레이스 이벤트
- LTTng 사용하기
- LTTng와 Yocto 프로젝트
- LTTng와 Buildroot
- LTTng를 사용해 커널 추적하기
- BPF 사용하기
- BPF를 위한 커널 구성
- Buildroot를 이용해 BCC 툴킷 빌드하기
- BPF 추적 도구 사용하기
- Valgrind 사용하기
- Callgrind
- Helgrind
- strace 사용하기
- 요약
- 추가 자료
- 21장. 실시간 프로그래밍
- 기술적 요구 사항
- 실시간이란 무엇인가?
- 비결정성의 원인 식별하기
- 스케줄링 지연 이해하기
- 커널 선점
- 실시간 리눅스 커널(PREEMPT_RT)
- 스레드 인터럽트 핸들러
- 선점 가능한 커널 잠금
- PREEMPT_RT 패치 가져오기
- Yocto 프로젝트와 PREEMPT_RT
- 고해상도 타이머
- 페이지 폴트 피하기
- 인터럽트 쉴딩
- 스케줄링 지연 측정하기
- cyclictest
- Ftrace
- cyclictest와 Ftrace를 함께 사용하기
- 요약
도서 오류 신고
정오표
정오표
[p.104 그림3.1 NOR 플래시]
0ffffffff
->
0xffffffff