임베디드 리눅스 프로그래밍 완전정복
도서명:임베디드 리눅스 프로그래밍 완전정복
저자/출판사:크리스,시먼즈/에이콘출판
쪽수:588쪽
출판일:2019-01-30
ISBN:9791161752549
목차
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 결합
__더 읽을거리
__요약