본문내용 바로가기
MD의선택 무료배송 소득공제

코드로 알아보는 ARM 리눅스 커널

반양장
노서영 , 윤석훈 , 강진성 , 송원준 , 이윤재 지음 | 백창우 감수 | 제이펍 | 2012년 08월 22일 출간

이 책의 다른 상품 정보

  • 정가 : 35,000원
    판매가 : 31,500 [10%↓ 3,500원 할인]
  • 통합포인트 :
    [기본적립] 1,750원 적립 [5% 적립] [추가적립] 5만원 이상 구매 시 2천원 추가적립 안내 [회원혜택] 실버등급 이상, 3만원 이상 구매 시 2~4% 추가적립 안내
  • 추가혜택 : 포인트 안내 도서소득공제 안내 추가혜택 더보기
  • 배송비 : 무료 배송비 안내
  • 개정정보 : 2018년 05월 출간된 개정판이 있습니다. 개정판 보기
  • 도서상태 : 절판
상품상세정보
ISBN 9788994506494(8994506497)
쪽수 700쪽
크기 188 * 245 * 35 mm /1400g 판형알림

책소개

이 책이 속한 분야

리눅스 커널 코드 분석을 위한 실용적인 안내서!

2년간의 코드 분석, 1년간의 집필로 집대성한 최초의 ARM 리눅스 커널 분석서『코드로 알아보는 ARM 리눅스 커널』. 리눅스 커널을 커널 소스 코드를 통해 분석하고자 하는 독자들을 위한 ARM 리눅스 커널 분석서이다. 커널의 부팅 시작에서 끝까지 순서대로 설명하고 있으며, ‘line by line 분석’으로 이해를 도왔다. 특히 기존의 이론서와 달리 ARM용 리눅스 커널을 다루고 있으며, 리눅스 커널과 ARM에 대한 정확한 지식을 쌓을 수 있도록 상세한 코드 분석과 풍부한 그림을 곁들였다. 그 밖에도 ARM 프로세서의 구조, 커널 분석 시 자주 사용되는 API, ARM 명령어, GAS 키워드, 인터럽트가 발생한 다음 핸들러가 호출되기까지의 자세한 과정 등을 다루고 있다.

목차

PART I ARM 리눅스 커널 - 커널 분석을 위해 어떤 준비가 필요할까?
Chapter 1 커널에 대한 소개 그리고 2.6과 3.2의 차이 002

1.1 커널의 탄생과 역할 그리고 내부 구조 002
1.1.1 리누스에 의해 탄생한 리눅스 002
1.1.2 다양한 서브시스템이 모여 동작하는 모노리딕 커널 003
1.1.3 전 세계에서 가장 유명한 범용 운영체제 005
1.2 커널 2.6과 3.2의 차이 006

Chapter 2 커널 빌딩 시스템 008
2.1 커널 초기화 008
2.2 커널 설정 009
2.3 커널 빌딩 011
2.4 커널 설치 019

Chapter 3 ARM 프로세서 알아보기 021
3.1 프로세서 개요와 특징 021
3.2 프로세서 아키텍처와 코어 022
3.3 프로세서 명명법 023
3.4 프로세서 내부 구조 024
3.5 프로세서 모드와 레지스터 026
3.6 프로세서 익셉션 028
3.7 하드웨어 확장 기능 030
3.7.1 캐시 030
3.7.2 메모리 관리 장치 031
3.7.3 코프로세서 031

Chapter 4 분석 환경 구축하기 032
4.1 리눅스 커널 소스 다운로드하여 설치하기 032
4.1.1 커널 소스 다운로드하기 032
4.1.2 소스 설치하기 034
4.2 ctags + cscope 설치하기 035
4.2.1 ctags로 소스 코드 태그 만들기 035
4.2.2 cscope 태그 데이터베이스 만들기 037
4.3 vim 플러그인 다운로드 및 환경설정 038
4.3.1 vim 플러그인 다운로드하기 039
4.3.2 vim + plugin 환경구성 043
4.3.3 vim 환경설정하기 044
4.4 소스 분석 환경 툴 둘러보기 047

PART II 커널의 시작 - start_kernel은 어떻게 호출될까?
Chapter 5 커널 압축 해제 준비하기 056

5.1 부트로더에 이어 첫 스타트 끊기 - start 레이블 057
5.2 BSS 영역 초기화하기 - not_relocated 레이블 059
5.3 캐시 활성화하기 - cache_on 레이블 062
5.4 페이지 디렉터리 엔트리 초기화하기 - _ _setup_mmu 레이블 065
5.5 I-Cache 활성화 및 캐시 정책 적용하기 - _ _common_mmu_cache_on 레이블 069

Chapter 6 압축된 커널 이미지인 zImage로부터 커널 이미지 복원하기 070
6.1 덮어쓰지 않게 커널 압축 풀기 - wont_overwrite, decompress_kernel 레이블 071
6.2 압축 해제된 커널 호출하기 - call_kernel 레이블 072
6.3 캐시클린 및 플러시 - cache_clean_flush 레이블 073
6.4 캐시 비활성화하기 - cache_off 레이블 075

Chapter 7 start_kernel() 호출하기 076
7.1 초기화 조망하기 - stext 레이블 076
7.2 프로세서 정보 찾기 - _ _look_processor_type 081
7.2.1 _ _lookup_processor_type 레이블 081
7.2.2 _ _proc_info_begin과 _ _proc_info_end에 저장된 정보 083
7.2.3 MMU 비활성화 상태에서 가상 주소를 물리 주소로 변경하기 085
7.2.4 proc_info_list 구조체를 찾아 프로세서 정보 비교하기 087
7.3 내 머신 타입 찾기 - _ _lookup_machine_type 088
7.3.1 _ _lookup_machine_type 레이블 088
7.3.2 _ _arch_info_begin과 _ _arch_info_end에 저장된 machine_desc 정보와 접근 방법 090
7.3.3 machine_desc 구조체를 찾아 머신 정보 비교하기 091
7.4 부트로더에서 온 atags - _ _vet_atags 레이블 092
7.5 가상 메모리를 사용하기 위해 기초 공사하기 - _ _create_page_table 레이블 095
7.6 코어를 설정하자 - v6_setup 레이블 101
7.7 MMU를 켜고 가상 주소 사용하기 - _ _enable_mmu / _ _turn_mmu_on 레이블 102
7.8 start_kernel로 점프 - _ _mmap_switched 레이블 107

PART III 커널의 실행 - 커널의 시작과 끝은 어디인가?
Chapter 8 smp_setup_processor_id() ~ lock_kernel() 112

8.1 smp_setup_processor_id(), lockdep_init(), debug_objects_early_init() 113
8.1.1 smp_setup_processor_id() 113
8.1.2 lockdep_init() 113
8.1.3 debug_objects_early_init() 115
8.2 스택 오버플로우 감지하기 - boot_init_stack_canary() 117
8.3 프로세스를 그룹화하는 방법을 제공하는 cgroup 초기화하기 ? cgroup_init_early() 118
8.3.1 cgroupfs_root와 cgroup의 관계 초기화하기 - init_cgroup_root() 123
8.3.2 서브시스템 초기화하기 - cgroup_init_subsys() 123
8.4 irq를 비활성화하기 - local_irq_disable() 125
8.5 early_boot_irqs_off(), early_init_irq_lock_class() 125
8.6 빅 커널 락 - lock_kernel() 127

Chapter 9 클럭 이벤트에 대한 핸들러 등록하기 134
9.1 함수의 선언과 정의 - tick_init() 134
9.2 이벤트 처리 핸들러 등록하기 - clockevents_register_notifier() 136
9.2.1 clockevents_lock에 대한 스핀 락 걸기 137
9.2.2 clockevents_chain이 생성되는 원리 139
9.2.3 clockevents_chain에 tick_notifier를 등록하는 방법 140
9.2.4 clockevents_lock에 대한 스핀 락을 해제하는 원리 142

Chapter 10 CPU 비트맵에 수행 중인 CPU 등록과 HIGHMEM 관리를 위한 초기화 144
10.1 핫플러그 정보를 담고 있는 비트맵에 init_task를 수행하는 CPU 추가하기 - boot_cpu_init() 144
10.2 하이 메모리 관리하기 - page_address_init() 146

Chapter 11 전체 조망하기 - setup_arch() 149

Chapter 12 unwind_init() ~ early_trap_init() 152
12.1 스택 역추적하기 - unwind_init() 152
12.2 머신 정보를 담고 있는 machine_desc 구조체 구하기 - setup_machine() 153
12.3 ATAG 정보 처리하기 ? setup_arch() 154
12.4 부팅 파라미터 처리하기 - parse_cmdline() 156
12.5 리소스 트리 구성하기 - request_standard_resources() 158
12.6 cpu possible 비트맵 초기화하기 - smp_init_cpus() 164
12.7 ARM 예외 모드마다 스택 지정해주기 - cpu_init() 165
12.8 익셉션 핸들링을 위해 초기화하기 - early_trap_init() 167
12.9 인터럽트 핸들러 함수 살펴보기 174
12.9.1 IRQ 핸들러 호출하기 - asm_do_IRQ() 177
12.9.2 인터럽트 이전으로 돌아가기 - ret_to_user 레이블 179

Chapter 13 프로세서 셋업하기 ? setup_processor() 181
13.1 setup_processor() 구조 알아보기 181
13.2 CPU ID 찾기 - read_cpuid_id() 183
13.3 프로세서 정보 찾기 - lookup_processor_type() 184
13.4 프로세서 아키텍처 정보 찾기 - cpu_architecture() 185
13.5 프로세서 캐시 타입 찾기 - cacheid_init() 189
13.6 프로세서 초기화 함수 호출하기 - cpu_proc_init() 193

Chapter 14 메모리 페이징 준비하기 - paging_init() 196
14.1 paging_init() 전체 구조 살펴보기 196
14.2 메모리 타입 테이블 설정해주기 - build_mem_type_table() 198
14.3 메모리 정보 점검하기 ? sanity_check_meminfo() 201
14.4 페이지 테이블 준비하기 - prepare_page_table() 203
14.4.1 prepare_page_table() 203
14.4.2 리눅스의 페이징 구조 205
14.4.3 페이지 디렉터리 엔트리 구하기 206
14.4.4 pmd_clear() 208
14.5 디바이스 영역 매핑 준비하기 - devicemaps_init() 210
14.6 하이 메모리 사용 준비하기 - kmap_init() 215
14.7 제로 페이지 초기화하기 216
14.7.1 메모리 할당하기 - _ _ alloc_bootmem_nopanic() 217
14.7.2 지정된 노드에서 fallback을 사용하여 메모리 할당받기 - alloc_bootmem_core() 218
14.7.3 가상 주소를 page 구조체로 변환하기 - virt_to_page() 220
14.8 D-Cache의 일관성 유지하기 ? flush_dcache_page() 221

Chapter 15 부트 타임 시 메모리 할당자 초기화하기 - bootmem_init() 223
15.1 bootmem의 함수 흐름과 자료구조들 224
15.2 bootmem_init() 구조 알아보기 229
15.3 램디스크 위치 찾기 - check_initrd() 230
15.4 노드의 뱅크 정보를 페이지 디렉터리에 반영하기 - bootmem_init_node() 231
15.4.1 map_memory_bank() 233
15.4.2 bootmem_bootmap_pages() 236
15.4.3 find_bootmap_pfn() 238
15.4.4 node_set_online() 239
15.4.5 NODE_DATA() 매크로 240
15.4.6 init_bootmem_node() 242
15.4.7 free_bootmem_node() 244
15.4.8 reserve_bootmem_node() 245
15.5 0번 노드 제외시키기 - reserve_node_zero() 246
15.6 램디스크 노드 제외시키기 - bootmem_reserve_initrd() 248
15.7 가용 페이지 없다고 설정하기 - bootmem_free_node() 248
15.8 free_area 영역 초기화 251
15.8.1 free_area 구조체 251
15.8.2 free_area_init_node() 253
15.8.3 free_area_init_core() 254
15.8.4 init_currently_empty_zone() 256
15.8.5 memmap_init() 257

Chapter 16 mm_init_owner() ~ preempt_disable() 264
16.1 메모리 소유자 설정하기 ? mm_init_owner() 264
16.2 명령어 라인 저장해두기 ? setup_command_line() 265
16.3 per-cpu 데이터 초기화하기 - setup_per_cpu_areas() 266
16.4 CPU 개수 구하기 - setup_nr_cpu_ids() 269
16.5 SMP 상의 부팅 프로세스 등록하기 - smp_prepare_boot_cpu() 270
16.6 스케줄러를 사용하기 위해 자료구조 초기화하기 ? sched_init() 272
16.6.1 그룹 스케줄링 시 사용되는 task_group의 sched_entity 구조체와 runqueue 구조체를 위한 메모리 할당 273
16.6.2 root_domain, rt_bandwidth, task_group 관련 자료구조 초기화 276
16.6.3 시스템의 모든 possible cpu의 런큐 초기화 278
16.6.4 현재 태스크의 스케줄링 관련 값 초기화 및 로드밸런싱을 위한 인터럽트 핸들러 등록 280
16.7 커널 선점 허용하기와 선점 막기 ? preempt_enable()/preempt_disable() 281

Chapter 17 빌려줄 후원자 구성하기 283
17.1 build_all_zonelists()에서 다루는 자료구조들 283
17.2 build_all_zonelists() 구조 알아보기 285
17.3 존의 리스트 방식 결정하기 - set_zonelist_order() 287
17.4 폴백 리스트와 폴백 비트맵 구성하기 - _ _build_all_zonelists() 290
17.4.1 build_zonelists() 291
17.4.2 build_zonelists_in_node_order() 293
17.4.3 build_zonelists_in_zone_order() 296
17.4.4 build_thisnode_zonelists() 297
17.4.5 build_zonelist_cache() 297
17.5 폴백 리스트 정보 출력하기 - mminit_verify_zonelist() 299
17.6 페이지 할당 요청을 처리할 노드 정하기 - cpuset_init_current_mems_allowed() 300
17.7 프리 페이지 개수 구하기 - nr_free_pagecache_pages() 300
17.8 페이지 모빌리티 304

Chapter 18 page_alloc_init() ~ pidhash_init() 308
18.1 핫플러그 CPU를 위한 page 처리하기 - page_alloc_init() 309
18.2 console 파라미터 처리하기 - parse_early_param() 311
18.3 특별한 파라미터 처리하기 - parse_args() 313
18.4 인터럽트 활성화 여부 확인하기 - irqs_disabled() 317
18.5 커널 예외 테이블 정의하기 - sort_main_extable() 318
18.6 RCU 메커니즘 초기화하기 - rcu_init() 320
18.7 IRQ를 사용하기 위한 준비하기 - early_irq_init() 323
18.8 인터럽트 초기화하기 - init_IRQ() 328
18.9 프로세스 정보를 빠르게 찾기 위한 구조 만들기 ? pidhash_init() 331

Chapter 19 init_timers() ~ page_cgroup_init() 333
19.1 타이머 초기화하기 ? init_timers() 334
19.1.1 timer_cpu_notify() 335
19.1.2 register_cpu_notifier() 336
19.1.3 open_softirq() 337
19.2 High Resolution 타이머 초기화하기 ? hrtimers_init() 338
19.3 softirq의 콜백 함수 등록하기 - softirq_init() 341
19.4 xtime 설정하기 - timekeeping_init() 345
19.5 하드웨어 타이머 초기화하기 - time_init() 348
19.6 clock 타임 초기화하기 - sched_clock_init() 350
19.7 CPU의 인터럽트 활성화하기 - local_irq_enable() 352
19.8 루트 파일시스템으로 사용되는 init 램디스크 검사하기 353
19.9 동적 메모리 할당을 위한 초기화 작업하기 - vmalloc_init() 353
19.10 덴트리와 아이노드 캐시에 대한 초기화 미리 수행하기 - vfs_caches_init_early() 355
19.11 cpuset 서브시스템 초기화하기 - cpuset_init_early() 358
19.12 memory 서브시스템 초기화하기 - page_cgroup_init() 360

Chapter 20 bootmem 할당자를 종료하고 버디 시스템으로 교체 363
20.1 mem_init() 함수의 호출 관계와 자료구조의 상관 관계 363
20.2 mem_init() 구조 알아보기 364
20.3 존재하지 않는 메모리 비트맵에 기록하기 - free_unused_memmap_node() 366
20.4 일반 프리 페이지 버디 시스템으로 이관하기 - free_all_bootmem_node() 368
20.4.1 register_page_bootmem_info_node() 368
20.4.2 free_all_bootmem_core() 370
20.4.3 _ _free_pages_bootmem() 372
20.4.4 _ _free_pages() 376
20.4.5 free_hot_cold_page() 376
20.4.6 _ _free_pages_ok() 378
20.5 하이 메모리 프리 페이지 버디시스템으로 이관하기 - free_area() 383

Chapter 21 CPU 핫플러그 지원을 위한 초기화 385
21.1 cpu_hotplug 멤버 변수 초기화하기 - cpu_hotplug_init() 385
21.2 CPU의 온라인 → 오프라인으로 변경 시 처리 386

Chapter 22 슬랩 메모리 할당자 활성화하기 - kmem_cache_init() 389
22.1 슬랩 할당자 개념과 구조체들 389
22.2 슬랩 할당자의 중요 구조체 - kmem_cache와 kmem_list3 391
22.3 kmem_cache_init() 구조 알아보기 394
22.4 initkmem_list3[ ], cache_cache.nodelists[ ] 초기화 399
22.5 kmem_list3 배열에 연결하고 cache 축소시간 정하기 - set_up_list3s() 401
22.6 cache의 확장 및 축소에서 사용될 페이지 오더 구하기 - cache_estimate() 402
22.7 malloc_sizes와 cache_names 406
22.8 cache 생성하기 - kmem_cache_create() 408
22.8.1 kmem_cache_zalloc() 410
22.8.2 calculate_slab_order() 411
22.8.3 setup_cpu_cache() 412
22.8.4 enable_cpucache() 414
22.9 arraycache_init, kmem_list3 cache 생성 414
22.10 정적으로 할당받은 메모리를 kmalloc()을 통해 할당받은 메모리로 대체하기 417

Chapter 23 kmem_trace_init() ~ security_init() 420
23.1 ID allocator 캐시 생성하기 ? idr_init_cache() 421
23.2 pageset 초기화하기 - setup_per_cpu_pageset() 421
23.3 인터리브 노드 지정하기 - numa_policy_init() 427
23.4 타이머 초기화 마무리하기 - late_time_init() 431
23.5 BogoMIPS 측정하기 - calibrate_delay() 431
23.6 프로세스 식별자(ID) 할당을 위한 비트맵 만들기 - pidmap_init() 433
23.7 우선순위 트리의 자료구조 초기화하기 - prio_tree_init() 435
23.8 anon_vma 슬랩 캐시 생성하기 - anon_vma_init() 435
23.9 객체에 사용자별로 자격 부여하기 ? cred_init() 437
23.10 fork()를 사용할 수 있게 자료구조 초기화하기 - fork_init() 438
23.11 프로세스 생성을 위한 캐시 초기화하기 - proc_caches_init() 439
23.12 버퍼 캐시 초기화하기 - buffer_init() 442
23.13 보안 키 준비하기 ? key_init() 445

Chapter 24 VFS에서 사용되는 다양한 캐시들 초기화하기 - vfs_caches_init() 449

Chapter 25 radix_tree_init() ~ ftrace_init() 468
25.1 래딕스 트리 관련된 자료구조 초기화하기 - radix_tree_init() 469
25.2 시그널을 사용할 준비하기 ? signals_init() 470
25.3 proc 파일시스템을 등록하고 마운트하기 - proc_root_init() 471
25.4 초기화하지 못한 서브시스템 등록하기 - cgroup_init() 472
25.5 top_cpuset을 재설정하고 cpuset 파일시스템 등록하기 - cpuset_init() 474
25.6 태스크 통계 정보 인터페이스 초기화하기 - taskstats_init_early() 475
25.7 지연 정보 관리를 위한 준비 - delayacct_init() 477
25.7.1 딜레이 어카운팅 477
25.7.2 dealyacct_init() 477
25.7.3 task_delay_info 구조체와 delayacct_tsk_init() 478
25.8 쓰기 버퍼의 일관성 검사하기 - check_bugs() 481

Chapter 26 메모리와 백킹 스토어 싱크하기 - 페이지 라이트백 483
26.1 페이지 라이트백 메커니즘 484
26.2 페이지 라이트백 활성화하기 - pdflush_init() 485
26.3 pdflush 스레드 487
26.4 페이지 라이트백 함수 지정하기 - pdflush_operation() 489
26.5 어떻게 주기적 페이지 라이트백, 강제적 페이지 라이트백 콜백 함수가 호출되나? 490
26.5.1 주기적 페이지 라이트백 함수 - wb_kupdate() 490
26.5.2 강제적 페이지 라이트백 함수 - background_writeout() 493
26.6 주기적 페이지 라이트백 초기화하기 - page_writeback_init() 494

Chapter 27 커널 부팅의 마지막 함수 구조 알아보기 - rest_init() 496

Chapter 28 함수를 실행할 커널 스레드 생성하기 - kernel_thread() 499
28.1 kernel_thread() 구조 알아보기 499
28.2 프로세서를 생성하는 게이트웨이 - do_fork() 500
28.3 부모 프로세스 복사하기 - copy_process() 504

Chapter 29 새로 생성한 태스크 깨우기 514
29.1 wake_up_new_task() 구조 알아보기 514
29.2 태스크의 런큐 가져오기 - task_rq_lock() 517
29.3 태스크의 우선순위 개선하기 - effective_prio() 518

Chapter 30 커널 사용할 준비하기 - kernel_init() 522
30.1 현재 프로세스를 다른 CPU로 이주시키기 - sched_init_smp() 523
30.2 시스템 전반적으로 초기화 마무리하기 - do_basic_setup() 526
30.2.1 rcu_sched_grace_period()를 실행할 스레드 생성하기 - rcu_init_sched() 527
30.2.2 events 워크 큐 생성하기 - init_workqueues() 528
30.2.3 cpuset 서브시스템의 top_cpuset 초기화하기 - cpuset_init_smp() 535
30.2.4 khelper 워크 큐 생성하기 - usermodehelper_init() 536
30.2.5 리눅스의 디바이스 모델 초기화하기 - driver_init() 538
30.2.6 irq 정보를 proc 파일시스템에 등록하기 - init_irq_proc() 548
30.2.7 커널이 모르는 서브시스템 호출하기 - do_initcalls() 549
30.3 초기화 다음을 준비하기 - init_post() 554

Chapter 31 커널 스레드 데몬 556
31.1 커널 스레드 데몬 - kthreadd() 556
31.2 시그널 무시하기 - ignore_signals() 559
31.3 나이스 값 설정하기 - set_user_nice() 562
31.4 태스크를 실행시킬 CPU 찾기 - set_cpus_allowed_ptr() 567
31.5 리스트를 포함하고 있는 실제 구조체 위치 찾기 - list_entry() 569
31.6 커널 스레드 생성하기 - create_kthread() 572

Chapter 32 find_task_by_pid_ns() ~ cpu_idle() 575
32.1 PID로 태스크 찾기 - find_task_by_pid_ns() 576
32.2 BKL 해제하기 - unlock_kernel() 579
32.3 스케줄링 클래스를 idle로 변경하기 - init_idle_bootup_task() 580
32.4 RCU 메커니즘이 활성화되었음을 알리기 - rcu_scheduler_starting() 580
32.5 커널 선점 활성화하기 - preempt_enable_no_resched() 581
32.6 프로세스 스케줄링 수행하기 - schedule() 582
32.6.1 schedule()의 진짜 알맹이 - _ _schedule() 582
32.7 리눅스 부팅 대장정의 끝 - cpu_idle() 584

Appendix A 어셈블러, gas 키워드 정리 588
A.1 ARM 명령어 기본 588
A.1.1 분기 명령어 588
A.1.2 산술 연산 명령어 588
A.1.3 논리 연산 명령어 588
A.1.4 비교 연산 명령어 589
A.1.5 데이터 전송 명령어 589
A.1.6 상태 레지스터 명령어 589
A.1.7 코프로세서 명령어 590
A.1.8 기타 명령어 591
A.2 조건부 실행 591
A.3 gas 지시어 592

Appendix B 커널 분석 시 자주 나오는 API 594
B.1 이중 연결 리스트 594
B.2 비트 연산 API 595

Appendix C 가볍게 알아보는 ext2 파일시스템 596
C.1 파일을 나타내는 구조: inode 596
C.2 i_mode 필드를 이루는 비트 구조 597
C.3 파일의 데이터를 가지고 있는 필드 - i_block[] 598
C.4 디스크에 저장되는 구조 600
C.4.1 파티션이 가지는 구조 600
C.4.2 Block Group 구조 601
C.4.3 Inode Table 구조 603
C.4.4 디렉터리, 파일, Inode Table, Data Block 간의 관계 604

Appendix D 리눅스 스레드 모델 608
D.1 스레드 모델 608
D.2 리눅스 스레드 구현 609

Appendix E 링커 스크립트 파일의 구조 612
E.1 ARM 링커 스크립트 파일 구성 613
E.2 링커 스크립트 구성도 615

Appendix F 코드 리스트 623

Appendix G 그림 리스트 632

Appendix H 알아봅시다! 리스트 639

찾아보기 642

책 속으로

감수자의 글 중에서

이 책은 마치 예리한 메스와 같은 책이다. 이 책을 읽어보면 알겠지만, 이 책은 모든 부분에 있어 디테일이 살아있다. 이는 2년이라는 시간 동안 자신을 예리한 메스와 같이 유지한 저자들 본인의 실력이 반영되어 있어서 그렇다. 또한 이 책은 막힘이 없다. 이는 처음부터 끝까지 다 알고 있는 사람이 하나씩 하나씩 이야기를 풀었기 때문에 가능한 것이다. 이러한 이유들로 이 책은 지금까지 나온 그 어떤 커널 책보다 돋보이는 수작이라 할 수 있다. 그래서 본인은 한국에 이러한 책이 나오게 된 것을 자랑스럽게 생각한다... 더보기

출판사 서평

2년간의 코드 분석, 1년간의 집필로 집대성한 최초의 ARM 리눅스 커널 분석서!
리눅스 커널 코드 분석의 혁명적인 방법을 제공한다!
리눅스 커널 코드 분석을 위한 가장 실용적인 지침서!

이 책은 저자들이 3년간 리눅스 커널을 분석한 경험과 자료를 바탕으로 집필되었다. 어떤 책에서도 다루어주지 않았던 내용, 수박 겉핥기식으로 알아보았던 내용에 대해 철저하게 함수 흐름을 따라가며 분석하고 있다. 어려울 법한 이러한 과정을 저자들은 ‘line by line 분석’이라는 직구로 승부함으로써 기존의 이론서에 답답함을 느꼈던 독자들... 더보기

Klover 리뷰 (0)

북로그 리뷰 (0) 쓰러가기

도서 구매 후 리뷰를 작성하시면
결제 90일 이내 300원, 발송 후 5일 이내 400원, 이 상품의 첫 리뷰 500원의 포인트를 드립니다.

포인트는 작성 후 다음 날 적립되며, 도서 발송 전 작성 시에는 발송 후 익일에 적립됩니다.
북로그 리뷰는 본인인증을 거친 회원만 작성 가능합니다.
(※ 외서/eBook/음반/DVD/GIFT 및 잡지 상품 제외) 안내
  • 해당도서의 리뷰가 없습니다.

문장수집 (0) 문장수집 쓰기 나의 독서기록 보기
※구매도서의 문장수집을 기록하면 통합포인트 적립 안내

교환/반품/품절안내

※ 상품 설명에 반품/교환 관련한 안내가 있는 경우 그 내용을 우선으로 합니다. (업체 사정에 따라 달라질 수 있습니다.)

교환/반품/품절안내
반품/교환방법 마이룸 > 주문관리 > 주문/배송내역 > 주문조회 > 반품/교환신청 ,
[1:1상담>반품/교환/환불] 또는 고객센터 (1544-1900)

※ 오픈마켓, 해외배송주문, 기프트 주문시 [1:1상담>반품/교환/환불]
    또는 고객센터 (1544-1900)
반품/교환가능 기간 변심반품의 경우 수령 후 7일 이내,
상품의 결함 및 계약내용과 다를 경우 문제점 발견 후 30일 이내
반품/교환비용 변심 혹은 구매착오로 인한 반품/교환은 반송료 고객 부담
반품/교환 불가 사유
  • 소비자의 책임 있는 사유로 상품 등이 손실 또는 훼손된 경우
    (단지 확인을 위한 포장 훼손은 제외)
  • 소비자의 사용, 포장 개봉에 의해 상품 등의 가치가 현저히 감소한 경우
    예) 화장품, 식품, 가전제품(악세서리 포함) 등
  • 복제가 가능한 상품 등의 포장을 훼손한 경우
    예) 음반/DVD/비디오, 소프트웨어, 만화책, 잡지, 영상 화보집
  • 소비자의 요청에 따라 개별적으로 주문 제작되는 상품의 경우 ((1)해외주문도서)
  • 디지털 컨텐츠인 eBook, 오디오북 등을 1회 이상 다운로드를 받았을 경우
  • 시간의 경과에 의해 재판매가 곤란한 정도로 가치가 현저히 감소한 경우
  • 전자상거래 등에서의 소비자보호에 관한 법률이 정하는 소비자 청약철회 제한 내용에
    해당되는 경우
(1) 해외주문도서 : 이용자의 요청에 의한 개인주문상품으로 단순변심 및 착오로 인한 취소/교환/반품 시 ‘해외주문 반품/취소 수수료’ 고객 부담 (해외주문 반품/취소 수수료 : ①서양도서-판매정가의 12%, ②일본도서-판매정가의 7%를 적용)
상품 품절 공급사(출판사) 재고 사정에 의해 품절/지연될 수 있으며, 품절 시 관련 사항에 대해서는
이메일과 문자로 안내드리겠습니다.
소비자 피해보상
환불지연에 따른 배상
  • 상품의 불량에 의한 교환, A/S, 환불, 품질보증 및 피해보상 등에 관한 사항은
    소비자분쟁해결 기준 (공정거래위원회 고시)에 준하여 처리됨
  • 대금 환불 및 환불지연에 따른 배상금 지급 조건, 절차 등은 전자상거래 등에서의
    소비자 보호에 관한 법률에 따라 처리함

바로가기

  • 우측 확장형 배너 2
  • 우측 확장형 배너 2

최근 본 상품