상품 정보
상품 기본설명
단계별로 따라 하는
상품 상세설명
임베디드 리눅스를 이용해서 장치를 만들 때 고려할 하드웨어 관련 사항, 툴체인과 부트로더 선택, 커널 구성과 루트 파일시스템 생성, 빌드 시스템 선택, 플래시 메모리, 장치 드라이버, 시스템 부트 과정을 다룬다. 또한 만들어진 임베디드 리눅스 플랫폼 위에서 프로그래밍할 때 고려해야 할 프로세스와 스레드, 메모리 관리, 디버깅, 프로파일링, 실시간 프로그래밍 관련 내용도 다룬다. 2판에서는 OTA(over-the-air) 업데이트를 다루는 8장, ‘소프트웨어 업데이트’, 배터리 수명 연장과 에너지 절약을 통한 환경 보호에 도움이 되는 11장, ‘전원 관리’가 추가됐다.
목차
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 결합
__더 읽을거리
__요약
출판사 서평
★ 이 책에서 다루는 내용 ★■ 대부분의 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를 이용해 커널 대기시간을 측정하고 다양한 커널 구성의 효과를 보여준다.★ 옮긴이의 말 ★지난 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)는 리눅스와 윈도우만 지원할 뿐 그 밖의 유닉스는 지원하지 않는다. 메모리 크기만 다를 뿐 기본적인 작동 방식은 같으므로, 리눅스에 익숙하면 임베디드 시스템에서 서버까지 쉽게 적용해 사용할 수 있다는 뜻이다.
처음으로 임베디드 시스템 소프트웨어를 작성할 때에 비해 개발 환경이 많이 좋아지고 임베디드 시스템의 성능도 획기적으로 향상돼 응용할 수 있는 영역이 매우 넓어졌으므로 이 책을 통해 많은 분이 흥미로운 임베디드 시스템 소프트웨어를 개발할 수 있게 되기를 바란다.
-김기주
상품 정보 고시
도서명 |
임베디드 리눅스 프로그래밍 완전정복 2/e |
저자 |
크리스 시먼즈 |
출판사 |
에이콘출판 |
ISBN |
9791161752549 (1161752544) |
쪽수 |
588 |
출간일 |
2019-01-30 |
사이즈 |
187 * 235 * 35 mm /1078g |
목차 또는 책소개 |
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 결합 __더 읽을거리 __요약 |
교환/반품
[반품/교환방법]
마이페이지> 주문배송조회 > 반품/교환신청 또는 고객센터 (070-4680-5689)로 문의 바랍니다.
[반품주소]
- 도로명 : (10882) 경기도 파주시 산남로 62-20 (산남동)
- 지번 : (10882) 경기도 파주시 산남동 305-21
[반품/교환가능 기간]
변심반품의 경우 수령 후 14일 이내, 상품의 결함 및 계약내용과 다를 경우 문제점 발견 후 30일 이내
[반품/교환비용]
단순 변심 혹은 구매착오로 인한 반품/교환은 반송료 고객 부담
[반품/교환 불가 사유]
- 소비자의 책임 있는 사유로 상품 등이 손실 또는 훼손된 경우
(단지 확인을 위한 포장 훼손은 제외)
- 소비자의 사용, 포장 개봉에 의해 상품 등의 가치가 현저히 감소한 경우
예) 화장품, 식품, 가전제품(악세서리 포함) 등
- 복제가 가능한 상품 등의 포장을 훼손한 경우
예) 음반/DVD/비디오, 소프트웨어, 만화책, 잡지, 영상 화보집
- 소비자의 요청에 따라 개별적으로 주문 제작되는 상품의 경우 ((1)해외주문도서)
- 디지털 컨텐츠인 eBook, 오디오북 등을 1회 이상 다운로드를 받았을 경우
- 시간의 경과에 의해 재판매가 곤란한 정도로 가치가 현저히 감소한 경우
- 전자상거래 등에서의 소비자보호에 관한 법률이 정하는 소비자 청약철회 제한 내용에 해당되는 경우
* (1) 해외주문도서 : 이용자의 요청에 의한 개인주문상품으로 단순변심 및 착오로 인한 취소/교환/반품 시
‘해외주문 반품/취소 수수료’ 고객 부담 (해외주문 반품/취소 수수료 : ①양서-판매정가의 12%, ②일서-판매정가의 7%를 적용)
[상품 품절]
공급사(출판사) 재고 사정에 의해 품절/지연될 수 있으며, 품절 시 관련 사항에 대해서는 이메일과 문자로 안내드리겠습니다.
[소비자 피해보상, 환불지연에 따른 배상]
- 상품의 불량에 의한 교환, A/S, 환불, 품질보증 및 피해보상 등에 관한 사항은 소비자분쟁해결 기준 (공정거래위원회 고시)에 준하여 처리됩니다.
- 대금 환불 및 환불지연에 따른 배상금 지급 조건, 절차 등은 전자상거래 등에서의 소비자 보호에 관한 법률에 따라 처리함.