목차
용어 대역표 ... 17
서문 ... 29
시작하면서 ... 31
감사의 글 ... 38
저자 소개 ... 40
Chapter 1 소개
   1.1 왜 리눅스인가? ... 42
   1.2 <B><FONT color ... #0000
   1.3 오픈 소스와 GPL ... 43
      1.3.1 무료와 자유 ... 45
   1.4 표준 및 관련 조직 ... 45
      1.4.1 리눅스 기본 규격 ... 45
      1.4.2 오픈 소스 개발 연구소 ... 46
   1.5 요약 ... 48
      1.5.1 더 읽어 보기 ... 48
Chapter 2 임베디드 처음 경험하기
   2.1 임베디드와 임베디드가 아닌 것? ... 50
      2.1.1 BIOS와 부트로더 ... 51
   2.2 임베디드 시스템 해부 ... 52
      2.2.1 전형적인 <B><FONT color ... #0000
      2.2.2 타깃 보드 구동하기 ... 55
      2.2.3 커널 부팅하기 ... 56
      2.2.4 커널 초기화 : 요약 ... 58
      2.2.5 첫 번째 사용자 영역 프로세스 : init ... 59
   2.3 저장 장치 ... 60
      2.3.1 플래시 메모리 ... 60
      2.3.2 NAND 플래시 ... 63
      2.3.3 플래시의 사용 ... 64
      2.3.4 플래시 파일 시스템 ... 65
      2.3.5 메모리 공간 ... 66
      2.3.6 실행 컨텍스트 ... 68
      2.3.7 프로세스 가상 메모리 ... 70
      2.3.8 교차-개발 환경 ... 72
   2.4 <B><FONT color ... #0000
      2.4.1 상용 리눅스 배포판 ... 76
      2.4.2 직접 만드는 리눅스 배포판 ... 76
   2.5 요약 ... 77
      2.5.1 더 읽어 보기 ... 78
Chapter 3 프로세서 기본
   3.1 독립형 프로세서 ... 80
      3.1.1 IBM 970FX ... 81
      3.1.2 인텔 펜티엄 M ... 81
      3.1.3 프리스케일 MPC7448 ... 82
      3.1.4 보조 칩셋 ... 83
   3.2 통합형 프로세서 : 시스템 온 칩 ... 86
      3.2.1 PowerPC ... 86
      3.2.2 AMCC PowerPC ... 87
      3.2.3 프리스케일 PowerPC ... 90
      3.2.4 MIPS ... 95
      3.2.5 브로드컴 MIPS ... 96
      3.2.6 AMD MIPS ... 98
      3.2.7 기타 MIPS ... 99
      3.2.8 ARM ... 100
      3.2.9 TI ARM ... 100
      3.2.10 프리스케일 ARM ... 102
      3.2.11 인텔 ARM 엑스스케일 ... 103
      3.2.12 기타 ARM ... 104
      3.2.13 기타 아키텍처 ... 104
   3.3 하드웨어 플랫폼 ... 105
      3.3.1 CompactPCI ... 105
      3.3.2 ATCA ... 105
   3.4 요약 ... 107
      3.4.1 더 읽어 보기 ... 107
Chapter 4 다른 관점에서 본 리눅스 커널
   4.1 배경 ... 110
      4.1.1 커널 버전 ... 111
      4.1.2 커널 소스 저장소 ... 114
   4.2 리눅스 커널의 구성 ... 115
      4.2.1 최상위 소스 디렉터리 ... 115
      4.2.2 커널 컴파일하기 ... 116
      4.2.3 커널 단일파일 : vmlinux ... 119
      4.2.4 커널 이미지 구성 요소 ... 120
      4.2.5 하위 디렉터리 구성 ... 124
   4.3 커널 빌드 시스템 ... 125
      4.3.1 점-Config 파일 ... 125
      4.3.2 구성 편집기 ... 127
      4.3.3 Makefile 타깃 ... 131
      4.3.4 커널 구성 ... 135
      4.3.5 구성 옵션 직접 만들기 ... 137
      4.3.6 커널 Makefile ... 141
      4.3.7 커널 문서화 ... 142
   4.4 리눅스 커널 구하기 ... 143
      4.4.1 추가적으로 더 필요한 것은 ... 143
   4.5 요약 ... 144
      4.5.1 더 읽어 보기 ... 145
Chapter 5 커널 초기화
   5.1 복합적인 커널 이미지 : piggy와 그 외 오브젝트 파일 ... 148
      5.1.1 Image 오브젝트 ... 151
      5.1.2 아키텍처 오브젝트 ... 152
      5.1.3 부트스트랩 로더 ... 153
      5.1.4 부트 메시지 ... 155
   5.2 초기화 단계의 제어 흐름 ... 158
      5.2.1 커널 진입점 : head.o ... 160
      5.2.2 커널 스타트업 : main.c ... 162
      5.2.3 아키텍처 셋업 ... 163
   5.3 커널 커맨드 라인 처리하기 ... 164
      5.3.1 _setup 매크로 ... 166
   5.4 서브시스템 초기화 ... 172
      5.4.1 *_initcall 매크로 ... 173
   5.5 init 쓰레드 ... 175
      5.5.1 initcall을 이용한 초기화 ... 177
      5.5.2 마지막 부팅 단계 ... 178
   5.6 요약 ... 180
      5.6.1 더 읽어 보기 ... 181
Chapter 6 시스템 초기화
   6.1 루트 파일 시스템 ... 184
      6.1.1 FHS : 파일 시스템 계층 표준 ... 185
      6.1.2 파일 시스템 배치 ... 185
      6.1.3 최소 파일 시스템 ... 187
      6.1.4 루트 파일 시스템의 도전 과제 ... 189
      6.1.5 시행착오를 반복하는 방법 ... 190
      6.1.6 자동화된 파일 시스템 제작 툴 ... 190
   6.2 커널의 마지막 부팅 단계 ... 190
      6.2.1 최초 사용자 영역 프로그램 ... 192
      6.2.2 의존성 해결 ... 193
      6.2.3 초기화 과정 수정하기 ... 194
   6.3 Init 프로세스 ... 194
      6.3.1 inittab ... 197
      6.3.2 웹 서버 시작 스크립트의 예 ... 199
   6.4 초기 램디스크 ... 201
      6.4.1 초기 램디스크의 용도 ... 202
      6.4.2 initrd로 부팅하기 ... 202
      6.4.3 initrd를 지원하는 부트로더 ... 204
      6.4.4 initrd의 마법 : linuxrc ... 205
      6.4.5 initrd 구성 ... 207
      6.4.6 initrd 이미지 만들기 ... 208
   6.5 initramfs 사용하기 ... 209
   6.6 종료 ... 210
   6.7 요약 ... 211
      6.7.1 더 읽어 보기 ... 212
Chapter 7 부트로더
   7.1 부트로더의 역할 ... 214
   7.2 부트로더의 도전 과제 ... 215
      7.2.1 DRAM 컨트롤러 ... 215
      7.2.2 플래시와 RAM ... 216
      7.2.3 이미지 복잡도 ... 217
      7.2.4 실행 컨텍스트 ... 220
   7.3 유니버설 부트로더 : Das U-Boot ... 221
      7.3.1 시스템 구성 : U-Boot ... 221
      7.3.2 U-Boot 명령어 셋 ... 224
      7.3.3 네트워크 동작 ... 225
      7.3.4 저장 장치 서브시스템 ... 228
      7.3.5 디스크로부터 부팅하기 ... 229
   7.4 U-Boot 포팅하기 ... 229
      7.4.1 EP405를 위한 U-Boot 포팅 ... 230
      7.4.2 U-Boot makefile의 구성 타깃 ... 232
      7.4.3 EP405 프로세서 초기화 ... 233
      7.4.4 보드에 따른 초기화 ... 236
      7.4.5 포팅 요약 ... 240
      7.4.6 U-Boot 이미지 형식 ... 241
   7.5 기타 부트로더 ... 243
      7.5.1 Lilo ... 243
      7.5.2 GRUB ... 244
      7.5.3 더 많은 부트로더 ... 246
   7.6 요약 ... 247
      7.6.1 더 읽어 보기 ... 248
Chapter 8 디바이스 드라이버 기초
   8.1 디바이스 드라이버의 개념 ... 252
      8.1.1 로드 가능한 모듈 ... 253
      8.1.2 디바이스 드라이버 아키텍처 ... 254
      8.1.3 최소 디바이스 드라이버 예제 ... 254
      8.1.4 모듈 빌드를 위한 기반 ... 255
      8.1.5 디바이스 드라이버 설치하기 ... 260
      8.1.6 모듈 로드하기 ... 261
   8.2 모듈 유틸리티 ... 262
      8.2.1 insmod ... 262
      8.2.2 모듈 파라미터 ... 262
      8.2.3 lsmod ... 264
      8.2.4 modprobe ... 265
      8.2.5 depmod ... 266
      8.2.6 rmmod ... 267
      8.2.7 modinfo ... 268
   8.3 드라이버의 메서드 ... 269
      8.3.1 드라이버의 파일 시스템 오퍼레이션 ... 269
      8.3.2 디바이스 노드와 mknod ... 273
   8.4 한데 묶기 ... 274
   8.5 디바이스 드라이버와 GPL ... 276
   8.6 요약 ... 277
      8.6.1 더 읽어 보기 ... 278
Chapter 9 파일 시스템
   9.1 리눅스 파일 시스템의 개념 ... 280
      9.1.1 파티션 ... 281
   9.2 ext2 ... 283
      9.2.1 파일 시스템 마운트하기 ... 284
      9.2.2 파일 시스템 무결성 검사 ... 286
   9.3 ext3 ... 288
   9.4 ReiserFS ... 291
   9.5 JFFS2 ... 292
   9.6 cramfs ... 295
   9.7 네트워크 파일 시스템(NFS) ... 298
      9.7.1 NFS를 이용한 루트 파일 시스템 ... 300
   9.8 의사 파일 시스템 ... 303
      9.8.1 Proc 파일 시스템 ... 303
      9.8.2 sysfs ... 307
   9.9 기타 파일 시스템 ... 310
   9.10 간단한 파일 시스템 만들기 ... 311
   9.11 요약 ... 313
      9.11.1 더 읽어 보기 ... 314
Chapter 10 MTD 서브시스템
   10.1 MTD 서비스 활성화하기 ... 318
      10.1.1 MTD 만들기 ... 320
   10.2 MTD 기초 ... 321
      10.2.1 MTD 구성하기 ... 324
   10.3 MTD 파티션 ... 324
      10.3.1 Redboot 파티션 테이블 나누기 ... 325
      10.3.2 커널 커맨드 라인에서 파티션 생성하기 ... 330
      10.3.3 매핑 드라이버 ... 331
      10.3.4 플래시 칩 드라이버 ... 334
      10.3.5 보드에 따른 초기화 ... 335
   10.4 MTD 유틸리티 ... 336
      10.4.1 JFFS2 루트 파일 시스템 ... 340
   10.5 요약 ... 342
      10.5.1 더 읽어 보기 ... 343
Chapter 11 BusyBox
   11.1 BusyBox 소개 ... 346
      11.1.1 BusyBox는 쉽다 ... 347
   11.2 BusyBox 구성하기 ... 347
      11.2.1 BusyBox 교차 - 컴파일하기 ... 349
   11.3 BusyBox의 기능 ... 350
      11.3.1 BusyBox Init ... 353
      11.3.2 rcS 초기화 스크립트 예제 ... 356
      11.3.3 BusyBox를 타깃 보드에 설치하기 ... 357
      11.3.4 BusyBox 명령어 ... 359
   11.4 요약 ... 361
      11.4.1 더 읽어 보기 ... 361
Chapter 12 임베디드 개발 환경
   12.1 교차-개발 환경 ... 364
      12.1.1 임베디드 "Hello World" ... 365
   12.2 호스트 시스템 요구 사항 ... 369
      12.2.1 하드웨어 디버깅 장비 ... 370
   12.3 타깃 보드 호스팅하기 ... 370
      12.3.1 TFTP 서버 ... 371
      12.3.2 BOOTP/DHCP 서버 ... 372
      12.3.3 NFS 서버 ... 375
      12.3.4 타깃 시스템에 NFS 루트 파일 시스템 마운트하기 ... 377
      12.3.5 U-Boot를 이용한 NFS 루트 파일 시스템 마운트 예제 ... 379
   12.4 요약 ... 381
      12.4.1 더 읽어 보기 ... 382
Chapter 13 개발 도구
   13.1 GNU 디버거(GDB) ... 384
      13.1.1 코어 덤프 디버그하기 ... 385
      13.1.2 GDB 실행하기 ... 387
      13.1.3 GDB의 디버그 세션 ... 390
   13.2 데이터 표시 디버거 ... 392
   13.3 cbrowser/cscope ... 395
   13.4 추적 및 프로파일링 도구 ... 396
      13.4.1 strace ... 397
      13.4.2 strace의 다양한 기능 ... 401
      13.4.3 ltrace ... 404
      13.4.4 ps ... 405
      13.4.5 top ... 408
      13.4.6 mtrace ... 410
      13.4.7 dmalloc ... 412
      13.4.8 커널 웁스(Oops) ... 416
   13.5 바이너리 유틸리티 ... 419
      13.5.1 readelf ... 419
      13.5.2 readelf를 이용해서 디버깅 정보 보기 ... 421
      13.5.3 objdump ... 424
      13.5.4 objcopy ... 425
   13.6 기타 바이너리 유틸리티 ... 425
      13.6.1 strip ... 426
      13.6.2 addr2line ... 426
      13.6.3 strings ... 427
      13.6.4 ldd ... 427
      13.6.5 nm ... 428
      13.6.6 prelink ... 429
   13.7 요약 ... 430
      13.7.1 더 읽어 보기 ... 430
Chapter 14 커널 디버깅 기술
   14.1 커널 디버깅의 어려움 ... 434
   14.2 KGDB를 이용한 커널 디버깅 ... 435
      14.2.1 KGDB 커널 구성 ... 437
      14.2.2 KGDB를 활성화시킨 타깃 부팅하기 ... 438
      14.2.3 유용한 커널 브레이크 포인트 ... 441
   14.3 리눅스 커널 디버깅하기 ... 442
      14.3.1 gdb 원격 시리얼 프로토콜 ... 444
      14.3.2 최적화된 커널 코드 디버깅하기 ... 447
      14.3.3 gdb 사용자 정의 명령어 ... 454
      14.3.4 유용한 커널 gdb 매크로 ... 455
      14.3.5 적재 가능 모듈 디버깅하기 ... 465
      14.3.6 printk 디버깅 ... 470
      14.3.7 매직 SysReq 키 ... 471
   14.4 하드웨어를 이용한 디버깅 ... 473
      14.4.1 JTAG 프로브를 이용해서 플래시 기록하기 ... 475
      14.4.2 JTAG 프로브를 이용한 디버깅 ... 476
   14.5 부팅이 되지 않을 때 ... 481
      14.5.1 초기 시리얼 디버그 출력 ... 481
      14.5.2 printk 로그 버퍼의 내용 덤프하기 ... 483
      14.5.3 커널 패닉에서 KGDB 사용하기 ... 485
   14.6 요약 ... 486
      14.6.1 더 읽어 보기 ... 487
Chapter 15 <B><FONT color ... #0000
   15.1 타깃 디버깅 ... 490
   15.2 원격(교차) 디버깅 ... 490
      15.2.1 gdbserver ... 493
   15.3 공유 라이브러리 디버깅 ... 496
      15.3.1 GDB의 공유 라이브러리 이벤트 ... 498
   15.4 여러 태스크 디버깅하기 ... 502
      15.4.1 다중 프로세스 디버깅 ... 502
      15.4.2 다중 쓰레드 어플리케이션 디버깅 ... 505
      15.4.3 부트로더 및 플래시에 있는 코드 디버깅 ... 509
   15.5 추가 원격 디버그 옵션 ... 510
      15.5.1 시리얼 포트로 디버깅하기 ... 510
      15.5.2 실행중인 프로세스에 연결하기 ... 510
   15.6 요약 ... 511
      15.6.1 더 읽어 보기 ... 512
Chapter 16 리눅스 포팅
   16.1 리눅스 소스 코드의 구조 ... 514
      16.1.1 아키텍처 브렌치 ... 514
   16.2 자체 보드를 위한 리눅스 ... 517
      16.2.1 선행 조건과 가정 ... 517
      16.2.2 커널 초기화 커스터마이징 ... 519
      16.2.3 정적인 커널 커맨드 라인 ... 522
   16.3 플랫폼 초기화 ... 524
      16.3.1 초기 변수 접근 ... 528
      16.3.2 보드의 정보 구조 ... 530
      16.3.3 머신 종속적인 호출 ... 532
   16.4 한데 묶기 ... 534
      16.4.1 기타 아키텍처 ... 537
   16.5 요약 ... 537
      16.5.1 더 읽어 보기 ... 538
Chapter 17 리눅스와 리얼 타임
   17.1 리얼 타임 ... 540
      17.1.1 소프트 리얼 타임 ... 540
      17.1.2 하드 리얼 타임 ... 541
      17.1.3 리눅스의 스케줄링 ... 541
      17.1.4 지연 ... 541
   17.2 커널 선점 ... 543
      17.2.1 선점의 장애물 ... 544
      17.2.2 선점 모델 ... 545
      17.2.3 SMP 커널 ... 547
      17.2.4 선점 지연의 원인 ... 548
   17.3 리얼 타임 커널 패치 ... 548
      17.3.1 리얼 타임 기능 ... 550
      17.3.2 O(1) 스케줄러 ... 553
      17.3.3 리얼 타임 프로세스 생성하기 ... 553
      17.3.4 크리티컬 섹션 관리 ... 555
   17.4 리얼 타임 커널 디버깅하기 ... 556
      17.4.1 소프트 락업 감지 ... 556
      17.4.2 선점 디버깅 ... 557
      17.4.3 깨어나는 시간 디버깅 ... 557
      17.4.4 깨어나는 지연 시간 기록 ... 558
      17.4.5 인터럽트 차단 시간 ... 558
      17.4.6 인터럽트 차단 시간 기록 ... 559
      17.4.7 지연 시간 추적 ... 561
      17.4.8 데드락 상태 디버깅하기 ... 563
      17.4.9 락 모드 제어하기 ... 563
   17.5 요약 ... 564
      17.5.1 더 읽어 보기 ... 564
Appendix A GNU 일반 공중 사용 허가서
   전문 ... 567
   복제와 개작 및 배포에 관한 조건과 규정 ... 569
   보증의 결여(제11조, 제12조) ... 574
Appendix B U-Boot의 구성 가능 명령어 셋 ... 577
Appendix C BusyBox 명령어 ... 581
Appendix D SDRAM 인터페이스 고려 사항
   D.1 SDRAM 기초 ... 592
      D.1.1 SDRAM 리프레시 ... 593
   D.2 클럭 ... 594
   D.3 SDRAM 설정 ... 596
   D.4 요약 ... 601
      D.4.1 더 읽어 보기 ... 601
Appendix E 오픈 소스 리소스
   소스 저장소 및 개발자 정보 ... 604
   메일링 리스트 ... 604
   리눅스 뉴스 및 개발 정보 ... 605
   오픈 소스에 대한 이해 및 토론 ... 605
Appendix F 예제 BDI-2000 구성 파일 ... 607
찾아보기 ... 615
닫기