목차 일부
용어 대역표 ... 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 표준 및 관련 조직 ...
더보기
목차 전체
용어 대역표 ... 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
더보기 닫기