책 이미지
책 정보
· 분류 : 국내도서 > 컴퓨터/모바일 > 프로그래밍 개발/방법론 > 모바일/무선/임베디드 프로그래밍
· ISBN : 9788960773318
· 쪽수 : 628쪽
책 소개
목차
1장 리눅스 커널 입문
___유닉스의 역사
___리눅스의 개발
___운영체제와 커널
___리눅스 커널과 전통적인 유닉스 커널
___리눅스 커널 버전
___리눅스 커널 개발 공동체
___시작하기 전에
2장 커널과의 첫 만남
___커널 소스 구하기
___Git 사용하기
___커널 소스 설치
___패치
___커널 소스 트리
___커널 빌드
___커널 설정
___빌드 메시지 최소화
___빌드 작업을 동시에 여러 개 실행
___새 커널 설치
___다른 성질의 야수
___libc와 표준 헤더 파일을 사용할 수 없음
___GNU C
___인라인 함수
___인라인 어셈블리
___분기 구문표시
___메모리 보호 없음
___부동 소수점을 (쉽게) 사용할 수 없음
___작은 고정 크기의 스택
___동기화와 동시성
___이식성의 중요성
___결론
3장 프로세스 관리
___프로세스
___프로세스 서술자와 태스크 구조체
___프로세스 서술자의 할당
___프로세스 서술자 저장
___프로세스 상태
___현재 프로세스 상태 조작
___프로세스 컨텍스트
___프로세스 계층 트리
___프로세스 생성
___Copy-on-Write
___프로세스 생성(forking)
___vfork()
___리눅스의 스레드 구현
___스레드 생성
___커널 스레드
___프로세스 종료
___프로세스 서술자 제거
___부모 없는 태스크의 딜레마
___결론
4장 프로세스 스케줄링
___멀티태스킹
___리눅스의 프로세스 스케줄러
___정책
___입출력중심 프로세스와 프로세서중심 프로세스
___프로세스 우선순위
___타임슬라이스
___스케줄러 정책의 동작
___리눅스 스케줄링 알고리즘
___스케줄러 클래스
___유닉스 시스템의 프로세스 스케줄링
___공정 스케줄링
___리눅스 스케줄링 구현
___시간 기록
___스케줄러 단위 구조체
___가상 실행시간
___프로세스 선택
___다음 작업 선택
___트리에 프로세스 추가
___트리에서 프로세스 제거
___스케줄러 진입 위치
___휴면과 깨어남
___대기열
___깨어남
___선점과 컨텍스트 전환
___사용자 선점
___커널 선점
___실시간 스케줄링 정책
___스케줄러 관련 시스템 호출
___스케줄링 정책과 우선순위 관련 시스템 호출
___프로세서 지속성(affinity) 관련 시스템 호출
___프로세서 시간 양보
___결론
5장 시스템 호출
___커널과 통신
___API, POSIX, C 라이브러리
___시스콜
___시스템 호출 번호
___시스템 호출 성능
___시스템 호출 핸들러
___알맞은 시스템 호출 찾기
___매개변수 전달
___시스템 호출 구현
___시스템 호출 구현
___매개변수 검사
___시스템 호출 컨텍스트
___시스템 호출 등록을 위한 마지막 단계
___사용자 공간에서 시스템 호출 사용
___시스템 호출을 구현하지 말아야 하는 이유
___결론
6장 커널 자료 구조
___연결 리스트
___단일 연결 리스트와 이중 연결 리스트
___환형 연결 리스트
___연결 리스트 내에서 이동
___리눅스 커널의 구현 방식
___연결 리스트 구조체
___연결 리스트 정의
___리스트 헤드
___연결 리스트 조작
___연결 리스트에 노드 추가
___연결 리스트에서 노드 제거
___연결 리스트의 노드 이동과 병합
___연결 리스트 탐색
___기본 방식
___실제 사용하는 방식
___역방향으로 리스트 탐색
___제거하면서 탐색
___다른 연결 리스트 함수
___큐
___kfifo
___큐 생성
___데이터를 큐에 넣기
___데이터를 큐에서 빼기
___큐의 크기 알아내기
___큐 재설정과 큐 삭제
___큐 사용 예제
___맵
___idr 초기화
___새로운 UID 할당
___UID 찾기
___UID 제거
___idr 제거
___이진 트리
___이진 탐색 트리
___자가 균형 이진 탐색 트리
___레드블랙 트리
___rbtree
___어떤 자료 구조를 언제 사용할 것인가?
___알고리즘 복잡도
___알고리즘
___O(빅오, 대문자오) 표기법
___빅 세타 표기법
___시간 복잡도
___결론
7장 인터럽트와 인터럽트 핸들러
___인터럽트와 인터럽트 핸들러
___전반부 처리와 후반부 처리
___인터럽트 핸들러 등록
___인터럽트 핸들러 플래그
___인터럽트 예제
___인터럽트 핸들러 해제
___인터럽트 핸들러 작성
___공유 핸들러
___인터럽트 핸들러의 실제 예
___인터럽트 컨텍스트
___인터럽트 핸들러 구현
___/proc/interrupts
___인터럽트 제어
___인터럽트 활성화와 비활성화
___특정 인터럽트 비활성화
___인터럽트 시스템 상태
___결론
8장 후반부 처리와 지연된 작업
___후반부 처리bottom half
___왜 후반부 처리를 하는가?
___후반부 처리의 세계
___원래의 '후반부 처리'
___태스크 큐
___softirq와 태스크릿
___혼란스러움을 떨쳐내기
___softirq
___softirq 구현
___softirq 핸들러
___softirq 실행
___softirq 사용
___인덱스 할당
___핸들러 등록
___softirq 올림
___태스크릿tasklet
___태스크릿 구현
___태스크릿 구조체
___태스크릿 스케줄링
___태스크릿 사용
___태스크릿 선언
___태스크릿 핸들러 작성
___태스크릿 스케줄링
___ksoftirqd
___구식 BH 처리 방식
___워크 큐
___워크 큐 구현
___스레드 표현 자료 구조
___작업 표현 자료 구조
___워크 큐 구현 정리
___워크 큐 사용
___작업 생성
___워크 큐 핸들러
___작업 스케줄링
___작업 비우기
___새로운 워크 큐 만들기
___구식 태스크 큐 방식
___어떤 후반부 처리 방식을 사용할 것인가?
___후반부 처리 작업 사이의 락
___후반부 처리 비활성화
___결론
9장 커널 동기화 개요
___위험 지역과 경쟁 조건
___왜 보호 장치가 필요한가?
___단일 변수
___락
___동시성의 원인
___보호 대상 인식
___데드락
___경쟁과 확장성
___결론
10장 커널 동기화 방법
___원자적 동작
___원자적 정수 연산
___64비트 원자적 연산
___원자적 비트 연산
___스핀락
___스핀락 사용 방법
___그 밖의 스핀락 함수
___스핀락과 후반부 처리
___리더?라이터 스핀락
___세마포어
___카운팅 세마포어와 바이너리 세마포어
___세마포어 생성과 초기화
___세마포어
___리더-라이터 세마포어
___뮤텍스(mutex)
___세마포어와 뮤텍스
___스핀락과 뮤텍스
___완료 변수
___큰 커널 락
___순차적 락
___선점 비활성화
___순차성(ordering)과 배리어(barrier)
___결론
11장 타이머와 시간 관리
___커널의 시간의 개념
___진동수: HZ
___이상적인 HZ 값
___큰 HZ 값의 장점
___큰 HZ 값의 단점
___지피(jiffies)
___지피의 내부 표현
___지피 값 되돌아감
___사용자 공간과 HZ 값
___하드웨어 시계와 타이머
___실시간 시계
___시스템 타이머
___타이머 인터럽트 핸들러
___날짜와 시간
___타이머
___타이머 사용
___타이머 경쟁 조건
___타이머 구현
___실행 지연
___루프 반복
___작은 지연
___schedule_timeout()
___schedule_timeout() 구현
___만료시간을 가지고 대기열에서 휴면
___결론
12장 메모리 관리
___페이지
___구역
___페이지 얻기
___0으로 채워진 페이지 얻기
___페이지 반환
___kmalloc()
___gfp_mask 플래그
___동작 지정자
___구역 지정자
___형식 플래그
___kfree()
___vmalloc()
___슬랩 계층
___슬랩 계층 설계
___슬랩 할당자 인터페이스
___캐시에서 할당
___슬랩 할당자 사용 예제
___스택에 정적으로 할당
___단일 페이지 커널 스택
___공정하게 스택 사용
___상위 메모리 연결
___고정 연결
___임시 연결
___CPU별 할당
___새로운 percpu 인터페이스
___컴파일 시점의 CPU별 데이터
___실행 시점의 CPU별 데이터
___CPU별 데이터를 사용하는 이유
___할당 방법 선택
___결론
13장 가상 파일시스템
___일반 파일시스템 인터페이스
___파일시스템 추상화 계층
___유닉스 파일시스템
___VFS 객체와 자료 구조
___슈퍼블록 객체
___슈퍼블록 동작
___아이노드 객체
___아이노드 동작
___덴트리 객체
___덴트리 상태___
___덴트리 캐시
___덴트리 동작
___파일 객체
___파일 동작
___파일시스템 관련 자료 구조
___프로세스 관련 자료구조
___결론
14장 블록 입출력 계층
___블록 장치 구조
___버퍼와 버퍼 헤드
___bio 구조체
___입출력 벡터
___신구 버전 비교
___요청 큐
___입출력 스케줄러
___입출력 스케줄러가 하는 일
___리누스 엘리베이터
___데드라인 입출력 스케줄러
___예측 입출력 스케줄러
___완전 공정 큐 입출력 스케줄러
___무동작 입출력 스케줄러
___입출력 스케줄러 선택
___결론
15장 프로세스 주소 공간
___주소 공간
___메모리 서술자
___메모리 서술자 할당
___메모리 서술자 해제
___mm_struct 구조체와 커널 스레드
___가상 메모리 영역
___VMA 플래그
___VMA 동작
___메모리 영역 리스트와 트리
___실제 메모리 영역
___메모리 영역 다루기
___find_vma()
___find_vma_prev()
___find_vma_intersection()
___mmap()와 do_mmap(): 주소 범위 생성
___munmap()와 do_munmap(): 주소 범위 해제
___페이지 테이블
___결론
16장 페이지 캐시와 페이지 지연 기록
___캐시 사용 방식
___쓰기 캐시
___캐시 축출
___가장 오래 전에 사용한 항목 제거
___이중 리스트 전략
___리눅스 페이지 캐시
___address_space 객체
___address_space 동작
___기수 트리
___구식 페이지 해시 테이블
___버퍼 캐시
___플러시 스레드
___랩탑 모드
___역사: bdflush, kupdated, pdflush
___다중 스레드 환경의 경쟁 상태 회피
___결론
17장 장치와 모듈
___장치 유형
___모듈
___Hello, World!
___모듈 만들기
___소스 트리에 들어 있는 경우
___소스 트리 외부에 있는 경우
___모듈 설치
___모듈 의존성 생성
___모듈 적재
___설정 옵션 관리
___모듈 인자
___노출 심볼exported symbols
___장치 모델
___Kobjects
___Ktypes
___Ksets___
___kobject, ktype, kset의 상관 관계
___kobject 관리와 변경
___참조 횟수
___참조 횟수 증감
___krefs
___sysfs
___sysfs에 kobject 추가와 제거
___sysfs에 파일 추가
___기본 속성
___새로운 속성 만들기
___속성 제거
___sysfs 관례
___커널 이벤트 계층
___결론
18장 디버깅
___시작하기
___커널 버그
___출력을 이용한 디버깅
___견고함
___로그수준
___로그 버퍼
___syslogd와 klogd
___printf()와 printk() 사용 혼동
___웁스
___ksymoops
___kallsyms
___커널 디버깅 옵션
___버그 확인과 정보 추출
___만능 SysRq 키
___커널 디버거의 전설
___gdb
___kgdb
___시스템 찔러 보기와 조사
___조건에 따른 UID 사용
___조건 변수
___통계
___디버깅 작업의 빈도와 발생 제한
___문제를 일으킨 변경 사항을 찾기 위한 이진 탐색
___Git을 사용한 이진 탐색
___모든 방법이 실패했을 때: 공동체
___결론
19장 이식성
___이식성 있는 운영체제
___리눅스 이식성의 역사
___워드 크기와 데이터 형
___불투명 데이터 형
___특수 데이터 형
___명시적으로 크기가 정해진 데이터 형
___문자 데이터 형의 부호유무
___데이터 정렬
___정렬 문제 피하기
___비표준 데이터 형의 정렬
___구조체 채우기
___바이트 순서
___시간
___페이지 크기
___프로세서 순서
___SMP, 커널 선점, 상위 메모리
___결론
20장 패치, 해킹, 공동체
___공동체
___리눅스 코딩 스타일
___들여쓰기
___switch 구문
___공백
___괄호
___줄 길이
___명명 방식
___함수
___주석
___형 지정
___기존 함수 사용
___소스에서 ifdef 사용 최소화
___구조체 초기화
___과거에 작성한 코드 소급 적용
___지휘 계통
___버그 리포트 제출
___패치
___패치 만들기
___Git을 사용해 패치 생성
___패치 제출
___결론