코드로 알아보는 ARM 리눅스 커널
2020년 01월 02일 출간
국내도서 : 2018년 05월 24일 출간
- eBook 상품 정보
- 파일 정보 PDF (13.61MB)
- ISBN 9791188621965
- 지원기기 교보eBook App, PC e서재, 리더기, 웹뷰어
-
교보eBook App
듣기(TTS) 가능
TTS 란?텍스트를 음성으로 읽어주는 기술입니다.
- 전자책의 편집 상태에 따라 본문의 흐름과 다르게 텍스트를 읽을 수 있습니다.
- 이미지 형태로 제작된 전자책 (예 : ZIP 파일)은 TTS 기능을 지원하지 않습니다.
PDF 필기가능 (Android, iOS)

쿠폰적용가 27,720원
10% 할인 | 5%P 적립이 상품은 배송되지 않는 디지털 상품이며,
교보eBook앱이나 웹뷰어에서 바로 이용가능합니다.
카드&결제 혜택
- 5만원 이상 구매 시 추가 2,000P
- 3만원 이상 구매 시, 등급별 2~4% 추가 최대 416P
- 리뷰 작성 시, e교환권 추가 최대 200원
작품소개
이 상품이 속한 분야
1.1 ARMv8 소개 4
1.1.1 익셉션 모델 5
1.1.2 익셉션 레벨 변경 6
1.1.3 실행 상태 7
1.1.4 실행 상태 변경 7
1.2 ARMv8 레지스터 8
1.2.1 프로세서 상태 레지스터(PSTATE) 9
1.2.2 AArch64 특수 목적 레지스터 10
1.2.3 시스템 레지스터 12
1.2.4 ABI의 레지스터 사용 규칙 12
1.3 AArch64 익셉션 핸들링 13
1.3.1 익셉션 타입 14
1.3.2 동기 및 비동기 익셉션 15
1.3.3 익셉션 핸들링 16
1.3.4 익셉션에 의해 변경되는 실행 상태와 익셉션 레벨 17
1.3.5 AArch64 익셉션 벡터 테이블 19
1.3.6 인터럽트 핸들링 20
1.3.7 저자 IC 표준 인터럽트 컨트롤러 21
1.4 캐시 21
1.4.1 캐시 구조 22
1.4.2 캐시 컨트롤러 24
1.4.3 캐시 정책 24
1.4.4 캐시 일관성의 두 가지 관점 25
1.4.5 캐시 관리 27
1.4.6 캐시 탐색 27
1.5 MMU 28
1.5.1 가상 주소를 물리 주소로 변환 29
1.5.2 AArch64의 테이블 디스크립터 종류 30
1.5.3 커널과 애플리케이션의 가상 주소 공간 분리 32
1.5.4 변환 테이블의 cacheable과 shareable 속성 33
1.5.5 디스크립터 메모리 속성 34
1.5.6 시큐리티와 MMU 36
1.5.7 컨텍스트 스위칭 36
1.6 메모리 오더링 37
1.6.1 메모리 타입 39
1.6.2 배리어 41
1.6.3 메모리 속성 42
1.7 멀티코어 프로세서 44
1.7.1 멀티프로세싱 시스템 44
1.7.2 캐시 일관성 47
1.7.3 클러스터 내의 멀티코어 캐시 일관성 48
1.7.4 버스 프로토콜과 캐시 일관성 인터커넥트 51
1.8 전력 관리 52
1.8.1 유휴 상태 관리 52
1.8.2 소비전류 관련 인스트럭션 54
1.8.3 PSCI 54
2장 커널 시작하기 57
2.1 커널의 진입점 head.S 60
2.1.1 부트 파라미터 저장 62
2.1.2 EL2 설정 63
2.1.3 CPU 부트 모드 저장 64
2.1.4 페이지 테이블 생성 65
2.1.5 CPU 초기화 71
2.2 익셉션 핸들링 78
2.2.1 익셉션 벡터 79
2.2.2 익셉션 테이블 엔트리 84
2.3 디바이스 트리 94
2.3.1 디바이스 트리의 필요성 94
2.3.2 디바이스 트리 작성하기 95
2.3.3 early FDT 사용 96
2.3.4 FDT를 풀어낸 후 사용 107
3장 페이징과 매핑 125
3.1 ARM64 페이징 127
3.1.1 가상 주소 공간 127
3.1.2 페이지 테이블 개요 130
3.1.3 페이징 초기화 134
3.1.4 페이지 테이블 생성 142
3.1.5 페이지 테이블 레지스터 설정 151
3.1.6 페이지 테이블 및 주소 변환 API 158
3.2 고정 매핑(fixmap) 161
3.2.1 고정 매핑 초기화 162
3.2.2 고정 매핑과 언매핑 164
3.2.3 고정 매핑 관련 API 166
3.3 연속된 가상 주소 공간 매핑(vmap) 168
3.3.1 vmap 영역 관리 168
3.3.2 vmap 172
3.3.3 vmap_area 할당 176
3.3.4 vunmap 186
3.3.5 vmap_area 할당과 해제 192
3.4 I/O 메모리 매핑(ioremap) 200
3.4.1 early I/O 메모리 매핑 200
3.4.2 I/O 메모리 매핑 205
3.5 페이지 디스크립터 매핑(vmemmap) 213
3.5.1 vmemmap 활성화 214
4장 메모리 관리 219
4.1 early 메모리 할당자: memblock 221
4.1.1 memblock 구조 222
4.1.2 memblock 초기화 224
4.1.3 memblock 할당과 해제 229
4.1.4 memblock 추가 232
4.1.5 memblock 삭제 240
4.2 메모리 모델 245
4.2.1 메모리 모델의 종류 246
4.2.2 메모리 맵(mem_map) 249
4.3 존 254
4.3.1 존 타입 254
4.3.2 부트 메모리 초기화 257
4.3.3 vmemmap을 사용하는 sparse 메모리 모델 277
4.4 버디 시스템 309
4.4.1 버디 시스템의 구조 309
4.4.2 최초 버디 구성 과정 312
4.4.3 버디 시스템의 페이지 할당 322
4.4.4 버디 시스템의 페이지 해제 336
4.5 per-cpu 페이지 프레임 캐시(pcp) 343
4.5.1 pcp 초기화 과정 344
4.5.2 pcp 구성하기 344
4.5.3 pcp에서의 페이지 할당 346
4.5.4 pcp로의 페이지 해제 349
4.5.5 pcp를 버디 시스템으로 회수하기 354
4.6 페이지 할당자 356
4.6.1 구조 356
4.6.2 NUMA 지원 357
4.6.3 존 구성 및 zonelist 358
4.6.4 zonelist 초기화 361
4.6.5 NUMA 메모리 정책 초기화 370
4.6.6 페이지 할당 373
4.6.7 fastpath 페이지 할당 375
4.6.8 더티 페이지 384
4.6.9 slowpath 페이지 할당 388
4.6.10 워터마크 395
4.7 슬랩 할당자 410
4.7.1 슬랩, 슬럽, 슬롭 410
4.7.2 슬랩 객체 구조 412
4.7.3 kmem_cache 초기화 413
4.7.4 kmem 캐시 생성 426
4.7.5 슬랩 페이지 할당 442
4.7.6 슬랩 객체 할당 449
4.7.7 슬랩 객체 해제 472
4.8 kmalloc과 vmalloc 487
4.8.1 kmalloc과 vmalloc의 특징 487
4.8.2 저자 FP(저자 et Free Pa저자 e) 플래그 488
4.8.3 kmalloc 할당 490
4.8.4 kmalloc으로 할당한 메모리 해제 496
4.8.5 vmalloc 초기화 498
4.8.6 vmalloc을 사용한 메모리 할당 500
4.8.7 vmalloc( )으로 할당받은 메모리 해제 505
4.9 per-cpu 할당자 507
4.9.1 개요 507
4.9.2 per-cpu 초기화 523
4.9.3 first chunk 구성 545
4.9.4 슬랩 할당자 활성화 후 per-cpu 초기화 555
4.9.5 per-cpu 동적 할당 556
5장 태스크 관리 575
5.1 태스크 표현 577
5.1.1 프로세스와 스레드의 차이, 그리고 태스크 577
5.1.2 태스크를 표현하는 자료구조 578
5.1.3 초기화 과정 579
5.2 PID 관리하기 586
5.2.1 PID를 표현하는 자료구조 586
5.2.2 PID 할당하기 591
5.2.3 PID 해제하기 598
5.2.4 PID 할당을 위한 초기화 과정 600
5.2.5 관련 API 603
5.3 실행 상태 관리하기 604
5.3.1 태스크의 주요 실행 상태 605
5.3.2 관련 API 606
5.4 우선순위 관리하기 607
5.4.1 nice 값과 우선순위 607
5.4.2 static priority, normal priority, dynamic priority 608
5.4.3 우선순위 설정하기 608
5.4.4 PI boostin저자 priority leak과 우선순위 리셋 613
5.5 태스크 생성하기 614
5.5.1 _do_fork( ): 태스크 생성의 시작점 614
5.5.2 copy_process( ): 태스크 복사하기 616
5.6 태스크 종료하기 636
5.6.1 do_exit( ) 637
5.7 idle 스레드(swapper) 640
5.7.1 idle 스레드가 실행되는 과정 641
5.7.2 idle 스레드가 하는 일 642
5.7.3 idle 스레드가 설정되는 과정 645
5.7.4 초기화 과정 분석 646
5.8 태스크 관련 자료구조의 필드 설명 652
5.8.1 task_struct 구조체 652
5.8.2 thread_info 구조체 655
5.8.3 thread_struct 구조체 656
6장 태스크 스케줄링 657
6.1 스케줄러의 주요 개념 660
6.1.1 load wei저자 ht와 virtual runtime 660
6.1.2 스케줄링 레이턴시와 타임 슬라이스 663
6.1.3 런큐와 CFS 런큐, 레드 블랙 트리 666
6.1.4 태스크 그룹과 스케줄링 엔티티 669
6.1.5 스케줄링 클래스, 스케줄링 정책 674
6.2 메인 스케줄러 675
6.2.1 타이머 인터럽트를 이용한 주기적인 스케줄링 676
6.2.2 비주기적인 스케줄링 678
6.2.3 스케줄링 시작하기: schedule( ), preempt_schedule_irq( ), preempt_schedule_common( ) 682
6.2.4 스케줄링 요청하기, 요청 체크해서 스케줄링 시도하기 685
6.2.5 스케줄링의 핵심: _ _schedule( ) 688
6.2.6 태스크 깨우기: try_to_wake_up( ) 697
6.3 CFS(Completely Fair Schedulin저자 ) 710
6.3.1 태스크를 런큐에 삽입하기 710
6.3.2 태스크를 런큐에서 선택하기 717
6.3.3 태스크를 런큐에서 제거하기 729
6.3.4 주기적으로 발생하는 틱 처리하기 734
6.3.5 스케줄링 엔티티의 실행시간 관리하기 737
6.3.6 타임 슬라이스 관리하기 742
6.4 스케줄러 초기화하기 747
6.4.1 sched_init( ): 스케줄러 초기화하기 747
7장 SMP와 cpu 토폴로지 755
7.1 SMP를 위한 커널 지원 757
7.2 cpu 토폴로지 758
7.2.1 MPIDR 해시 테이블 762
7.2.2 cpumask map 768
7.3 Secondary Bootin저자 770
7.3.1 ARM: SMP 오퍼레이션 770
7.3.2 ARM64: cpu 오퍼레이션 772
7.3.3 PSCI(Power State Coordination Interface) 777
7.3.4 ARM64 non-boot cpu 부팅 781
8장 인터럽트 803
8.1 인터럽트의 개념 805
8.1.1 인터럽트란 무엇인가? 805
8.1.2 인터럽트 컨트롤러 805
8.2 리눅스 인터럽트 서브시스템 807
8.2.1 irq_chip: 인터럽트 컨트롤러 807
8.2.2 irq_domain: 인터럽트 도메인 808
8.2.3 irq_desc: 인터럽트 디스크립터 809
8.3 인터럽트 핸들러 등록과 처리 810
8.3.1 인터럽트 핸들러 등록 810
8.3.2 인터럽트 핸들러 호출 과정 813
8.3.3 인터럽트 활성화와 비활성화 816
8.3.4 인터럽트 초기화 과정 819
8.4 인터럽트 지연 처리 825
8.4.1 top-half와 bottom-half 825
8.4.2 softirq 826
8.4.3 워크큐 833
8.4.4 threaded irq 843
9장 시간과 타이머 관리 847
9.1 공통 클록 프레임워크(CCF) 849
9.1.1 클록 850
9.1.2 기본적인 클록의 구성요소 850
9.1.3 CLK 프레임 계층 구현을 위한 인터페이스 853
9.1.4 관련 초기화 함수 857
9.2 타임 서브시스템 859
9.2.1 기본 구성 개요 860
9.2.2 클록 소스 860
9.2.3 클록 이벤트 865
9.2.4 틱 디바이스 868
9.3 타이머 관리 872
9.3.1 타이머 개요 872
9.3.2 저해상도 타이머 874
9.3.3 고해상도 타이머 879
찾아보기 887
이 책은 ARM64 기반의 최신 리눅스 커널의 주요 서브시스템을 코드 수준에서 분석하고 있다. 특정 기능이 동작하는 코드플로우를 코드 레벨에서 설명하고 있으며, 약 360개의 그림을 통해 주요 동작을 시각화하고 있다. 새롭게 시작하거나 좀 더 깊은 이해를 위해 커널을 분석하는 개발자가 커널의 미로에서 길을 찾는 데 큰 도움이 될 것이다. _xix쪽
프로세서가 가상 주소를 발행하면 MMU에 의해 물리 주소로 변환된다. MMU는 변환 테이블을 통해 이 주소 변환 과정을 수행한다. 변환 테이블에는 가상 주소를 물리 주소로 변환하는 데 필요한 정보들이 나열되어 있다. 프로그래머는 변환 테이블을 메모리상에 위치시키고 TTBR 레지스터를 통해 테이블의 주소를 MMU에게 전달한다. MMU 내의 전용 H/W가 이 변환 테이블을 읽어 변환을 수행한다. 이런 동작을 페이지 테이블 탐색(page table walk)이라고 한다. _29쪽
그림 3-27은 new라는 크기만큼의 공간이 필요하여 가상 주소 범위 내에서 빈 공간을 찾을 때 먼저 free_vmap_cache 위치부터 우측 방향으로 size가 들어갈 빈 공간을 검색하는 모습을 보여준다. 이렇게 최근에 사용한 위치부터 검색하는 편이 처음부터 검색하는 것에 비해 빠르게 공간을 찾을 수 있다. 최근에 vmap_area가 등록된 경우 그 vmap_area를 free_vmap_cache가 가리킨다. 만일 최근에 vmap_area가 삭제됐다면, 삭제된 vmap_area 이전에 있었던 vmap_area를 free_vmap_cache가 가리킨다. _180쪽
3개의 마이그레이션 타입 리스트에서 싱글 페이지들을 관리한다. 버디 시스템에서와 동일한 방법으로 리스트의 선두 방향을 hot이라 부르고 후미 방향을 cold 방향이라 부른다. hot 방향은 방금 전에 사용 해제된 페이지가 위치하여 다시 재사용될 가능성이 높은 위치다. cold 방향은 오래전에 해제된 페이지들로, 재사용 가능성이 낮은 페이지들이 위치한다. 이렇게 오래된 페이지들이 버디(짝)를 이루어 합쳐지면 캐시에서 벗어나 버디 할당자로 회수시킨다. 이렇게 관리함으로써 페이지 단편화를 줄일 수 있다. _343쪽
per-cpu 데이터는 NR_CPUS 수만큼 배열을 사용하기 때문에 실제 존재하는 cpu의 수보다 큰 수를 사용하는 경우 메모리가 낭비될 수 있다. 수천 개의 cpu를 지원하도록 설정(NR_CPUS)된 시스템에서 실제 부팅 시 동작하는 cpu가 몇 개 안 될 때 이로 인해 낭비되는 per-cpu 배열을 줄여 공간을 효과적으로 사용하게 한다. _512쪽
CFS는 큰 load weight를 갖는 태스크가 상대적으로 적게 실행되었다고 판단하고 더 자주 실행하게 해준다. 또한 사용 가능한 타임 슬라이스도 증가하게 된다. load weight는 태스크의 우선순위가 높을수록 크게, 우선순위가 낮을수록 반대로 작게 설정된다. load weight는 load_weight 구조체에 의해 표현되고 있으며, 태스크의 load weight는 태스크를 표현하는 스케줄링 엔티티의 load 필드가 표현하고 있다. _660쪽
ARM64 커널의 작동 구조 전격 공개!
최신 커널을 분석하거나 수정하기 위해 라인 단위로 코드 설명!
현업에서 커널 업무를 하고 있거나, 취미로 커널 분석을 시작했지만 방대한 양과 난해한 코드 때문에 어려움을 겪고 있는가? 시간이 부족하여 어디서부터 시작해야 할지 갈피조차 잡지 못하고 있는가? 오래전에 구입한 책을 뒤적거리지만 커널 버전이 맞지 않아 시간만 낭비하고 있지는 않은가? 최신 커널 학습에 어려움을 겪는 이런 분들을 위해 《코드로 알아보는 ARM 리눅스 커널》을 전면 개정하여 출간했다. 이 책은 최신 ARM64 커널의 주요 서브시스템을 코드 레벨에서 분석하고 있으며, 기존 원리를 코드를 직접 쫓아가며 명쾌하게 소개하고 있어 커널 엔지니어들에
게 훌륭한 길잡이가 될 것이다.
ARM64 커널 개발을 시작했거나 좀 더 깊고 다양하게 이해하고 싶은 엔지니어, (놀랍게도) 취미로 ARM64 커널을 이해하고자 하는 엔지니어를 위한 이 책은 ARMv8 아키텍처에 대한 내용뿐만 아니라 커널의 핵심 구동 원리를 완벽히 습득하는 데 필요한 거의 모든 내용을 담고 있다. 더욱이 360여 개의 그림을 통해 이해를 돕고 있어 기나긴 커널 분석의 길에 든든한 동반자가 될 수 있을 것이다.
이 책의 주요 내용
ㆍ ARMv8 아키텍처 구조
ㆍ 메모리 매핑, 페이징
ㆍ 태스크 관리와 스케줄링
ㆍ 인터럽트와 타이머
ㆍ ARM64 커널의 시작과 익셉션 핸들링, 디바이스 트리
ㆍ 메모리 할당자
ㆍ SMP와 cpu 토폴로지
이 상품의 총서
Klover리뷰 (0)
- - e교환권은 적립일로부터 180일 동안 사용 가능합니다.
- - 리워드는 5,000원 이상 eBook, 오디오북, 동영상에 한해 다운로드 완료 후 리뷰 작성 시 익일 제공됩니다. (2024년 9월 30일부터 적용)
- - 리워드는 한 상품에 최초 1회만 제공됩니다.
- - sam 이용권 구매 상품 / 선물받은 eBook은 리워드 대상에서 제외됩니다.
- 도서나 타인에 대해 근거 없이 비방을 하거나 타인의 명예를 훼손할 수 있는 리뷰
- 도서와 무관한 내용의 리뷰
- 인신공격이나 욕설, 비속어, 혐오 발언이 개재된 리뷰
- 의성어나 의태어 등 내용의 의미가 없는 리뷰
구매 후 리뷰 작성 시, e교환권 100원 적립
문장수집
- 구매 후 90일 이내에 문장 수집 등록 시 e교환권 100원을 적립해 드립니다.
- e교환권은 적립일로부터 180일 동안 사용 가능합니다.
- 리워드는 5,000원 이상 eBook에 한해 다운로드 완료 후 문장수집 등록 시 제공됩니다. (2024년 9월 30일부터 적용)
- 리워드는 한 상품에 최초 1회만 제공됩니다.
- sam 이용권 구매 상품 / 선물받은 eBook / 오디오북·동영상 상품/주문취소/환불 시 리워드 대상에서 제외됩니다.
구매 후 문장수집 작성 시, e교환권 100원 적립
신규가입 혜택 지급이 완료 되었습니다.
바로 사용 가능한 교보e캐시 1,000원 (유효기간 7일)
지금 바로 교보eBook의 다양한 콘텐츠를 이용해 보세요!

- 구매 후 90일 이내 작성 시, e교환권 100원 (최초1회)
- 리워드 제외 상품 : 마이 > 라이브러리 > Klover리뷰 > 리워드 안내 참고
- 콘텐츠 다운로드 또는 바로보기 완료 후 리뷰 작성 시 익일 제공
가장 와 닿는 하나의 키워드를 선택해주세요.
총 5MB 이하로 jpg,jpeg,png 파일만 업로드 가능합니다.
신고 사유를 선택해주세요.
신고 내용은 이용약관 및 정책에 의해 처리됩니다.
허위 신고일 경우, 신고자의 서비스 활동이 제한될 수
있으니 유의하시어 신중하게 신고해주세요.
이 글을 작성한 작성자의 모든 글은 블라인드 처리 됩니다.
구매 후 90일 이내 작성 시, e교환권 100원 적립
eBook 문장수집은 웹에서 직접 타이핑 가능하나, 모바일 앱에서 도서를 열람하여 문장을 드래그하시면 직접 타이핑 하실 필요 없이 보다 편하게 남길 수 있습니다.
차감하실 sam이용권을 선택하세요.
차감하실 sam이용권을 선택하세요.
선물하실 sam이용권을 선택하세요.
-
보유 권수 / 선물할 권수0권 / 1권
-
받는사람 이름받는사람 휴대전화
- 구매한 이용권의 대한 잔여권수를 선물할 수 있습니다.
- 열람권은 1인당 1권씩 선물 가능합니다.
- 선물한 열람권이 ‘미등록’ 상태일 경우에만 ‘열람권 선물내역’화면에서 선물취소 가능합니다.
- 선물한 열람권의 등록유효기간은 14일 입니다.
(상대방이 기한내에 등록하지 않을 경우 소멸됩니다.) - 무제한 이용권일 경우 열람권 선물이 불가합니다.
첫 구매 시 교보e캐시 지급해 드립니다.

- 첫 구매 후 3일 이내 다운로드 시 익일 자동 지급
- 한 ID당 최초 1회 지급 / sam 이용권 제외
- 구글바이액션을 통해 교보eBook 구매 이력이 없는 회원 대상
- 교보e캐시 1,000원 지급 (유효기간 지급일로부터 7일)