목차 일부
추천의 글 ... 4
저자 소개 ... 7
감사의 글 ... 8
옮긴이 소개 ... 10
옮긴이의 말 ... 11
1장 리눅스 커널 입문 ... 35
유닉스의 역사 ... 37
리눅스의 개발 ... 39
운영체제와 커널 ... 41
리눅스 커널과 전통적인 유닉스 커널 ... 43
리눅스 커널 버전 ... 46
리눅스 커널 개...
더보기
목차 전체
추천의 글 ... 4
저자 소개 ... 7
감사의 글 ... 8
옮긴이 소개 ... 10
옮긴이의 말 ... 11
1장 리눅스 커널 입문 ... 35
유닉스의 역사 ... 37
리눅스의 개발 ... 39
운영체제와 커널 ... 41
리눅스 커널과 전통적인 유닉스 커널 ... 43
리눅스 커널 버전 ... 46
리눅스 커널 개발 공동체 ... 48
시작하기 전에 ... 48
2장 커널과의 첫 만남 ... 51
커널 소스 구하기 ... 53
Git ... 53
커널 소스 설치 ... 54
패치 ... 55
커널 소스 트리 ... 55
커널 빌드 ... 56
커널 설정 ... 56
빌드 메시지 최소화 ... 59
빌드 작업을 동시에 여러 개 실행 ... 59
새 커널 설치 ... 60
다른 성질의 야수 ... 61
libc와 표준 헤더 파일을 사용할 수 없음 ... 61
GNU C ... 63
인라인 함수 ... 63
인라인 어셈블리 ... 64
분기 구문 표시 ... 64
메모리 보호 없음 ... 65
부동 소수점을 쉽게 사용할 수 없음 ... 66
작은 고정 크기의 스택 ... 66
동기화와 동시성 ... 67
이식성의 중요성 ... 67
결론 ... 68
3장 프로세스 관리 ... 69
프로세스 ... 71
프로세스 서술자와 태스크 구조체 ... 73
프로세스 서술자의 할당 ... 74
프로세스 서술자 저장 ... 75
프로세스 상태 ... 77
현재 프로세스 상태 조작 ... 78
프로세스 컨텍스트 ... 79
프로세스 계층 트리 ... 79
프로세스 생성 ... 81
Copy-on-Write ... 82
프로세스 생성 ... 82
vfork() ... 84
리눅스의 스레드 구현 ... 85
스레드 생성 ... 86
커널 스레드 ... 87
프로세스 종료 ... 89
프로세스 서술자 제거 ... 90
부모 없는 태스크의 딜레마 ... 91
결론 ... 94
4장 프로세스 스케줄링 ... 95
멀티태스킹 ... 97
리눅스의 프로세스 스케줄러 ... 98
정책 ... 99
입출력중심 프로세스와 프로세서중심 프로세스 ... 99
프로세스 우선순위 ... 100
타임슬라이스 ... 101
스케줄러 정책의 동작 ... 102
리눅스 스케줄링 알고리즘 ... 104
스케쥴러 클래스 ... 104
유닉스 시스템의 프로세스 스케줄링 ... 104
공정 스케줄링 ... 107
리눅스 스케줄링 구현 ... 109
시간 기록 ... 109
스케줄러 단위 구조체 ... 109
가상 실행시간 ... 110
프로세스 선택 ... 112
다음 작업 선택 ... 113
트리에 프로세스 추가 ... 114
트리에서 프로세스 제거 ... 116
스케줄러 진입 위치 ... 117
휴면과 깨어남 ... 119
대기열 ... 119
깨어남 ... 123
선점과 컨텍스트 전환 ... 124
사용자 선점 ... 125
커널 선점 ... 125
실시간 스케줄링 정책 ... 127
스케줄러 관련 시스템 호출 ... 128
스케줄링 정책과 우선순위 관련 시스템 호출 ... 129
프로세서 지속성 관련 시스템 호출 ... 130
프로세서 시간 양보 ... 130
결론 ... 131
5장 시스템 호출 ... 133
커널과 통신 ... 135
API, POSIX, C 라이브러리 ... 136
시스콜 ... 137
시스템 호출 번호 ... 138
시스템 호출 성능 ... 139
시스템 호출 핸들러 ... 139
알맞은 시스템 호출 찾기 ... 140
매개변수 전달 ... 141
시스템 호출 구현 ... 142
시스템 호출 구현 ... 142
매개변수 검사 ... 143
시스템 호출 컨텍스트 ... 147
시스템 호출 등록을 위한 마지막 단계 ... 148
사용자 공간에서 시스템 호출 ... 151
시스템 호출을 구현하지 말아야 하는 이유 ... 152
결론 ... 153
6장 커널 자료 구조 ... 155
연결 리스트 ... 157
단일 연결 리스트와 이중 연결 리스트 ... 157
환형 연결 리스트 ... 158
연결 리스트 내에서 이동 ... 159
리눅스 커널의 구현 방식 ... 160
연결 리스트 구조체 ... 161
연결 리스트 정의 ... 161
리스트 헤드 ... 163
연결 리스트 조작 ... 164
연결 리스트에 노드 추가 ... 164
연결 리스트에서 노드 제거 ... 165
연결 리스트의 노드 이동과 병합 ... 166
연결 리스트 탐색 ... 167
기본 방식 ... 167
실제 사용하는 방식 ... 168
역방향으로 리스트 탐색 ... 169
제거하면서 탐색 ... 170
다른 연결 리스트 함수 ... 171
큐 ... 171
kfifo ... 172
큐 생성 ... 173
큐에 데이터 넣기 ... 174
큐에서 데이터 빼기 ... 174
큐의 크기 알아내기 ... 175
큐 재설정과 큐 삭제 ... 176
큐 사용 예제 ... 176
맵 ... 177
idr 초기화 ... 178
새로운 UID 할당 ... 179
UID 찾기 ... 181
UID 제거 ... 181
idr 제거 ... 181
이진 트리 ... 182
이진 탐색 트리 ... 183
자가 균형 이진 탐색 트리 ... 183
레드블랙 트리 ... 184
rbtree ... 185
어떤 자료 구조를 언제 사용할 것인가? ... 188
알고리즘 복잡도 ... 189
알고리즘 ... 189
O 표기법 ... 189
빅 세타 표기법 ... 190
시간 복잡도 ... 191
결론 ... 192
7장 인터럽트와 인터럽트 핸들러 ... 193
인터럽트 ... 195
인터럽트 핸들러 ... 196
전반부 처리와 후반부 처리 ... 197
인터럽트 핸들러 등록 ... 198
인터럽트 핸들러 플래그 ... 199
인터럽트 예제 ... 201
인터럽트 핸들러 해제 ... 201
인터럽트 핸들러 작성 ... 202
공유 핸들러 ... 203
인터럽트 핸들러의 실제 예 ... 204
인터럽트 컨텍스트 ... 207
인터럽트 핸들러 구현 ... 208
/proc/interrupts ... 212
인터럽트 제어 ... 213
인터럽트 활성화와 비활성화 ... 214
특정 인터럽트 비활성화 ... 216
인터럽트 시스템 상태 ... 217
결론 ... 218
8장 후반부 처리와 지연된 작업 ... 221
후반부 처리 ... 223
왜 후반부 처리를 하는가? ... 224
후반부 처리의 세계 ... 225
원래의 '후반부 처리' ... 225
태스크 큐 ... 226
softirq와 태스크릿 ... 226
혼란스러움을 떨쳐내기 ... 227
softirq ... 228
softirq 구현 ... 228
softirq 핸들러 ... 229
softirq 실행 ... 229
softirq 사용 ... 231
인덱스 할당 ... 231
핸들러 등록 ... 232
softirq 올림 ... 233
태스크릿 ... 234
태스크릿 구현 ... 234
태스크릿 구조체 ... 234
태스크릿 스케줄링 ... 235
태스크릿 사용 ... 237
태스크릿 선언 ... 237
태스크릿 핸들러 작성 ... 238
태스크릿 스케줄링 ... 239
ksoftirqd ... 240
구식 BH 처리 방식 ... 242
워크 큐 ... 243
워크 큐 구현 ... 244
스레드 표현 자료 구조 ... 244
작업 표현 자료 구조 ... 245
워크 큐 구현 정리 ... 247
워크 큐 사용 ... 249
작업 생성 ... 249
워크 큐 핸들러 ... 249
작업 스케줄링 ... 250
작업 비우기 ... 250
새로운 워크 큐 만들기 ... 251
구식 태스크 큐 방식 ... 252
어떤 후반부 처리 방식을 사용할 것인가? ... 253
후반부 처리 작업 사이의 락 ... 254
후반부 처리 비활성화 ... 255
결론 ... 258
9장 커널 동기화 개요 ... 259
위험 지역과 경쟁 조건 ... 261
왜 보호 장치가 필요한가? ... 262
단일 변수 ... 263
락 ... 265
동시성의 원인 ... 267
보호 대상 인식 ... 268
데드락 ... 270
경쟁과 확장성 ... 272
결론 ... 274
10장 커널 동기화 방법 ... 275
원자적 동작 ... 277
원자적 정수 연산 ... 278
64비트 원자적 연산 ... 282
원자적 비트 연산 ... 283
스핀락 ... 286
스핀락 사용 방법 ... 287
그 밖의 스핀락 함수 ... 290
스핀락과 후반부 처리 ... 291
리더 - 라이터 스핀락 ... 291
세마포어 ... 294
카운팅 세마포어와 바이너리 세마포어 ... 296
세마포어 생성과 초기화 ... 297
세마포어 ... 297
리더-라이터 세마포어 ... 299
뮤텍스 ... 301
세마포어와 뮤텍스 ... 303
스핀락과 뮤텍스 ... 303
완료 변수 ... 304
큰 커널 락 ... 305
순차적 락 ... 307
선점 비활성화 ... 309
순차성과 배리어 ... 311
결론 ... 315
11장 타이머와 시간 관리 ... 317
커널의 시간의 개념 ... 319
진동수: HZ ... 320
이상적인 HZ 값 ... 322
큰 HZ 값의 장점 ... 323
큰 HZ 값의 단점 ... 324
지피 ... 325
지피의 내부 표현 ... 326
지피 값 되돌아감 ... 328
사용자 공간과 HZ 값 ... 330
하드웨어 시계와 타이머 ... 331
실시간 시계 ... 331
시스템 타이머 ... 331
타이머 인터럽트 핸들러 ... 332
날짜와 시간 ... 335
타이머 ... 338
타이머 사용 ... 338
타이머 경쟁 조건 ... 341
타이머 구현 ... 341
실행 지연 ... 342
루프 반복 ... 342
작은 지연 ... 344
schedule_timeout() ... 346
schedule_timeout() 구현 ... 346
만료시간을 가지고 대기열에서 휴면 ... 348
결론 ... 349
12장 메모리 관리 ... 351
페이지 ... 353
구역 ... 355
페이지 가져오기 ... 359
0으로 채워진 페이지 얻기 ... 360
페이지 반환 ... 360
kmalloc() ... 362
gfp_mask 플래그 ... 363
동작 지정자 ... 363
구역 지정자 ... 364
형식 플래그 ... 365
kfree() ... 368
vmalloc() ... 369
슬랩 계층 ... 371
슬랩 계층 설계 ... 372
슬랩 할당자 인터페이스 ... 376
캐시에서 할당 ... 378
슬랩 할당자 사용 예제 ... 378
스택에 정적으로 할당 ... 380
단일 페이지 커널 스택 ... 380
공정하게 스택 사용 ... 381
상위 메모리 연결 ... 382
고정 연결 ... 382
임시 연결 ... 383
CPU별 할당 ... 384
새로운 percpu 인터페이스 ... 385
컴파일 시점의 CPU별 데이터 ... 386
실행 시점의 CPU별 데이터 ... 387
CPU별 데이터를 사용하는 이유 ... 389
할당 방법 선택 ... 390
결론 ... 391
13장 가상 파일시스템 ... 393
일반 파일시스템 인터페이스 ... 395
파일시스템 추상화 계층 ... 396
유닉스 파일시스템 ... 397
VFS 객체와 자료 구조 ... 399
슈퍼블록 객체 ... 401
슈퍼블록 동작 ... 403
아이노드 객체 ... 406
아이노드 동작 ... 408
덴트리 객체 ... 412
덴트리 상태 ... 414
덴트리 캐시 ... 414
덴트리 동작 ... 416
파일 객체 ... 418
파일 동작 ... 419
파일시스템 관련 자료 구조 ... 426
프로세스 관련 자료구조 ... 428
결론 ... 430
14장 블록 입출력 계층 ... 433
블록 장치 구조 ... 435
버퍼와 버퍼 헤드 ... 437
bio 구조체 ... 440
입출력 벡터 ... 442
신구 버전 비교 ... 443
요청 큐 ... 444
입출력 스케줄러 ... 445
입출력 스케줄러가 하는 일 ... 445
리누스 엘리베이터 ... 446
데드라인 입출력 스케줄러 ... 448
예측 입출력 스케줄러 ... 450
완전 공정 큐 입출력 스케줄러 ... 452
무동작 입출력 스케줄러 ... 452
입출력 스케줄러 선택 ... 453
결론 ... 454
15장 프로세스 주소 공간 ... 455
주소 공간 ... 457
메모리 서술자 ... 458
메모리 서술자 할당 ... 461
메모리 서술자 해제 ... 462
mm_struct 구조체와 커널 스레드 ... 462
가상 메모리 영역 ... 463
VMA 플래그 ... 464
VMA 동작 ... 466
메모리 영역 리스트와 트리 ... 468
실제 메모리 영역 ... 468
메모리 영역 다루기 ... 471
find_vma() ... 471
find_vma_prev() ... 473
find_vma_intersection() ... 473
mmap()와 do_mmap(): 주소 범위 생성 ... 474
munmap()와 do_munmap(): 주소 범위 해제 ... 476
페이지 테이블 ... 477
결론 ... 479
16장 페이지 캐시와 페이지 지연 기록 ... 481
캐시 사용 방식 ... 483
쓰기 캐시 ... 484
캐시 축출 ... 485
가장 오래 전에 사용한 항목 제거 ... 485
이중 리스트 전략 ... 486
리눅스 페이지 캐시 ... 487
address_space 객체 ... 487
address_space 동작 ... 489
기수 트리 ... 492
구식 페이지 해시 테이블 ... 492
버퍼 캐시 ... 493
플러시 스레드 ... 494
랩탑 모드 ... 496
역사: bdflush, kupdated, pdflush ... 487
다중 스레드 환경의 경쟁 상태 회피 ... 498
결론 ... 499
17장 장치와 모듈 ... 501
장치 유형 ... 503
모듈 ... 504
Hello, World! ... 505
모듈 만들기 ... 507
소스 트리에 들어 있는 경우 ... 507
소스 트리 외부에 있는 경우 ... 509
모듈 설치 ... 510
모듈 의존성 생성 ... 510
모듈 적재 ... 511
설정 옵션 관리 ... 512
모듈 인자 ... 515
노출 심볼 ... 517
장치 모델 ... 519
Kobjects ... 519
Ktypes ... 521
Ksets ... 522
kobject, ktype, kset의 상관 관계 ... 523
kobject 관리와 변경 ... 524
참조 횟수 ... 525
참조 횟수 증감 ... 526
krefs ... 526
sysfs ... 528
sysfs에 kobject 추가와 제거 ... 531
sysfs에 파일 추가 ... 532
기본 속성 ... 532
새로운 속성 만들기 ... 533
속성 제거 ... 534
sysfs 관례 ... 535
커널 이벤트 계층 ... 537
결론 ... 538
18장 디버깅 ... 539
시작하기 ... 541
커널 버그 ... 542
출력을 이용한 디버깅 ... 543
견고함 ... 543
로그수준 ... 544
로그 버퍼 ... 545
syslogd와 klogd ... 546
printf()와 printk() 사용 혼동 ... 546
웁스 ... 546
ksymoops ... 548
kallsyms ... 549
커널 디버깅 옵션 ... 550
버그 확인과 정보 추출 ... 551
만능 SysRq 키 ... 552
커널 디버거의 전설 ... 553
gdb ... 554
kgdb ... 555
시스템 찔러 보기와 조사 ... 555
조건에 따른 UID 사용 ... 555
조건 변수 ... 556
통계 ... 556
디버깅 작업의 빈도와 발생 제한 ... 557
문제를 일으킨 변경 사항을 찾기 위한 이진 탐색 ... 559
Git을 사용한 이진 탐색 ... 560
모든 방법이 실패했을 때: 공동체 ... 561
결론 ... 561
19장 이식성 ... 563
이식성 있는 운영체제 ... 565
리눅스 이식성의 역사 ... 567
워드 크기와 데이터 형 ... 568
불투명 데이터 형 ... 571
특수 데이터 형 ... 572
명시적으로 크기가 정해진 데이터 형 ... 572
문자 데이터 형의 부호유무 ... 574
데이터 정렬 ... 575
정렬 문제 피하기 ... 575
비표준 데이터 형의 정렬 ... 576
구조체 채우기 ... 576
바이트 순서 ... 578
시간 ... 581
페이지 크기 ... 582
프로세서 순서 ... 583
SMP, 커널 선점, 상위 메모리 ... 583
결론 ... 584
20장 패치, 해킹, 공동체 ... 585
공동체 ... 587
리눅스 코딩 스타일 ... 588
들여쓰기 ... 588
switch 구문 ... 589
공백 ... 589
괄호 ... 591
줄 길이 ... 593
명명 방식 ... 593
함수 ... 594
주석 ... 594
형 지정 ... 596
기존 함수 사용 ... 596
소스에서 ifdef 사용 최소화 ... 596
구조체 초기화 ... 597
과거에 작성한 코드 소급 적용 ... 598
지휘 계통 ... 598
버그 리포트 제출 ... 599
패치 ... 599
패치 만들기 ... 599
Git을 사용해 패치 생성 ... 600
패치 제출 ... 602
결론 ... 603
참고문헌 ... 604
찾아보기 ... 609
더보기 닫기