리눅스 커널 심층분석 (개정판 3 판)

리눅스 커널 심층분석 (개정판 3 판)

$35.00
Description
핵심 커널 시스템의 동작 방법과 그 설계 및 구현을 다룬 리눅스 커널 입문서!
《에이콘 임베디드 시스템프로그래밍》제39권『리눅스 커널 심층분석』. 이 책은 리눅스 커널의 핵심을 간결하면서도 심도있게 다루고 있다. 일반적인 운영체제에 대한 이해를 넘어, 여타 유닉스 시스템과 다른 리눅스만의 특징적인 부분에 대한 설계, 구현, 인터페이스 등을 이론과 실제 사이에서 균형감 있게 소개한다. 운영체제의 기본적인 기능인 프로세스 관리, 시스템 호출, 인터럽트 처리, 동기화, 메모리 관리, 파일 시스템, 이식성에 대한 내용 뿐 아니라, 최신 2.6 커널의 흥미로운 부분인 CFS 스케줄러, 커널 선점, 블럭 입출력 계층, 입출력 스케줄러 등의 내용을 상세히 다루었다.
저자

로버트러브

저자로버트러브(RovertLove)는오픈소스개발자,강연자,저자로15년이상리눅스를사용하면서리눅스발전에기여했다.로버트는현재구글의선임소프트웨어엔지니어로일하며,안드로이드모바일플랫폼을개발한팀에속해있다.구글이전에는노벨(Novell)사에서리눅스데스크탑책임설계자를맡았다.노벨사이전에는몬타비스타소프트웨어(MontaVistaSoftware)와지미안(Ximian)에서커널엔지니어로일했다.로버트는선점형커널,프로세스스케줄러,커널이벤트계층,inotify,가상메모리개선,디바이스드라이버개발등의커널프로젝트에참가했다.로버트는리눅스커널에대해수많은강연을했으며,리눅스커널에대한글도여러편썼다.〈리눅스저널(LinuxJournal)〉의편집기자이기도한로버트의다른책으로는『LinuxSystemProgramming』,『LinuxinaNutshell』등이있다.로버트는플로리다대학에서수학학사와전산학사학위를받았으며,현재보스턴에서살고있다.

목차

1장리눅스커널입문
___유닉스의역사
___리눅스의개발
___운영체제와커널
___리눅스커널과전통적인유닉스커널
___리눅스커널버전
___리눅스커널개발공동체
___시작하기전에

2장커널과의첫만남
___커널소스구하기
___Git사용하기
___커널소스설치
___패치
___커널소스트리
___커널빌드
___커널설정
___빌드메시지최소화
___빌드작업을동시에여러개실행
___새커널설치
___다른성질의야수
___libc와표준헤더파일을사용할수없음
___GNUC
___인라인함수
___인라인어셈블리
___분기구문표시
___메모리보호없음
___부동소수점을(쉽게)사용할수없음
___작은고정크기의스택
___동기화와동시성
___이식성의중요성
___결론

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장후반부처리와지연된작업
___후반부처리bottomhalf
___왜후반부처리를하는가?
___후반부처리의세계
___원래의‘후반부처리’
___태스크큐
___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구조체
___입출력벡터
___신구버전비교
___요청큐
___입출력스케줄러
___입출력스케줄러가하는일
___리누스엘리베이터
___데드라인입출력스케줄러
___예측입출력스케줄러
___완전공정큐입출력스케줄러
___무동작입출력스케줄러
___입출력스케줄러선택<

출판사 서평

이책은리눅스커널의핵심을간결하면서도심도있게다루고있다.일반적인운영체제에대한이해를넘어,여타유닉스시스템과다른리눅스만의특징적인부분에대한설계,구현,인터페이스등을이론과실제사이에서균형감있게소개한다.구체적으로운영체제의기본적인기능인프로세스관리,시스템호출,인터럽트처리,동기화,메모리관리,파일시스템,이식성에대한내용뿐아니라,최신2.6커널의흥미로운부분인CFS스케줄러,커널선점,블럭입출력계층,입출력스케줄러등의내용을상세히다룬다.

이책은커널코드를개발하고작성하는사람뿐아니라,운영체제에대한이해를높여좀더효율적이고생산적인코드를작성하고자하는개발자에게도움이되도록,리눅스커널설계와구현에대해자세히다룬다.

이책에서는리눅스커널의설계,구현,인터페이스를비롯한커널의주요하부시스템및기능에대해자세히다룬다.리눅스커널에대한실용적인관점과이론적인관점을모두제공하는이책은다양한관심과필요성을가진독자들의흥미를끌것이다.

핵심커널개발자이기도한저자는2.6커널에대한소중한지식과경험을나누고자한다.구체적으로프로세스관리,스케줄링,시간관리및타이머,시스템호출인터페이스,메모리접근,메모리관리,페이지캐시,VFS,커널동기화,이식성문제,디버깅기법등을다룬다.이책에서는2.6커널의가장흥미로운기능인CFS스케줄러,선점커널,블럭입출력계층,입출력스케줄러등의내용도다룬다.

★개정3판에서달라진내용★

■커널자료구조를별도장으로새로추가
■인터럽트핸들러와후반부처리에대한자세한내용
■커널동기화및잠금에대한깊이있는설명
■가상메모리와메모리할당에대한설명보강
■리눅스커널디버깅시도움이되는기법
■커널패치를제출할때유용한노하우와리눅스커널공동체와함께일하는방법

★이책의대상독자★

이책은리눅스커널을이해하고자하는소프트웨어개발자를대상으로쓰여졌다.이책은커널소스를줄단위로설명하는해설서가아니다.또한드라이버개발을위한가이드도,커널API참고도서도아니다.이책의목적은리눅스커널의설계와구현에대한충분한정보를제공하여,프로그래머가커널코드개발을시작할수있게해주는것이다.커널개발은재미있고보람찬일이므로,나는독자를가능한한순조롭게이세상으로이끌고자한다.이책은학구적인독자와실용적인독자모두를만족시키기위해이론과응용모두를다룬다.나는항상응용을이해하려면이론부터이해해야한다고생각하지만,이책에서는둘사이의균형을맞추려고노력했다.여러분이리눅스커널을공부하려는동기가무엇이든,이책의커널설계와구현에대한설명이여러분의필요를충분히만족시킬수있기를바란다.

이책은핵심커널시스템의동작방법과그설계및구현을모두다룬다.중요한부분이므로잠시설명하고넘어가자.좋은예가바로후반부처리(bottomhalf)를이용하는장치드라이버구성요소를다루는8장’후반부처리와지연된작업’이다.이장에서는(핵심커널개발자나학구적인독자가관심을가질만한)커널후반부처리의설계와구현에대해서다루고,(장치드라이버개발자나통상적인해커가흥미를느낄만한)커널이제공하는인터페이스를이용해실제후반부처리를구현하는방법에대해서도다룬다.양측모두두가지측면의논의가필수적이라는사실을알수있을것이다.커널의내부작동방식을확실히알고있어야하는핵심커널개발자는인터페이스가실제사용되는방식에대해서도잘알고있어야한다.그와동시에,장치드라이버개발자역시인터페이스너머의내부구현에대해이해함으로써드라이버개발작업에도움을받을수있다.

이는라이브러리의API를배우는것과라이브러리의실제구현을공부하는것의관계와비슷하다.언뜻보기에애플리케이션개발자는API만알면될것같다.사실인터페이스를블랙박스처럼다루어야한다고배우는경우가많다.마찬가지로라이브러리개발자는라이브러리설계와구현에대해서만신경쓴다.하지만나는양자모두가서로반대편사정을이해하기위해노력해야한다고생각한다.하부운영체제를잘이해하는애플리케이션개발자는운영체제를훨씬더잘활용할수있다.마찬가지로라이브러리개발자는라이브러리를이용하는애플리케이션이처한현실과실제상황을외면해서는안된다.따라서이책이양쪽사람들에게유용하기를바랄뿐아니라,책내용전체가양측에도움이되기를바라는마음으로커널서브시스템의설계와구현모두를설명할것이다.

나는독자들이C프로그래밍에대해알고있으며,리눅스에익숙하다고가정했다.운영체제설계나다른전산분야의개념에대한경험이있으면도움이되겠지만,이런개념들에대해최대한많이설명하려고노력했다.부족하다면,운영체제설계에대한훌륭한책이포함된참고문헌항목을살펴보라.

이책은학부수준의운영체제설계과목에서이론을다루는입문서와함께응용분야의보조교과서로활용하기에적합하다.또한이책은별도의교재없이고급학부과목이나대학원수준의과목에서도사용할수있다.

★추천의글★

리눅스커널과커널애플리케이션사용이늘어남에따라리눅스개발과유지보수에참여하려는시스템소프트웨어개발자도점점늘어는추세다.이들중에는순전히개인적인관심으로리눅스개발에참여하는사람도있고,리눅스기업또는하드웨어제조사에서일하기때문에혹은기업내에서개발프로젝트를하기때문에참여하는사람도있다.

하지만이들은모두공통된문제에부딪힌다.커널을배우는데걸리는시간이더길어지고,어려워지고있다는점이다.시스템은매우크고,더욱더복잡해지고있다.시간이지날수록지금커널을개발하는개발자들은커널에대해더욱깊고넓은지식을쌓을수있겠지만,새로참여하는사람과의격차는더벌어질수밖에없다.

나는이렇게커널소스에대한접근이점점어려워지는현실이커널의품질(quality)에이미문제를일으키고있으며,이문제는시간이지남에따라더심해질것이라고생각한다.리눅스의앞날을걱정하는사람이라면커널개발에참여할수있는개발자들의수를늘리는일에도반드시관심을기울여야한다.

이문제를해결하는방법중하나는깔끔한코드를유지하는것이다.이해하기쉬운인터페이스,일관성있는레이아웃,‘한번에한가지만,제대로한다’등과같은원칙을지키는일이다.이것이리누스토발즈가선택한방법이다.
내가추천하는또한가지방법은코드에많은주석을다는것이다.주석은코드를읽는사람이개발자가개발당시무엇을얻고자했는지이해할수있을만큼충분해야한다.의도와구현의차이를파악하는과정이바로디버깅이다.의도를알수없다면디버깅은어려운일이된다.

하지만주석만으로는주요서브시스템이어떤일을해야하는지전체를살펴볼수있는시각과개발자들이그목적을달성하려고어떤방법을사용했는지에대한정보를얻을수없다.따라서커널을이해하기위한출발점으로는가장필요한것은잘작성된문서다.

로버트러브(RobertLove)가쓴이책은숙련된개발자만이알수있는커널서브시스템에대한본질적인이해와,이를구현하려고개발자들이어떤일들을했는지에대해알려준다.따라서이책은호기심에커널을공부하려는사람들뿐아니라,애플리케이션개발자,커널설계를분석하려는사람등많은사람에게충분한지식을제공해줄수있다.

또한,이책은커널개발자가뚜렷한목적을가지고커널을수정할수있는다음단계로나아가는데도도움을준다.나는이런개발자들에게많은시도를해볼것을권한다.커널의특정부분을이해하는가장좋은방법은그부분을변경해보는것이다.커널을직접수정해보면코드를읽기만할때는볼수없었던많은것들을이해할수있다.더적극적인커널개발자라면개발자메일링리스트에가입해다른개발자들과의견을나눠보는것도좋다.이방식이바로그동안커널개발에기여한사람들이커널을배웠던,그리고계속배우고있는방법이기도하다.로버트의책은커널개발의중요한부분인이런체계와문화에대해서도다룬다.

로버트의책을즐기고,또많은것을배울수있기를바란다.또여러분중많은사람이한발더나아가커널개발공동체의일원이되기를진심으로바란다.우리는사람을공헌도에따라평가한다.여러분이무언가리눅스에기여하게되었을때여러분의작업으로얻어진지식도수억아니,수십억의인류에게작지만즉각적인도움을주었다고평가받을수있을것이다.이것은우리에게주어진아주유익한특권이면서책임이기도하다.

-앤드류모튼(AndrewMorton)

★저자서문★

리눅스커널에대한나의경험을책으로펴내리라고처음결정했을때솔직히어떻게해야할지를몰랐다.무엇이내책을이분야의가장좋은책으로만들어줄것인가?나는어떻게하면이책이특별한책이될수있을까에대해고심했다.

결국커널에대해아주특별한접근방법을생각해낼수있었다.내일은커널을해킹하는것이다.내취미도커널을해킹하는것이다.내가사랑하는것도커널을해킹하는것이다.수년간이렇게지내오면서,나는재미있는일화와중요한기법들을모아두었다.내경험을통해나는어떻게커널을해킹하는지(그리고그에못지않게중요한)어떻게해야커널을망가뜨리지않을지에대한책을펴낼수있었다.이책의주요주제는물론리눅스커널의설계와구현이다.하지만다른책들과달리이책은실제일에도움이되는,그리고일을올바르게할수있는방법을배우는데중점을두고있다.나는실용엔지니어이고이책또한실용서적이다.이책은재미있고읽기쉬우며유용할것이다.

나는독자가이책을통해(기록된또한기록되지않은)리눅스커널의규칙을잘이해하게되기를바란다.그리고여러분이이책과커널소스를읽은다음유용하고,제대로동작하며,깔끔하게구현된커널소스를작성할수있기를기대한다.물론재미삼아읽는것도좋다.

여기까지는1판에대한이야기였다.시간이흘렀고,다시한번도전의시간이돌아왔다.이번개정3판은1판과2판에비해많은것이바뀌었다.많은부분이개선되고수정되었으며,새로운내용도많이추가되었다.이번판은2판이후커널변화를반영했다.중요한사실은리눅스커널공동체가2.7커널개발을빠른시일내에진행하지않을것임을선언한것이다.대신커널개발자들은2.6커널개발및안정화작업을계속하기로했다.이결정은많은것을시사하는데,그중이책과관련해중요한부분은바로최근에나와있는2.6커널에대한책이한동안계속그유용함을유지할수있다는것이다.리눅스커널이성숙단계에접어듦에따라,

앞으로도존속할커널의내용에대해공부하는것은더욱의미있는일이되었다.이책은리눅스커널의역사를이해함과동시에미래를준비하는관점에서커널에대해서술함으로써리눅스커널에대한교과서적인책이되기를기대한다.

★옮긴이의말★

잡지부록으로딸려온알짜리눅스배포본을가지고사용하던PC에리눅스를처음설치해본때가아련히떠오릅니다.그후제법많은시간이흘렀습니다.그사이리눅스는수많은개발자들의자발적인노력을통해진화를거듭해그영역을넓혀왔습니다.대부분의인터넷서비스가리눅스서버로운영되고있으며,슈퍼컴퓨터에서손안의스마트폰까지컴퓨터가관련된곳에서리눅스가쓰이지않는분야를찾기가더어렵습니다.제가그동안해온일들도리눅스를떼어놓고는생각할수없습니다.

2011년7월,리눅스의창시자인리누스토발즈는리눅스출시20주년을기념해리눅스의버전3.0을선언합니다.특별히주목할만한큰변경사항이없었음에도주버전을바꾼이유에대해리누스는버전숫자가너무커져서(2.6버전은2.6.39까지있습니다.)불편해서라고밝히기도했습니다.그도틀린말은아니었겠지만,한편으로는2.6버전의안정적인집권이장기간이어짐에따라,이제는리눅스커널완성도에대한자신감의표현으로보는것도타당할것입니다.아직현장에서는2.6버전을사용한리눅스배포판이많이쓰이고,지원도지속되고있습니다.그렇기때문에,커널버전2.6.34를주대상으로삼은이책의내용은3.0버전으로바